qwirk 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. data/History.md +7 -0
  2. data/LICENSE.txt +201 -0
  3. data/README.md +180 -0
  4. data/Rakefile +34 -0
  5. data/examples/README +1 -0
  6. data/examples/activemq.xml +84 -0
  7. data/examples/advanced_requestor/README.md +15 -0
  8. data/examples/advanced_requestor/base_request_worker.rb +18 -0
  9. data/examples/advanced_requestor/char_count_worker.rb +16 -0
  10. data/examples/advanced_requestor/config.ru +24 -0
  11. data/examples/advanced_requestor/exception_raiser_worker.rb +17 -0
  12. data/examples/advanced_requestor/length_worker.rb +14 -0
  13. data/examples/advanced_requestor/print_worker.rb +14 -0
  14. data/examples/advanced_requestor/publisher.rb +49 -0
  15. data/examples/advanced_requestor/qwirk.yml +16 -0
  16. data/examples/advanced_requestor/reverse_worker.rb +14 -0
  17. data/examples/advanced_requestor/triple_worker.rb +14 -0
  18. data/examples/batch/my_batch_worker.rb +30 -0
  19. data/examples/batch/my_line_worker.rb +8 -0
  20. data/examples/qwirk.yml +20 -0
  21. data/examples/requestor/README.md +13 -0
  22. data/examples/requestor/config.ru +13 -0
  23. data/examples/requestor/qwirk_persist.yml +5 -0
  24. data/examples/requestor/requestor.rb +68 -0
  25. data/examples/requestor/reverse_echo_worker.rb +15 -0
  26. data/examples/setup.rb +13 -0
  27. data/examples/shared/README.md +24 -0
  28. data/examples/shared/config.ru +13 -0
  29. data/examples/shared/publisher.rb +49 -0
  30. data/examples/shared/qwirk_persist.yml +5 -0
  31. data/examples/shared/shared_worker.rb +16 -0
  32. data/examples/simple/README +53 -0
  33. data/examples/simple/bar_worker.rb +10 -0
  34. data/examples/simple/baz_worker.rb +10 -0
  35. data/examples/simple/config.ru +14 -0
  36. data/examples/simple/publisher.rb +49 -0
  37. data/examples/simple/qwirk_persist.yml +4 -0
  38. data/examples/simple/tmp/kahadb/db-1.log +0 -0
  39. data/examples/simple/tmp/kahadb/db.data +0 -0
  40. data/examples/simple/tmp/kahadb/db.redo +0 -0
  41. data/examples/task/README +47 -0
  42. data/examples/task/config.ru +14 -0
  43. data/examples/task/foo_worker.rb +10 -0
  44. data/examples/task/messages.out +1000 -0
  45. data/examples/task/publisher.rb +25 -0
  46. data/examples/task/qwirk_persist.yml +5 -0
  47. data/examples/task/task.rb +36 -0
  48. data/lib/qwirk.rb +63 -0
  49. data/lib/qwirk/adapter.rb +45 -0
  50. data/lib/qwirk/base_worker.rb +96 -0
  51. data/lib/qwirk/batch.rb +4 -0
  52. data/lib/qwirk/batch/acquire_file_strategy.rb +47 -0
  53. data/lib/qwirk/batch/active_record.rb +3 -0
  54. data/lib/qwirk/batch/active_record/batch_job.rb +111 -0
  55. data/lib/qwirk/batch/active_record/failed_record.rb +5 -0
  56. data/lib/qwirk/batch/active_record/outstanding_record.rb +6 -0
  57. data/lib/qwirk/batch/file_status_strategy.rb +86 -0
  58. data/lib/qwirk/batch/file_worker.rb +228 -0
  59. data/lib/qwirk/batch/job_status.rb +29 -0
  60. data/lib/qwirk/batch/parse_file_strategy.rb +48 -0
  61. data/lib/qwirk/engine.rb +9 -0
  62. data/lib/qwirk/loggable.rb +23 -0
  63. data/lib/qwirk/manager.rb +140 -0
  64. data/lib/qwirk/marshal_strategy.rb +74 -0
  65. data/lib/qwirk/marshal_strategy/bson.rb +37 -0
  66. data/lib/qwirk/marshal_strategy/json.rb +37 -0
  67. data/lib/qwirk/marshal_strategy/none.rb +26 -0
  68. data/lib/qwirk/marshal_strategy/ruby.rb +26 -0
  69. data/lib/qwirk/marshal_strategy/string.rb +25 -0
  70. data/lib/qwirk/marshal_strategy/yaml.rb +25 -0
  71. data/lib/qwirk/publish_handle.rb +170 -0
  72. data/lib/qwirk/publisher.rb +67 -0
  73. data/lib/qwirk/queue_adapter.rb +3 -0
  74. data/lib/qwirk/queue_adapter/active_mq.rb +13 -0
  75. data/lib/qwirk/queue_adapter/active_mq/publisher.rb +12 -0
  76. data/lib/qwirk/queue_adapter/active_mq/worker_config.rb +16 -0
  77. data/lib/qwirk/queue_adapter/in_mem.rb +7 -0
  78. data/lib/qwirk/queue_adapter/in_mem/factory.rb +45 -0
  79. data/lib/qwirk/queue_adapter/in_mem/publisher.rb +98 -0
  80. data/lib/qwirk/queue_adapter/in_mem/queue.rb +88 -0
  81. data/lib/qwirk/queue_adapter/in_mem/reply_queue.rb +56 -0
  82. data/lib/qwirk/queue_adapter/in_mem/topic.rb +48 -0
  83. data/lib/qwirk/queue_adapter/in_mem/worker.rb +63 -0
  84. data/lib/qwirk/queue_adapter/in_mem/worker_config.rb +59 -0
  85. data/lib/qwirk/queue_adapter/jms.rb +50 -0
  86. data/lib/qwirk/queue_adapter/jms/connection.rb +42 -0
  87. data/lib/qwirk/queue_adapter/jms/consumer.rb +37 -0
  88. data/lib/qwirk/queue_adapter/jms/publisher.rb +126 -0
  89. data/lib/qwirk/queue_adapter/jms/worker.rb +89 -0
  90. data/lib/qwirk/queue_adapter/jms/worker_config.rb +38 -0
  91. data/lib/qwirk/remote_exception.rb +42 -0
  92. data/lib/qwirk/request_worker.rb +62 -0
  93. data/lib/qwirk/task.rb +177 -0
  94. data/lib/qwirk/task.rb.sav +194 -0
  95. data/lib/qwirk/version.rb +3 -0
  96. data/lib/qwirk/worker.rb +222 -0
  97. data/lib/qwirk/worker_config.rb +187 -0
  98. data/lib/rails/generators/qwirk/qwirk_generator.rb +82 -0
  99. data/lib/rails/generators/qwirk/templates/initializer.rb +6 -0
  100. data/lib/rails/generators/qwirk/templates/migration.rb +9 -0
  101. data/lib/rails/generators/qwirk/templates/schema.rb +28 -0
  102. data/lib/rails/railties/tasks.rake +8 -0
  103. data/lib/tasks/qwirk_tasks.rake +4 -0
  104. data/test/base_test.rb +248 -0
  105. data/test/database.yml +14 -0
  106. data/test/dummy/Rakefile +7 -0
  107. data/test/dummy/app/controllers/application_controller.rb +3 -0
  108. data/test/dummy/app/helpers/application_helper.rb +2 -0
  109. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  110. data/test/dummy/config.ru +4 -0
  111. data/test/dummy/config/application.rb +45 -0
  112. data/test/dummy/config/boot.rb +10 -0
  113. data/test/dummy/config/database.yml +22 -0
  114. data/test/dummy/config/environment.rb +5 -0
  115. data/test/dummy/config/environments/development.rb +26 -0
  116. data/test/dummy/config/environments/production.rb +49 -0
  117. data/test/dummy/config/environments/test.rb +35 -0
  118. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  119. data/test/dummy/config/initializers/inflections.rb +10 -0
  120. data/test/dummy/config/initializers/mime_types.rb +5 -0
  121. data/test/dummy/config/initializers/secret_token.rb +7 -0
  122. data/test/dummy/config/initializers/session_store.rb +8 -0
  123. data/test/dummy/config/locales/en.yml +5 -0
  124. data/test/dummy/config/routes.rb +58 -0
  125. data/test/dummy/log/development.log +0 -0
  126. data/test/dummy/log/production.log +0 -0
  127. data/test/dummy/log/server.log +0 -0
  128. data/test/dummy/log/test.log +0 -0
  129. data/test/dummy/public/404.html +26 -0
  130. data/test/dummy/public/422.html +26 -0
  131. data/test/dummy/public/500.html +26 -0
  132. data/test/dummy/public/favicon.ico +0 -0
  133. data/test/dummy/public/javascripts/application.js +2 -0
  134. data/test/dummy/public/javascripts/controls.js +965 -0
  135. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  136. data/test/dummy/public/javascripts/effects.js +1123 -0
  137. data/test/dummy/public/javascripts/prototype.js +6001 -0
  138. data/test/dummy/public/javascripts/rails.js +191 -0
  139. data/test/dummy/script/rails +6 -0
  140. data/test/integration/navigation_test.rb +7 -0
  141. data/test/jms.yml +9 -0
  142. data/test/jms_fail_test.rb +149 -0
  143. data/test/jms_requestor_block_test.rb +278 -0
  144. data/test/jms_requestor_test.rb +238 -0
  145. data/test/jms_test.rb +287 -0
  146. data/test/marshal_strategy_test.rb +62 -0
  147. data/test/support/integration_case.rb +5 -0
  148. data/test/test_helper.rb +7 -0
  149. data/test/test_helper.rbold +22 -0
  150. data/test/test_helper_active_record.rb +61 -0
  151. data/test/unit/qwirk/batch/acquire_file_strategy_test.rb +101 -0
  152. data/test/unit/qwirk/batch/active_record/batch_job_test.rb +35 -0
  153. data/test/unit/qwirk/batch/parse_file_strategy_test.rb +49 -0
  154. metadata +366 -0
@@ -0,0 +1,13 @@
1
+ require '../setup'
2
+ require './shared_worker'
3
+ require './publisher'
4
+
5
+ # If we're not starting up a standalone publisher, then start up a manager
6
+ if ENV['RACK_ENV'] != 'publisher'
7
+ manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
8
+ at_exit { manager.stop }
9
+ end
10
+ if ENV['RACK_ENV'] != 'worker'
11
+ Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
12
+ end
13
+ run Rumx::Server
@@ -0,0 +1,49 @@
1
+ require 'rumx'
2
+ require 'qwirk'
3
+
4
+ class Publisher
5
+ include Rumx::Bean
6
+
7
+ bean_attr_accessor :s1_count, :integer, 'Number of S1 messages sent'
8
+ bean_attr_accessor :s2_count, :integer, 'Number of S2 messages sent'
9
+
10
+ bean_operation :send_s1, :void, 'Send messages to the S1 worker', [
11
+ [ :count, :integer, 'Count of messages', 10 ],
12
+ [ :message, :string, 'String portion of the message to send', 'Message for Bar' ],
13
+ [ :sleep_time, :float, 'Time to sleep between messages', 0.2 ]
14
+ ]
15
+
16
+ bean_operation :send_s2, :void, 'Send messages to the S2 worker', [
17
+ [ :count, :integer, 'Count of messages', 5 ],
18
+ [ :message, :string, 'String portion of the message to send', 'Message for Baz' ],
19
+ [ :sleep_time, :float, 'Time to sleep between messages', 0.5 ]
20
+ ]
21
+
22
+
23
+ def initialize(adapter_key)
24
+ @s1_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'S1', :marshal => :bson)
25
+ @s2_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'S2', :marshal => :string)
26
+ @s1_count = 0
27
+ @s2_count = 0
28
+ end
29
+
30
+ def send_s1(count, message, sleep_time)
31
+ count.times do
32
+ @s1_count += 1
33
+ obj = {'count' => @s1_count, 'message' => message}
34
+ puts "Publishing to S1 object: #{obj.inspect}"
35
+ @s1_publisher.publish(obj)
36
+ sleep sleep_time
37
+ end
38
+ end
39
+
40
+ def send_s2(count, message, sleep_time)
41
+ count.times do
42
+ @s2_count += 1
43
+ obj = "#{@s2_count}: #{message}"
44
+ puts "Publishing to S2 object: #{obj}"
45
+ @s2_publisher.publish(obj)
46
+ sleep sleep_time
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ ---
2
+ S1:
3
+ :min_count: 1
4
+ S2:
5
+ :min_count: 1
@@ -0,0 +1,16 @@
1
+ class SharedWorker
2
+ include Qwirk::Worker
3
+
4
+ config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
+ config_reader :message, :string, 'Message'
6
+
7
+ define_configs(
8
+ 'S1' => {:message => "I'm S1", :sleep_time => 10},
9
+ 'S2' => {:message => "I'm S2"}
10
+ )
11
+
12
+ def perform(obj)
13
+ puts "#{self}: Received #{obj.inspect} at #{Time.now}"
14
+ sleep config.sleep_time
15
+ end
16
+ end
@@ -0,0 +1,53 @@
1
+ Step 0
2
+ # Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
+
4
+ Step 1
5
+ # Start up the application
6
+ rm -f qwirk_persist.yml
7
+ rackup -p 4567
8
+ or for ActiveMQ
9
+ QWIRK_ADAPTER=active_mq rackup -p 4567
10
+
11
+
12
+ Step 2
13
+ # Browse to http://localhost:4567
14
+ # Open up the tree to Worker => Bar => Attributes and click on Attributes
15
+ # Change max_count to 100, idle_worker_timeout to 10, and sleep_time to 5 and click Update.
16
+
17
+ Step 3
18
+ # Open the tree to Publisher => Operations => send_bar and click on send_bar
19
+ # Set count to 1000 and sleep_time to 0.2 and click Execute.
20
+ # Click back on Worker => Bar => Attributes and continue clicking every few seconds while
21
+ messages are still being published. For the InMem adapter, workers will continue
22
+ to increase while there are still messages in the queue. For the ActiveMQ adapter,
23
+ the messages get cached on the consumer side so after the the publishing is complete,
24
+ many of the workers will drop off while the remaining ones that have cached messages
25
+ will continue.
26
+
27
+ Step 4
28
+ # cntl-c the rackup process and start it back up. It should come back with
29
+ the workers and the config values that have been configured via the browser.
30
+
31
+
32
+ Things to try:
33
+
34
+
35
+ Expanding / Contracting workers
36
+
37
+ Note that after you set a max_count and before you publish, the count of workers will be
38
+ 1 as their is just a single worker waiting for data on the queue. Once you publish messages,
39
+ the count of workers will grow as needed to handle the message volume up to max_count.
40
+
41
+ If you set a value for idle_worker_timeout then the count of workers will go down when there
42
+ is no work to be done. Set a timeout and refresh the attributes to see this in action.
43
+
44
+
45
+ Monitoring your workers
46
+
47
+ Browse to http://localhost:4567/Worker/Bar/timer/attributes.json?reset=true
48
+
49
+ Publish some messages (possibly modifying the worker's sleep times first) and browse to that address again.
50
+
51
+ If you use a monitoring tool such as munin, nagios, hyperic, etc., you could poll this url periodically to create
52
+ a graph or alert for your system. For easy creation of munin graphs and alert withe this framework, see
53
+ https://github.com/ClarityServices/ruminate
@@ -0,0 +1,10 @@
1
+ class BarWorker
2
+ include Qwirk::Worker
3
+
4
+ config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
+
6
+ def perform(obj)
7
+ puts "#{self}: Received #{obj.inspect} at #{Time.now}"
8
+ sleep config.sleep_time
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class BazWorker
2
+ include Qwirk::Worker
3
+
4
+ config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 10
5
+
6
+ def perform(obj)
7
+ puts "#{self}: Received #{obj} at #{Time.now}"
8
+ sleep config.sleep_time
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ require '../setup'
2
+ require './bar_worker'
3
+ require './baz_worker'
4
+ require './publisher'
5
+
6
+ # If we're not starting up a standalone publisher, then start up a manager
7
+ if ENV['RACK_ENV'] != 'publisher'
8
+ manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
9
+ at_exit { manager.stop }
10
+ end
11
+ if ENV['RACK_ENV'] != 'worker'
12
+ Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
13
+ end
14
+ run Rumx::Server
@@ -0,0 +1,49 @@
1
+ require 'rumx'
2
+ require 'qwirk'
3
+
4
+ class Publisher
5
+ include Rumx::Bean
6
+
7
+ bean_attr_accessor :bar_count, :integer, 'Number of Bar messages sent'
8
+ bean_attr_accessor :baz_count, :integer, 'Number of Baz messages sent'
9
+
10
+ bean_operation :send_bar, :void, 'Send messages to the Bar worker', [
11
+ [ :count, :integer, 'Count of messages', 10 ],
12
+ [ :message, :string, 'String portion of the message to send', 'Message for Bar' ],
13
+ [ :sleep_time, :float, 'Time to sleep between messages', 0.2 ]
14
+ ]
15
+
16
+ bean_operation :send_baz, :void, 'Send messages to the Baz worker', [
17
+ [ :count, :integer, 'Count of messages', 5 ],
18
+ [ :message, :string, 'String portion of the message to send', 'Message for Baz' ],
19
+ [ :sleep_time, :float, 'Time to sleep between messages', 0.5 ]
20
+ ]
21
+
22
+ def initialize(adapter_key)
23
+ @bar_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'Bar', :marshal => :bson)
24
+ @baz_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'Baz', :marshal => :string)
25
+
26
+ @bar_count = 0
27
+ @baz_count = 0
28
+ end
29
+
30
+ def send_bar(count, message, sleep_time)
31
+ count.times do
32
+ @bar_count += 1
33
+ obj = {'count' => @bar_count, 'message' => message}
34
+ puts "Publishing to Bar object: #{obj.inspect}"
35
+ @bar_publisher.publish(obj)
36
+ sleep sleep_time
37
+ end
38
+ end
39
+
40
+ def send_baz(count, message, sleep_time)
41
+ count.times do
42
+ @baz_count += 1
43
+ obj = "#{@baz_count}: #{message}"
44
+ puts "Publishing to Baz object: #{obj}"
45
+ @baz_publisher.publish(obj)
46
+ sleep sleep_time
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,4 @@
1
+ ---
2
+ Bar:
3
+ :min_count: 10
4
+ ...
Binary file
Binary file
Binary file
@@ -0,0 +1,47 @@
1
+ Step 0
2
+ # Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
+
4
+ Step 1
5
+ # Start up the application
6
+ rm -f qwirk_persist.yml
7
+ rackup -p 4567
8
+
9
+ Step 2
10
+ # Browse to http://localhost:4567
11
+ # Open up the tree to Worker => Bar => Attributes and click on Attributes
12
+ # Change max_count to 100, idle_worker_timeout to 10, and sleep_time to 5 and click Update.
13
+
14
+ Step 3
15
+ # Open the tree to Publisher => Operations => send_bar and click on send_bar
16
+ # Set count to 100 and sleep_time to 0.2 and click Execute.
17
+ # Click back on Worker => Bar => Attributes and continue clicking every few seconds. You
18
+ should see the count of workers top out at around 25 (5 published messages/sec * 5 secs/worker)
19
+ and then 10 seconds after all 100 messages have been read it will drop back down to 1.
20
+
21
+ Step 4
22
+ # cntl-c the rackup process and start it back up. It should come back with
23
+ the workers and the config values that have been configured via the browser.
24
+
25
+
26
+ Things to try:
27
+
28
+
29
+ Expanding / Contracting workers
30
+
31
+ Note that after you set a max_count and before you publish, the count of workers will be
32
+ 1 as their is just a single worker waiting for data on the queue. Once you publish messages,
33
+ the count of workers will grow as needed to handle the message volume up to max_count.
34
+
35
+ If you set a value for idle_worker_timeout then the count of workers will go down when there
36
+ is no work to be done. Set a timeout and refresh the attributes to see this in action.
37
+
38
+
39
+ Monitoring your workers
40
+
41
+ Browse to http://localhost:4567/Worker/Bar/timer/attributes.json?reset=true
42
+
43
+ Publish some messages (possibly modifying the worker's sleep times first) and browse to that address again.
44
+
45
+ If you use a monitoring tool such as munin, nagios, hyperic, etc., you could poll this url periodically to create
46
+ a graph or alert for your system. For easy creation of munin graphs and alert withe this framework, see
47
+ https://github.com/ClarityServices/ruminate
@@ -0,0 +1,14 @@
1
+ require '../setup'
2
+ require './foo_worker'
3
+ require './publisher'
4
+ require './task'
5
+
6
+ # If we're not starting up a standalone publisher, then start up a manager
7
+ if ENV['RACK_ENV'] != 'publisher'
8
+ manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
9
+ at_exit { manager.stop }
10
+ end
11
+ if ENV['RACK_ENV'] != 'worker'
12
+ Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
13
+ end
14
+ run Rumx::Server
@@ -0,0 +1,10 @@
1
+ class FooWorker
2
+ include Qwirk::RequestWorker
3
+
4
+ config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
+
6
+ def request(hash)
7
+ sleep config.sleep_time
8
+ '%s%04d' % [hash['message'], hash['count']]
9
+ end
10
+ end
@@ -0,0 +1,1000 @@
1
+ M0001
2
+ M0002
3
+ M0003
4
+ M0004
5
+ M0005
6
+ M0006
7
+ M0007
8
+ M0008
9
+ M0009
10
+ M0010
11
+ M0011
12
+ M0012
13
+ M0013
14
+ M0014
15
+ M0015
16
+ M0016
17
+ M0017
18
+ M0018
19
+ M0019
20
+ M0020
21
+ M0021
22
+ M0022
23
+ M0023
24
+ M0024
25
+ M0025
26
+ M0026
27
+ M0027
28
+ M0028
29
+ M0029
30
+ M0030
31
+ M0031
32
+ M0032
33
+ M0033
34
+ M0034
35
+ M0035
36
+ M0036
37
+ M0037
38
+ M0038
39
+ M0039
40
+ M0040
41
+ M0041
42
+ M0042
43
+ M0043
44
+ M0044
45
+ M0045
46
+ M0046
47
+ M0047
48
+ M0048
49
+ M0049
50
+ M0050
51
+ M0051
52
+ M0052
53
+ M0053
54
+ M0054
55
+ M0055
56
+ M0056
57
+ M0057
58
+ M0058
59
+ M0059
60
+ M0060
61
+ M0061
62
+ M0062
63
+ M0063
64
+ M0064
65
+ M0065
66
+ M0066
67
+ M0067
68
+ M0068
69
+ M0069
70
+ M0070
71
+ M0071
72
+ M0072
73
+ M0073
74
+ M0074
75
+ M0075
76
+ M0076
77
+ M0077
78
+ M0078
79
+ M0079
80
+ M0080
81
+ M0081
82
+ M0082
83
+ M0083
84
+ M0084
85
+ M0085
86
+ M0086
87
+ M0087
88
+ M0088
89
+ M0089
90
+ M0090
91
+ M0091
92
+ M0092
93
+ M0093
94
+ M0094
95
+ M0095
96
+ M0096
97
+ M0097
98
+ M0098
99
+ M0100
100
+ M0099
101
+ M0101
102
+ M0102
103
+ M0103
104
+ M0104
105
+ M0106
106
+ M0105
107
+ M0107
108
+ M0108
109
+ M0109
110
+ M0110
111
+ M0111
112
+ M0112
113
+ M0113
114
+ M0114
115
+ M0115
116
+ M0116
117
+ M0117
118
+ M0118
119
+ M0119
120
+ M0120
121
+ M0121
122
+ M0122
123
+ M0123
124
+ M0124
125
+ M0125
126
+ M0126
127
+ M0127
128
+ M0128
129
+ M0129
130
+ M0130
131
+ M0131
132
+ M0132
133
+ M0133
134
+ M0134
135
+ M0135
136
+ M0136
137
+ M0137
138
+ M0138
139
+ M0139
140
+ M0140
141
+ M0141
142
+ M0142
143
+ M0143
144
+ M0144
145
+ M0145
146
+ M0146
147
+ M0147
148
+ M0148
149
+ M0149
150
+ M0150
151
+ M0151
152
+ M0152
153
+ M0154
154
+ M0153
155
+ M0155
156
+ M0157
157
+ M0156
158
+ M0158
159
+ M0160
160
+ M0159
161
+ M0161
162
+ M0163
163
+ M0162
164
+ M0164
165
+ M0166
166
+ M0165
167
+ M0167
168
+ M0169
169
+ M0168
170
+ M0170
171
+ M0171
172
+ M0172
173
+ M0173
174
+ M0174
175
+ M0175
176
+ M0176
177
+ M0177
178
+ M0178
179
+ M0179
180
+ M0181
181
+ M0180
182
+ M0182
183
+ M0183
184
+ M0184
185
+ M0185
186
+ M0186
187
+ M0187
188
+ M0188
189
+ M0190
190
+ M0189
191
+ M0191
192
+ M0192
193
+ M0193
194
+ M0194
195
+ M0196
196
+ M0195
197
+ M0197
198
+ M0198
199
+ M0199
200
+ M0200
201
+ M0202
202
+ M0201
203
+ M0203
204
+ M0204
205
+ M0205
206
+ M0206
207
+ M0208
208
+ M0207
209
+ M0209
210
+ M0210
211
+ M0211
212
+ M0212
213
+ M0214
214
+ M0213
215
+ M0215
216
+ M0216
217
+ M0217
218
+ M0218
219
+ M0220
220
+ M0219
221
+ M0221
222
+ M0222
223
+ M0223
224
+ M0224
225
+ M0225
226
+ M0226
227
+ M0227
228
+ M0228
229
+ M0229
230
+ M0230
231
+ M0231
232
+ M0232
233
+ M0233
234
+ M0234
235
+ M0235
236
+ M0236
237
+ M0237
238
+ M0238
239
+ M0239
240
+ M0240
241
+ M0241
242
+ M0243
243
+ M0242
244
+ M0244
245
+ M0245
246
+ M0247
247
+ M0246
248
+ M0248
249
+ M0249
250
+ M0250
251
+ M0251
252
+ M0252
253
+ M0253
254
+ M0254
255
+ M0255
256
+ M0256
257
+ M0257
258
+ M0258
259
+ M0259
260
+ M0260
261
+ M0261
262
+ M0263
263
+ M0262
264
+ M0264
265
+ M0265
266
+ M0266
267
+ M0267
268
+ M0268
269
+ M0269
270
+ M0270
271
+ M0271
272
+ M0272
273
+ M0273
274
+ M0274
275
+ M0275
276
+ M0276
277
+ M0277
278
+ M0278
279
+ M0279
280
+ M0280
281
+ M0281
282
+ M0282
283
+ M0283
284
+ M0284
285
+ M0285
286
+ M0286
287
+ M0287
288
+ M0288
289
+ M0289
290
+ M0290
291
+ M0291
292
+ M0292
293
+ M0293
294
+ M0294
295
+ M0295
296
+ M0296
297
+ M0297
298
+ M0298
299
+ M0299
300
+ M0300
301
+ M0301
302
+ M0302
303
+ M0303
304
+ M0304
305
+ M0305
306
+ M0306
307
+ M0307
308
+ M0308
309
+ M0309
310
+ M0310
311
+ M0311
312
+ M0312
313
+ M0313
314
+ M0314
315
+ M0315
316
+ M0316
317
+ M0317
318
+ M0318
319
+ M0319
320
+ M0320
321
+ M0321
322
+ M0322
323
+ M0323
324
+ M0324
325
+ M0325
326
+ M0326
327
+ M0327
328
+ M0328
329
+ M0329
330
+ M0330
331
+ M0331
332
+ M0332
333
+ M0333
334
+ M0334
335
+ M0335
336
+ M0336
337
+ M0337
338
+ M0338
339
+ M0339
340
+ M0340
341
+ M0341
342
+ M0342
343
+ M0343
344
+ M0344
345
+ M0345
346
+ M0346
347
+ M0348
348
+ M0347
349
+ M0349
350
+ M0350
351
+ M0351
352
+ M0352
353
+ M0353
354
+ M0354
355
+ M0356
356
+ M0355
357
+ M0357
358
+ M0358
359
+ M0359
360
+ M0360
361
+ M0361
362
+ M0362
363
+ M0363
364
+ M0364
365
+ M0365
366
+ M0366
367
+ M0367
368
+ M0368
369
+ M0369
370
+ M0370
371
+ M0371
372
+ M0372
373
+ M0373
374
+ M0374
375
+ M0376
376
+ M0375
377
+ M0377
378
+ M0378
379
+ M0379
380
+ M0380
381
+ M0381
382
+ M0382
383
+ M0384
384
+ M0383
385
+ M0385
386
+ M0386
387
+ M0387
388
+ M0388
389
+ M0389
390
+ M0390
391
+ M0392
392
+ M0391
393
+ M0393
394
+ M0394
395
+ M0395
396
+ M0396
397
+ M0397
398
+ M0398
399
+ M0399
400
+ M0400
401
+ M0401
402
+ M0402
403
+ M0403
404
+ M0404
405
+ M0405
406
+ M0406
407
+ M0407
408
+ M0408
409
+ M0409
410
+ M0410
411
+ M0411
412
+ M0412
413
+ M0413
414
+ M0414
415
+ M0415
416
+ M0416
417
+ M0417
418
+ M0418
419
+ M0420
420
+ M0419
421
+ M0421
422
+ M0422
423
+ M0423
424
+ M0424
425
+ M0425
426
+ M0426
427
+ M0427
428
+ M0428
429
+ M0429
430
+ M0430
431
+ M0431
432
+ M0432
433
+ M0433
434
+ M0434
435
+ M0436
436
+ M0435
437
+ M0437
438
+ M0438
439
+ M0439
440
+ M0440
441
+ M0441
442
+ M0442
443
+ M0443
444
+ M0444
445
+ M0445
446
+ M0446
447
+ M0447
448
+ M0448
449
+ M0449
450
+ M0450
451
+ M0451
452
+ M0452
453
+ M0453
454
+ M0454
455
+ M0455
456
+ M0457
457
+ M0456
458
+ M0458
459
+ M0459
460
+ M0460
461
+ M0461
462
+ M0462
463
+ M0463
464
+ M0464
465
+ M0465
466
+ M0467
467
+ M0466
468
+ M0468
469
+ M0469
470
+ M0470
471
+ M0471
472
+ M0472
473
+ M0473
474
+ M0474
475
+ M0475
476
+ M0476
477
+ M0477
478
+ M0478
479
+ M0479
480
+ M0480
481
+ M0481
482
+ M0483
483
+ M0482
484
+ M0484
485
+ M0485
486
+ M0486
487
+ M0487
488
+ M0488
489
+ M0489
490
+ M0490
491
+ M0491
492
+ M0493
493
+ M0492
494
+ M0495
495
+ M0494
496
+ M0496
497
+ M0497
498
+ M0498
499
+ M0499
500
+ M0500
501
+ M0501
502
+ M0502
503
+ M0503
504
+ M0505
505
+ M0504
506
+ M0506
507
+ M0508
508
+ M0507
509
+ M0509
510
+ M0510
511
+ M0511
512
+ M0512
513
+ M0513
514
+ M0515
515
+ M0514
516
+ M0516
517
+ M0517
518
+ M0518
519
+ M0519
520
+ M0520
521
+ M0521
522
+ M0522
523
+ M0523
524
+ M0525
525
+ M0524
526
+ M0526
527
+ M0527
528
+ M0528
529
+ M0529
530
+ M0530
531
+ M0531
532
+ M0533
533
+ M0532
534
+ M0534
535
+ M0535
536
+ M0536
537
+ M0537
538
+ M0538
539
+ M0539
540
+ M0540
541
+ M0541
542
+ M0542
543
+ M0543
544
+ M0544
545
+ M0545
546
+ M0546
547
+ M0548
548
+ M0547
549
+ M0549
550
+ M0550
551
+ M0551
552
+ M0552
553
+ M0553
554
+ M0554
555
+ M0555
556
+ M0556
557
+ M0557
558
+ M0558
559
+ M0559
560
+ M0560
561
+ M0562
562
+ M0563
563
+ M0561
564
+ M0564
565
+ M0565
566
+ M0567
567
+ M0566
568
+ M0568
569
+ M0569
570
+ M0570
571
+ M0571
572
+ M0572
573
+ M0573
574
+ M0575
575
+ M0574
576
+ M0576
577
+ M0578
578
+ M0577
579
+ M0579
580
+ M0580
581
+ M0581
582
+ M0582
583
+ M0583
584
+ M0584
585
+ M0585
586
+ M0586
587
+ M0588
588
+ M0587
589
+ M0589
590
+ M0590
591
+ M0591
592
+ M0592
593
+ M0593
594
+ M0594
595
+ M0595
596
+ M0596
597
+ M0598
598
+ M0597
599
+ M0599
600
+ M0600
601
+ M0601
602
+ M0602
603
+ M0603
604
+ M0604
605
+ M0605
606
+ M0606
607
+ M0607
608
+ M0608
609
+ M0609
610
+ M0610
611
+ M0611
612
+ M0612
613
+ M0613
614
+ M0614
615
+ M0615
616
+ M0616
617
+ M0617
618
+ M0618
619
+ M0619
620
+ M0620
621
+ M0621
622
+ M0622
623
+ M0623
624
+ M0624
625
+ M0625
626
+ M0626
627
+ M0627
628
+ M0628
629
+ M0629
630
+ M0630
631
+ M0631
632
+ M0632
633
+ M0633
634
+ M0634
635
+ M0635
636
+ M0636
637
+ M0637
638
+ M0638
639
+ M0639
640
+ M0640
641
+ M0641
642
+ M0642
643
+ M0643
644
+ M0644
645
+ M0645
646
+ M0646
647
+ M0647
648
+ M0648
649
+ M0649
650
+ M0650
651
+ M0651
652
+ M0652
653
+ M0653
654
+ M0654
655
+ M0655
656
+ M0656
657
+ M0657
658
+ M0658
659
+ M0659
660
+ M0660
661
+ M0661
662
+ M0662
663
+ M0663
664
+ M0664
665
+ M0665
666
+ M0666
667
+ M0668
668
+ M0667
669
+ M0669
670
+ M0670
671
+ M0671
672
+ M0672
673
+ M0673
674
+ M0674
675
+ M0675
676
+ M0676
677
+ M0677
678
+ M0678
679
+ M0679
680
+ M0680
681
+ M0681
682
+ M0682
683
+ M0683
684
+ M0685
685
+ M0684
686
+ M0686
687
+ M0688
688
+ M0687
689
+ M0689
690
+ M0690
691
+ M0691
692
+ M0692
693
+ M0693
694
+ M0694
695
+ M0695
696
+ M0696
697
+ M0697
698
+ M0698
699
+ M0699
700
+ M0700
701
+ M0701
702
+ M0703
703
+ M0702
704
+ M0704
705
+ M0705
706
+ M0707
707
+ M0708
708
+ M0706
709
+ M0709
710
+ M0710
711
+ M0711
712
+ M0712
713
+ M0713
714
+ M0714
715
+ M0715
716
+ M0716
717
+ M0717
718
+ M0718
719
+ M0719
720
+ M0720
721
+ M0721
722
+ M0722
723
+ M0723
724
+ M0724
725
+ M0725
726
+ M0726
727
+ M0728
728
+ M0727
729
+ M0729
730
+ M0730
731
+ M0731
732
+ M0733
733
+ M0732
734
+ M0734
735
+ M0735
736
+ M0736
737
+ M0737
738
+ M0738
739
+ M0739
740
+ M0740
741
+ M0741
742
+ M0742
743
+ M0743
744
+ M0744
745
+ M0746
746
+ M0745
747
+ M0747
748
+ M0749
749
+ M0748
750
+ M0750
751
+ M0752
752
+ M0751
753
+ M0753
754
+ M0754
755
+ M0755
756
+ M0756
757
+ M0757
758
+ M0758
759
+ M0759
760
+ M0760
761
+ M0761
762
+ M0762
763
+ M0763
764
+ M0764
765
+ M0765
766
+ M0766
767
+ M0767
768
+ M0768
769
+ M0769
770
+ M0770
771
+ M0771
772
+ M0772
773
+ M0773
774
+ M0774
775
+ M0775
776
+ M0776
777
+ M0777
778
+ M0779
779
+ M0778
780
+ M0780
781
+ M0781
782
+ M0782
783
+ M0784
784
+ M0783
785
+ M0785
786
+ M0786
787
+ M0787
788
+ M0788
789
+ M0790
790
+ M0789
791
+ M0791
792
+ M0792
793
+ M0793
794
+ M0794
795
+ M0795
796
+ M0797
797
+ M0796
798
+ M0798
799
+ M0799
800
+ M0800
801
+ M0801
802
+ M0802
803
+ M0803
804
+ M0804
805
+ M0805
806
+ M0806
807
+ M0807
808
+ M0808
809
+ M0809
810
+ M0810
811
+ M0811
812
+ M0812
813
+ M0814
814
+ M0813
815
+ M0816
816
+ M0815
817
+ M0817
818
+ M0818
819
+ M0820
820
+ M0821
821
+ M0819
822
+ M0822
823
+ M0823
824
+ M0824
825
+ M0826
826
+ M0825
827
+ M0827
828
+ M0828
829
+ M0829
830
+ M0830
831
+ M0831
832
+ M0832
833
+ M0834
834
+ M0833
835
+ M0835
836
+ M0836
837
+ M0838
838
+ M0837
839
+ M0840
840
+ M0839
841
+ M0841
842
+ M0842
843
+ M0843
844
+ M0844
845
+ M0845
846
+ M0846
847
+ M0847
848
+ M0848
849
+ M0849
850
+ M0850
851
+ M0851
852
+ M0852
853
+ M0853
854
+ M0854
855
+ M0855
856
+ M0856
857
+ M0857
858
+ M0858
859
+ M0859
860
+ M0860
861
+ M0861
862
+ M0862
863
+ M0863
864
+ M0864
865
+ M0865
866
+ M0866
867
+ M0867
868
+ M0868
869
+ M0869
870
+ M0870
871
+ M0871
872
+ M0872
873
+ M0873
874
+ M0874
875
+ M0875
876
+ M0876
877
+ M0877
878
+ M0878
879
+ M0879
880
+ M0880
881
+ M0881
882
+ M0882
883
+ M0883
884
+ M0884
885
+ M0885
886
+ M0886
887
+ M0887
888
+ M0889
889
+ M0888
890
+ M0890
891
+ M0891
892
+ M0892
893
+ M0893
894
+ M0895
895
+ M0894
896
+ M0896
897
+ M0897
898
+ M0898
899
+ M0899
900
+ M0900
901
+ M0901
902
+ M0902
903
+ M0903
904
+ M0904
905
+ M0905
906
+ M0906
907
+ M0907
908
+ M0908
909
+ M0909
910
+ M0910
911
+ M0911
912
+ M0912
913
+ M0913
914
+ M0914
915
+ M0915
916
+ M0916
917
+ M0917
918
+ M0918
919
+ M0919
920
+ M0920
921
+ M0921
922
+ M0922
923
+ M0923
924
+ M0924
925
+ M0925
926
+ M0926
927
+ M0927
928
+ M0928
929
+ M0929
930
+ M0931
931
+ M0930
932
+ M0932
933
+ M0933
934
+ M0934
935
+ M0935
936
+ M0936
937
+ M0937
938
+ M0938
939
+ M0940
940
+ M0939
941
+ M0941
942
+ M0943
943
+ M0942
944
+ M0944
945
+ M0945
946
+ M0946
947
+ M0947
948
+ M0948
949
+ M0949
950
+ M0950
951
+ M0951
952
+ M0952
953
+ M0953
954
+ M0955
955
+ M0956
956
+ M0954
957
+ M0957
958
+ M0958
959
+ M0959
960
+ M0960
961
+ M0962
962
+ M0961
963
+ M0963
964
+ M0964
965
+ M0965
966
+ M0966
967
+ M0968
968
+ M0967
969
+ M0969
970
+ M0970
971
+ M0971
972
+ M0973
973
+ M0972
974
+ M0974
975
+ M0975
976
+ M0976
977
+ M0977
978
+ M0978
979
+ M0979
980
+ M0980
981
+ M0981
982
+ M0983
983
+ M0982
984
+ M0984
985
+ M0985
986
+ M0986
987
+ M0987
988
+ M0988
989
+ M0989
990
+ M0990
991
+ M0991
992
+ M0992
993
+ M0994
994
+ M0993
995
+ M0995
996
+ M0996
997
+ M0997
998
+ M0998
999
+ M0999
1000
+ M1000