fluentd 1.5.2 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +15 -6
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  5. data/CHANGELOG.md +29 -0
  6. data/CONTRIBUTING.md +1 -1
  7. data/Gemfile +5 -0
  8. data/Rakefile +6 -1
  9. data/appveyor.yml +9 -10
  10. data/lib/fluent/command/fluentd.rb +4 -0
  11. data/lib/fluent/config/literal_parser.rb +2 -2
  12. data/lib/fluent/plugin/base.rb +1 -0
  13. data/lib/fluent/plugin/buffer.rb +22 -0
  14. data/lib/fluent/plugin/in_forward.rb +2 -2
  15. data/lib/fluent/plugin/in_monitor_agent.rb +90 -131
  16. data/lib/fluent/plugin/out_forward.rb +4 -0
  17. data/lib/fluent/plugin/output.rb +31 -1
  18. data/lib/fluent/plugin/parser_none.rb +1 -2
  19. data/lib/fluent/plugin_helper.rb +1 -0
  20. data/lib/fluent/plugin_helper/cert_option.rb +1 -1
  21. data/lib/fluent/plugin_helper/http_server.rb +75 -0
  22. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  23. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  24. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  25. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  26. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  27. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  28. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  29. data/lib/fluent/plugin_helper/socket.rb +8 -2
  30. data/lib/fluent/supervisor.rb +5 -2
  31. data/lib/fluent/time.rb +13 -0
  32. data/lib/fluent/version.rb +1 -1
  33. data/test/command/test_fluentd.rb +36 -2
  34. data/test/helper.rb +1 -0
  35. data/test/helpers/fuzzy_assert.rb +89 -0
  36. data/test/plugin/test_buf_file.rb +1 -1
  37. data/test/plugin/test_in_http.rb +2 -5
  38. data/test/plugin/test_in_monitor_agent.rb +118 -17
  39. data/test/plugin/test_in_udp.rb +0 -2
  40. data/test/plugin/test_out_file.rb +15 -12
  41. data/test/plugin/test_out_forward.rb +18 -0
  42. data/test/plugin/test_out_secondary_file.rb +6 -4
  43. data/test/plugin/test_output_as_buffered.rb +4 -0
  44. data/test/plugin/test_output_as_buffered_retries.rb +0 -2
  45. data/test/plugin/test_output_as_buffered_secondary.rb +0 -3
  46. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  47. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  48. data/test/plugin_helper/data/cert/cert.pem +19 -0
  49. data/test/plugin_helper/http_server/test_app.rb +65 -0
  50. data/test/plugin_helper/http_server/test_route.rb +32 -0
  51. data/test/plugin_helper/test_cert_option.rb +16 -0
  52. data/test/plugin_helper/test_http_server_helper.rb +203 -0
  53. data/test/plugin_helper/test_server.rb +1 -7
  54. data/test/test_event_time.rb +13 -0
  55. data/test/test_log.rb +8 -6
  56. data/test/test_supervisor.rb +3 -0
  57. metadata +28 -2
@@ -10,6 +10,8 @@ require 'json'
10
10
  require_relative '../test_plugin_classes'
11
11
 
12
12
  class MonitorAgentInputTest < Test::Unit::TestCase
13
+ include FuzzyAssert
14
+
13
15
  def setup
14
16
  Fluent::Test.setup
15
17
  end
@@ -118,7 +120,13 @@ EOC
118
120
  "plugin_category" => "output",
119
121
  "plugin_id" => "test_out",
120
122
  "retry_count" => 0,
121
- "type" => "test_out"
123
+ "type" => "test_out",
124
+ "emit_count" => Integer,
125
+ "emit_records" => Integer,
126
+ "write_count" => Integer,
127
+ "rollback_count" => Integer,
128
+ "slow_flush_count" => Integer,
129
+ "flush_time_count" => Integer,
122
130
  }
123
131
  output_info.merge!("config" => {"@id" => "test_out", "@type" => "test_out"}) if with_config
124
132
  error_label_info = {
@@ -129,14 +137,24 @@ EOC
129
137
  "plugin_category" => "output",
130
138
  "plugin_id" => "null",
131
139
  "retry_count" => 0,
132
- "type" => "null"
140
+ "type" => "null",
141
+ "buffer_available_buffer_space_ratios" => Float,
142
+ "buffer_queue_byte_size" => Integer,
143
+ "buffer_stage_byte_size" => Integer,
144
+ "buffer_stage_length" => Integer,
145
+ "emit_count" => Integer,
146
+ "emit_records" => Integer,
147
+ "write_count" => Integer,
148
+ "rollback_count" => Integer,
149
+ "slow_flush_count" => Integer,
150
+ "flush_time_count" => Integer,
133
151
  }
134
152
  error_label_info.merge!("config" => {"@id"=>"null", "@type" => "null"}) if with_config
135
153
  opts = {with_config: with_config}
136
154
  assert_equal(input_info, d.instance.get_monitor_info(@ra.inputs.first, opts))
137
- assert_equal(filter_info, d.instance.get_monitor_info(@ra.filters.first, opts))
138
- assert_equal(output_info, d.instance.get_monitor_info(test_label.outputs.first, opts))
139
- assert_equal(error_label_info, d.instance.get_monitor_info(error_label.outputs.first, opts))
155
+ assert_fuzzy_equal(filter_info, d.instance.get_monitor_info(@ra.filters.first, opts))
156
+ assert_fuzzy_equal(output_info, d.instance.get_monitor_info(test_label.outputs.first, opts))
157
+ assert_fuzzy_equal(error_label_info, d.instance.get_monitor_info(error_label.outputs.first, opts))
140
158
  end
141
159
 
142
160
  test "fluentd opts" do
@@ -186,16 +204,29 @@ EOC
186
204
  "plugin_category" => "output",
187
205
  "type" => "relabel",
188
206
  "output_plugin" => true,
189
- "retry_count" => 0}
207
+ "retry_count" => 0,
208
+ "emit_count" => Integer,
209
+ "emit_records" => Integer,
210
+ "write_count" => Integer,
211
+ "rollback_count" => Integer,
212
+ "slow_flush_count" => Integer,
213
+ "flush_time_count" => Integer,
214
+ }
190
215
  expect_test_out_record = {
191
216
  "plugin_id" => "test_out",
192
217
  "plugin_category" => "output",
193
218
  "type" => "test_out",
194
219
  "output_plugin" => true,
195
- "retry_count" => 0
220
+ "retry_count" => 0,
221
+ "emit_count" => Integer,
222
+ "emit_records" => Integer,
223
+ "write_count" => Integer,
224
+ "rollback_count" => Integer,
225
+ "slow_flush_count" => Integer,
226
+ "flush_time_count" => Integer,
196
227
  }
197
- assert_equal(expect_relabel_record, d.events[1][2])
198
- assert_equal(expect_test_out_record, d.events[3][2])
228
+ assert_fuzzy_equal(expect_relabel_record, d.events[1][2])
229
+ assert_fuzzy_equal(expect_test_out_record, d.events[3][2])
199
230
  end
200
231
  end
201
232
 
@@ -303,7 +334,17 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
303
334
  "plugin_category" => "output",
304
335
  "plugin_id" => "null",
305
336
  "retry_count" => 0,
306
- "type" => "null"
337
+ "type" => "null",
338
+ "buffer_available_buffer_space_ratios" => Float,
339
+ "buffer_queue_byte_size" => Integer,
340
+ "buffer_stage_byte_size" => Integer,
341
+ "buffer_stage_length" => Integer,
342
+ "emit_count" => Integer,
343
+ "emit_records" => Integer,
344
+ "write_count" => Integer,
345
+ "rollback_count" => Integer,
346
+ "slow_flush_count" => Integer,
347
+ "flush_time_count" => Integer,
307
348
  }
308
349
  expected_null_response.merge!("config" => {"@id" => "null", "@type" => "null"}) if with_config
309
350
  expected_null_response.merge!("retry" => {}) if with_retry
@@ -311,7 +352,21 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
311
352
  test_in_response = response["plugins"][0]
312
353
  null_response = response["plugins"][5]
313
354
  assert_equal(expected_test_in_response, test_in_response)
314
- assert_equal(expected_null_response, null_response)
355
+ assert_fuzzy_equal(expected_null_response, null_response)
356
+ end
357
+
358
+ test "/api/plugins.json/not_found" do
359
+ d = create_driver("
360
+ @type monitor_agent
361
+ bind '127.0.0.1'
362
+ port #{@port}
363
+ tag monitor
364
+ ")
365
+ d.instance.start
366
+ resp = get("http://127.0.0.1:#{@port}/api/plugins.json/not_found")
367
+ assert_equal('404', resp.code)
368
+ body = JSON.parse(resp.body)
369
+ assert_equal(body['message'], 'Not found')
315
370
  end
316
371
 
317
372
  data(:with_config_and_retry_yes => [true, true, "?with_config=yes&with_retry"],
@@ -341,7 +396,17 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
341
396
  "plugin_category" => "output",
342
397
  "plugin_id" => "null",
343
398
  "retry_count" => 0,
344
- "type" => "null"
399
+ "type" => "null",
400
+ "buffer_available_buffer_space_ratios" => Float,
401
+ "buffer_queue_byte_size" => Integer,
402
+ "buffer_stage_byte_size" => Integer,
403
+ "buffer_stage_length" => Integer,
404
+ "emit_count" => Integer,
405
+ "emit_records" => Integer,
406
+ "write_count" => Integer,
407
+ "rollback_count" => Integer,
408
+ "slow_flush_count" => Integer,
409
+ "flush_time_count" => Integer,
345
410
  }
346
411
  expected_null_response.merge!("config" => {"@id" => "null", "@type" => "null"}) if with_config
347
412
  expected_null_response.merge!("retry" => {}) if with_retry
@@ -349,7 +414,7 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
349
414
  test_in_response = response["plugins"][0]
350
415
  null_response = response["plugins"][5]
351
416
  assert_equal(expected_test_in_response, test_in_response)
352
- assert_equal(expected_null_response, null_response)
417
+ assert_fuzzy_include(expected_null_response, null_response)
353
418
  end
354
419
 
355
420
  test "/api/plugins.json with 'with_ivars'. response contains specified instance variables of each plugin" do
@@ -377,13 +442,23 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
377
442
  "plugin_id" => "null",
378
443
  "retry_count" => 0,
379
444
  "type" => "null",
380
- "instance_variables" => {"id" => "null", "num_errors" => 0}
445
+ "instance_variables" => {"id" => "null", "num_errors" => 0},
446
+ "buffer_available_buffer_space_ratios" => Float,
447
+ "buffer_queue_byte_size" => Integer,
448
+ "buffer_stage_byte_size" => Integer,
449
+ "buffer_stage_length" => Integer,
450
+ "emit_count" => Integer,
451
+ "emit_records" => Integer,
452
+ "write_count" => Integer,
453
+ "rollback_count" => Integer,
454
+ "slow_flush_count" => Integer,
455
+ "flush_time_count" => Integer,
381
456
  }
382
457
  response = JSON.parse(get("http://127.0.0.1:#{@port}/api/plugins.json?with_config=no&with_retry=no&with_ivars=id,num_errors").body)
383
458
  test_in_response = response["plugins"][0]
384
459
  null_response = response["plugins"][5]
385
460
  assert_equal(expected_test_in_response, test_in_response)
386
- assert_equal(expected_null_response, null_response)
461
+ assert_fuzzy_equal(expected_null_response, null_response)
387
462
  end
388
463
 
389
464
  test "/api/config" do
@@ -394,7 +469,7 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
394
469
  tag monitor
395
470
  ")
396
471
  d.instance.start
397
- expected_response_regex = /pid:\d+\tppid:\d+\tconfig_path:\/etc\/fluent\/fluent.conf\tpid_file:\tplugin_dirs:\[\"\/etc\/fluent\/plugin\"\]\tlog_path:/
472
+ expected_response_regex = /pid:\d+\tppid:\d+\tconfig_path:\/etc\/fluent\/fluent.conf\tpid_file:\tplugin_dirs:\/etc\/fluent\/plugin\tlog_path:/
398
473
 
399
474
  assert_match(expected_response_regex,
400
475
  get("http://127.0.0.1:#{@port}/api/config").body)
@@ -427,6 +502,20 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
427
502
  assert_true !get("http://127.0.0.1:#{@port}/api/config.json").body.include?("\n")
428
503
  assert_true get("http://127.0.0.1:#{@port}/api/config.json?debug=1").body.include?("\n")
429
504
  end
505
+
506
+ test "/api/config.json/not_found" do
507
+ d = create_driver("
508
+ @type monitor_agent
509
+ bind '127.0.0.1'
510
+ port #{@port}
511
+ tag monitor
512
+ ")
513
+ d.instance.start
514
+ resp = get("http://127.0.0.1:#{@port}/api/config.json/not_found")
515
+ assert_equal('404', resp.code)
516
+ body = JSON.parse(resp.body)
517
+ assert_equal(body['message'], 'Not found')
518
+ end
430
519
  end
431
520
 
432
521
  sub_test_case "check retry of buffered plugins" do
@@ -482,6 +571,18 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
482
571
  "plugin_category" => "output",
483
572
  "plugin_id" => "test_out_fail_write",
484
573
  "type" => "test_out_fail_write",
574
+ "buffer_newest_timekey" => output.calculate_timekey(event_time),
575
+ "buffer_oldest_timekey" => output.calculate_timekey(event_time),
576
+ "buffer_available_buffer_space_ratios" => Float,
577
+ "buffer_queue_byte_size" => Integer,
578
+ "buffer_stage_byte_size" => Integer,
579
+ "buffer_stage_length" => Integer,
580
+ "emit_count" => Integer,
581
+ "emit_records" => Integer,
582
+ "write_count" => Integer,
583
+ "rollback_count" => Integer,
584
+ 'slow_flush_count' => Integer,
585
+ 'flush_time_count' => Integer,
485
586
  }
486
587
  output.emit_events('test.tag', Fluent::ArrayEventStream.new([[event_time, {"message" => "test failed flush 1"}]]))
487
588
  # flush few times to check steps
@@ -497,7 +598,7 @@ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:f
497
598
  # remove dynamic keys
498
599
  response_retry_count = test_out_fail_write_response.delete("retry_count")
499
600
  response_retry = test_out_fail_write_response.delete("retry")
500
- assert_equal(expected_test_out_fail_write_response, test_out_fail_write_response)
601
+ assert_fuzzy_equal(expected_test_out_fail_write_response, test_out_fail_write_response)
501
602
  assert{ response_retry.has_key?("steps") }
502
603
  # it's very hard to check exact retry count (because retries are called by output flush thread scheduling)
503
604
  assert{ response_retry_count >= 1 && response_retry["steps"] >= 0 }
@@ -194,7 +194,6 @@ class UdpInputTest < Test::Unit::TestCase
194
194
  end
195
195
  end
196
196
 
197
- expected = {'message' => 'test'}
198
197
  assert_equal 1, d.events.size
199
198
  assert_equal "udp", d.events[0][0]
200
199
  assert d.events[0][1].is_a?(Fluent::EventTime)
@@ -214,7 +213,6 @@ class UdpInputTest < Test::Unit::TestCase
214
213
  end
215
214
  end
216
215
 
217
- expected = {'message' => 'test'}
218
216
  assert_equal 1, d.events.size
219
217
  assert_equal "udp", d.events[0][0]
220
218
  assert d.events[0][1].is_a?(Fluent::EventTime)
@@ -72,10 +72,12 @@ class FileOutputTest < Test::Unit::TestCase
72
72
  create_driver %[path #{TMP_DIR}/test_dir/foo/bar/baz]
73
73
  end
74
74
 
75
- assert_raise(Fluent::ConfigError) do
76
- FileUtils.mkdir_p("#{TMP_DIR}/test_dir")
77
- File.chmod(0555, "#{TMP_DIR}/test_dir")
78
- create_driver %[path #{TMP_DIR}/test_dir/foo/bar/baz]
75
+ if Process.uid.nonzero?
76
+ assert_raise(Fluent::ConfigError) do
77
+ FileUtils.mkdir_p("#{TMP_DIR}/test_dir")
78
+ File.chmod(0555, "#{TMP_DIR}/test_dir")
79
+ create_driver %[path #{TMP_DIR}/test_dir/foo/bar/baz]
80
+ end
79
81
  end
80
82
  end
81
83
 
@@ -102,15 +104,17 @@ class FileOutputTest < Test::Unit::TestCase
102
104
  end
103
105
  end
104
106
 
105
- test 'configuration error raised if specified directory via template is not writable' do
106
- Timecop.freeze(Time.parse("2016-10-04 21:33:27 UTC")) do
107
- conf = config_element('match', '**', {
107
+ if Process.uid.nonzero?
108
+ test 'configuration error raised if specified directory via template is not writable' do
109
+ Timecop.freeze(Time.parse("2016-10-04 21:33:27 UTC")) do
110
+ conf = config_element('match', '**', {
108
111
  'path' => "#{TMP_DIR}/prohibited/${tag}/file.%Y%m%d.log",
109
112
  }, [ config_element('buffer', 'time,tag', {'timekey' => 86400, 'timekey_zone' => '+0000'}) ])
110
- FileUtils.mkdir_p("#{TMP_DIR}/prohibited")
111
- File.chmod(0555, "#{TMP_DIR}/prohibited")
112
- assert_raise Fluent::ConfigError.new("out_file: `#{TMP_DIR}/prohibited/a/file.20161004.log_**.log` is not writable") do
113
- create_driver(conf)
113
+ FileUtils.mkdir_p("#{TMP_DIR}/prohibited")
114
+ File.chmod(0555, "#{TMP_DIR}/prohibited")
115
+ assert_raise Fluent::ConfigError.new("out_file: `#{TMP_DIR}/prohibited/a/file.20161004.log_**.log` is not writable") do
116
+ create_driver(conf)
117
+ end
114
118
  end
115
119
  end
116
120
  end
@@ -635,7 +639,6 @@ class FileOutputTest < Test::Unit::TestCase
635
639
 
636
640
  test '${chunk_id}' do
637
641
  time = event_time("2011-01-02 13:14:15 UTC")
638
- formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n] + %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n]
639
642
 
640
643
  write_once = ->(){
641
644
  d = create_driver %[
@@ -78,6 +78,7 @@ class ForwardOutputTest < Test::Unit::TestCase
78
78
  assert_equal 60, d.instance.send_timeout
79
79
  assert_equal :transport, d.instance.heartbeat_type
80
80
  assert_equal 1, nodes.length
81
+ assert_nil d.instance.connect_timeout
81
82
  node = nodes.first
82
83
  assert_equal "test", node.name
83
84
  assert_equal '127.0.0.1', node.host
@@ -102,6 +103,23 @@ EOL
102
103
  assert_equal( 10*1024*1024, instance.buffer.chunk_limit_size )
103
104
  end
104
105
 
106
+ test 'configure timeouts' do
107
+ @d = d = create_driver(%[
108
+ send_timeout 30
109
+ connect_timeout 10
110
+ hard_timeout 15
111
+ ack_response_timeout 20
112
+ <server>
113
+ host #{TARGET_HOST}
114
+ port #{TARGET_PORT}
115
+ </server>
116
+ ])
117
+ assert_equal 30, d.instance.send_timeout
118
+ assert_equal 10, d.instance.connect_timeout
119
+ assert_equal 15, d.instance.hard_timeout
120
+ assert_equal 20, d.instance.ack_response_timeout
121
+ end
122
+
105
123
  test 'configure_udp_heartbeat' do
106
124
  @d = d = create_driver(CONFIG + "\nheartbeat_type udp")
107
125
  assert_equal :udp, d.instance.heartbeat_type
@@ -88,10 +88,12 @@ class FileOutputSecondaryTest < Test::Unit::TestCase
88
88
  create_driver %[directory #{TMP_DIR}/test_dir/foo/bar/]
89
89
  end
90
90
 
91
- assert_raise Fluent::ConfigError.new("out_secondary_file: `#{TMP_DIR}/test_dir/foo/bar/` should be writable") do
92
- FileUtils.mkdir_p("#{TMP_DIR}/test_dir")
93
- File.chmod(0555, "#{TMP_DIR}/test_dir")
94
- create_driver %[directory #{TMP_DIR}/test_dir/foo/bar/]
91
+ if Process.uid.nonzero?
92
+ assert_raise Fluent::ConfigError.new("out_secondary_file: `#{TMP_DIR}/test_dir/foo/bar/` should be writable") do
93
+ FileUtils.mkdir_p("#{TMP_DIR}/test_dir")
94
+ File.chmod(0555, "#{TMP_DIR}/test_dir")
95
+ create_driver %[directory #{TMP_DIR}/test_dir/foo/bar/]
96
+ end
95
97
  end
96
98
  end
97
99
 
@@ -207,6 +207,10 @@ class BufferedOutputTest < Test::Unit::TestCase
207
207
  end
208
208
  end
209
209
 
210
+ setup do
211
+ @i = nil
212
+ end
213
+
210
214
  teardown do
211
215
  if @i
212
216
  @i.stop unless @i.stopped?
@@ -457,8 +457,6 @@ class BufferedOutputRetryTest < Test::Unit::TestCase
457
457
  prev_write_count = @i.write_count
458
458
  prev_num_errors = @i.num_errors
459
459
 
460
- chunks = @i.buffer.queue.dup
461
-
462
460
  20.times do |i| # large times enough
463
461
  now = @i.next_flush_time
464
462
 
@@ -741,8 +741,6 @@ class BufferedOutputSecondaryTest < Test::Unit::TestCase
741
741
  assert{ @i.num_errors > 0 }
742
742
 
743
743
  prev_write_count = @i.write_count
744
- prev_num_errors = @i.num_errors
745
-
746
744
  first_failure = @i.retry.start
747
745
 
748
746
  20.times do |i| # large enough
@@ -757,7 +755,6 @@ class BufferedOutputSecondaryTest < Test::Unit::TestCase
757
755
  break if @i.buffer.queue.size == 0
758
756
 
759
757
  prev_write_count = @i.write_count
760
- prev_num_errors = @i.num_errors
761
758
  end
762
759
 
763
760
  # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpQIBAAKCAQEArbUTk5n5RruIQGhK1T8g/emKonlfWNMSj/J/f/U9NJ14ugIx
3
+ yHBMqx4WaTyA4zjT2VJO5tRBe385zlIUf8i+x7Ovt/MgsjiwXyKv7qdsE5KHLq+V
4
+ XJfA+s5vAAyzBHY/BA7xxh/QqCI8a/a1OyHyaQ9pFRFXtQBlTH7Fc1qSw5Yg0EXo
5
+ fa6YIBQuDjfqa7FRPj+bEWDO5PUqOMzH5XKBUPS9GLHOqia0CnzF2a51TArC0Dl1
6
+ oNFa7myVmjBuNtkG88Fkd7YNzGa+sNBJPmuGvFXuU3XPEnrtARO/SG4g9/MQUvfM
7
+ I3jFFOJAMmEKd8QXxO5FgIuEnaNOhVRVH/e9wwIDAQABAoIBAQCcYYAWSW/Y9ctb
8
+ 8IguIn8ZF77vNkVYOe1kGfQexjErxPiCvKcEw9TB2HxkkUuXQ/m0lBzkQgIRpB/u
9
+ VoaN47OdJW70M7UjvVVK0HeCascpd6irpvbYPOZG5MGZUdV4Ftv0U1/l9Y5rTycG
10
+ KzxM1+rcGjuH8+z5zjlj/FzV1Jx75pgH2vwE7tBC9hMIefKJVxsnj+1I2BWwT3Ra
11
+ tFayaKW80UYvGQeQjMHyWzEAHAAco5EVTNU9q4xkeKubZx/dod8b05S0Oral0SHY
12
+ AFzXJCp6k29w0m3saEtVQBTImwNut8scJ4KoryGRp9fj9a/dBb1RHe/6EXZ8kDRe
13
+ zhB2/XWBAoGBANpaAPdcIXFyke4DRB07JGin4NU+yzIZy+RwsHme1OIwu9jUYQ1j
14
+ SzcrnJ9adkjgHl4z2psXyeSz/lSUGj7ZjcMVaDu49JSYMPP3heXGkHdtlVyB7KFR
15
+ OBt1rgNdXYfOLOBg6j7mf5G5fXUIATM8fNw5nDYIivD7U3cl9TdUe3OJAoGBAMuo
16
+ e/pmRMEaaDmXuNkDGv/ZoOC4j9tO1fGheSdna9gZWoOyY+MUTFNBQuz/8aw6VsKS
17
+ c7RXY0QI6NsgdLD1OGVgH9AXhDqvgfOBXDWdr/DNJa0wDFNaWRrMFeNQLm7Xhxuf
18
+ OBQycq6vUiWJ6XTqcdk+xErcWRbsQPsGozCEcHfrAoGBAI+sl2QsMClI/PLDHWeq
19
+ ict/Y3aNigCebsYSzFxKgcOP05raLD417sEPplBIovpS1kigECDrJ0KgmSIoDZj7
20
+ Z8dM57gcfHrmJZfycB2AaYDcD2K+bui625Nd/LFkFu4MYQUHYDshSiGmDwIZ0UhY
21
+ bcQu+DWpq1rj1Mjaph7RLSYZAoGBAMAJNiZt6qT/ZonwA/A1mm7oYmekAJo2I0y+
22
+ CwTZ43oYph4Kx19nU3Up05aw3MyfEhJUkF/cCxErKY7+cqouAKiu1DCfDCNePTZE
23
+ o5M3BqEUgFNnPCgYyG6ZRIZco/wGpTKplvKMg1EuplIZUhbZvtKv+d3xGtyfl8Jc
24
+ huKH75lTAoGAHQ3Sy56zgQEJ3QFrIw4puztf/KXpSgLA+aSDh6Ti4IY7L+CwZmuW
25
+ JyVbgF33CwSIKEhacmALs1ZZsDc1ZXov1HWwePxe4/m7smoqZDtrRXQsbRB5COzA
26
+ U30iEMW/rwI3WmHhiIWZYje85+VJZqBc5QS8guv4/XrS/FE7C8Suksc=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDLDCCAhSgAwIBAgIIEJHFsHrKBGYwDQYJKoZIhvcNAQELBQAwJjEQMA4GA1UE
3
+ ChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTE5MDYxOTA1MTM0NVoX
4
+ DTE5MDkxODExMTg0NVowJjEQMA4GA1UEChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9j
5
+ YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArbUTk5n5RruI
6
+ QGhK1T8g/emKonlfWNMSj/J/f/U9NJ14ugIxyHBMqx4WaTyA4zjT2VJO5tRBe385
7
+ zlIUf8i+x7Ovt/MgsjiwXyKv7qdsE5KHLq+VXJfA+s5vAAyzBHY/BA7xxh/QqCI8
8
+ a/a1OyHyaQ9pFRFXtQBlTH7Fc1qSw5Yg0EXofa6YIBQuDjfqa7FRPj+bEWDO5PUq
9
+ OMzH5XKBUPS9GLHOqia0CnzF2a51TArC0Dl1oNFa7myVmjBuNtkG88Fkd7YNzGa+
10
+ sNBJPmuGvFXuU3XPEnrtARO/SG4g9/MQUvfMI3jFFOJAMmEKd8QXxO5FgIuEnaNO
11
+ hVRVH/e9wwIDAQABo14wXDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB
12
+ BQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPLdOVnVWuuB
13
+ 7Pnvpgte4BHitzFYMA0GCSqGSIb3DQEBCwUAA4IBAQBp8LAzjWIJapwTBnnivwZk
14
+ D6Lr028mZIacbBZKsmmPi0VvDFqCvUAbHN8ytPlRBWnvvkihDkZs1TwcDCXGsWYs
15
+ dNNwsYGpk3mQxsHQ9atvy0mQGLDlfaSs/329bfVCw1cPFo9n+MeivSBoE6asdIbH
16
+ tOW3kk1XtJZ2qQJJRvexFImZc0z8c2cG0+eR5hQxQd9bLnAczi/8mZ8VzaU/O3UU
17
+ OJoVuyp0AA8f2f0f1QDaeH9stWZtJQj3ZX1DWHRE3OmVkoBdlt8EHYGggtvQaLIF
18
+ XbHigLHzYztMjmDt4fmRczu/Fu6M4xNro8jLgjiIjqlLBjDZiKrSbOwgyebwFDlv
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDLDCCAhSgAwIBAgIIEJHFsHrKBGYwDQYJKoZIhvcNAQELBQAwJjEQMA4GA1UE
3
+ ChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTE5MDYxOTA1MTM0NVoX
4
+ DTE5MDkxODExMTg0NVowJjEQMA4GA1UEChMHRmx1ZW50ZDESMBAGA1UEAxMJbG9j
5
+ YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArbUTk5n5RruI
6
+ QGhK1T8g/emKonlfWNMSj/J/f/U9NJ14ugIxyHBMqx4WaTyA4zjT2VJO5tRBe385
7
+ zlIUf8i+x7Ovt/MgsjiwXyKv7qdsE5KHLq+VXJfA+s5vAAyzBHY/BA7xxh/QqCI8
8
+ a/a1OyHyaQ9pFRFXtQBlTH7Fc1qSw5Yg0EXofa6YIBQuDjfqa7FRPj+bEWDO5PUq
9
+ OMzH5XKBUPS9GLHOqia0CnzF2a51TArC0Dl1oNFa7myVmjBuNtkG88Fkd7YNzGa+
10
+ sNBJPmuGvFXuU3XPEnrtARO/SG4g9/MQUvfMI3jFFOJAMmEKd8QXxO5FgIuEnaNO
11
+ hVRVH/e9wwIDAQABo14wXDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB
12
+ BQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPLdOVnVWuuB
13
+ 7Pnvpgte4BHitzFYMA0GCSqGSIb3DQEBCwUAA4IBAQBp8LAzjWIJapwTBnnivwZk
14
+ D6Lr028mZIacbBZKsmmPi0VvDFqCvUAbHN8ytPlRBWnvvkihDkZs1TwcDCXGsWYs
15
+ dNNwsYGpk3mQxsHQ9atvy0mQGLDlfaSs/329bfVCw1cPFo9n+MeivSBoE6asdIbH
16
+ tOW3kk1XtJZ2qQJJRvexFImZc0z8c2cG0+eR5hQxQd9bLnAczi/8mZ8VzaU/O3UU
17
+ OJoVuyp0AA8f2f0f1QDaeH9stWZtJQj3ZX1DWHRE3OmVkoBdlt8EHYGggtvQaLIF
18
+ XbHigLHzYztMjmDt4fmRczu/Fu6M4xNro8jLgjiIjqlLBjDZiKrSbOwgyebwFDlv
19
+ -----END CERTIFICATE-----