embulk 0.6.16 → 0.6.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -45
  3. data/build.gradle +3 -3
  4. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +6 -0
  5. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +73 -1
  6. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamTransactionalFileInput.java +25 -0
  7. data/embulk-core/src/main/java/org/embulk/spi/util/Timestamps.java +53 -0
  8. data/embulk-docs/src/_static/embulk-logo.svg +133 -0
  9. data/embulk-docs/src/release.rst +1 -0
  10. data/embulk-docs/src/release/release-0.6.17.rst +39 -0
  11. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +2 -17
  12. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +3 -22
  13. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +2 -2
  14. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +0 -1
  15. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +18 -42
  16. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +3 -3
  17. data/lib/embulk/command/embulk_new_plugin.rb +40 -14
  18. data/lib/embulk/command/embulk_run.rb +3 -3
  19. data/lib/embulk/data/new/README.md.erb +18 -17
  20. data/lib/embulk/data/new/java/build.gradle.erb +1 -1
  21. data/lib/embulk/data/new/java/decoder.java.erb +53 -9
  22. data/lib/embulk/data/new/java/encoder.java.erb +54 -8
  23. data/lib/embulk/data/new/java/file_input.java.erb +91 -12
  24. data/lib/embulk/data/new/java/file_output.java.erb +35 -8
  25. data/lib/embulk/data/new/java/filter.java.erb +16 -7
  26. data/lib/embulk/data/new/java/formatter.java.erb +16 -7
  27. data/lib/embulk/data/new/java/input.java.erb +18 -14
  28. data/lib/embulk/data/new/java/output.java.erb +16 -8
  29. data/lib/embulk/data/new/java/parser.java.erb +17 -8
  30. data/lib/embulk/data/new/java/plugin_loader.rb.erb +1 -1
  31. data/lib/embulk/data/new/java/test.java.erb +1 -1
  32. data/lib/embulk/data/new/ruby/filter.rb.erb +6 -4
  33. data/lib/embulk/data/new/ruby/formatter.rb.erb +6 -4
  34. data/lib/embulk/data/new/ruby/gemspec.erb +2 -2
  35. data/lib/embulk/data/new/ruby/input.rb.erb +6 -4
  36. data/lib/embulk/data/new/ruby/output.rb.erb +6 -4
  37. data/lib/embulk/data/new/ruby/parser.rb.erb +6 -4
  38. data/lib/embulk/file_input.rb +4 -0
  39. data/lib/embulk/file_output.rb +4 -0
  40. data/lib/embulk/version.rb +1 -1
  41. metadata +8 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0923308ef177929c5e59513c16d318379c5d4993
4
- data.tar.gz: ff6459b193b9635b5f666ffc3f4c878577c06e64
3
+ metadata.gz: c667cedd2e533e4a3404c81baa92618dfd826644
4
+ data.tar.gz: fc3c840b3c855395c02b3d2ba3e84cf3428a8a55
5
5
  SHA512:
6
- metadata.gz: 7a5ee5b44def0c21d59f9a4ea27ba643c086626d681ad342630cd899005c05e1e1ad6fea55eb3aefd21e817cfa371156481522e59f6d5af560bfd16cab0e6f6a
7
- data.tar.gz: cf930364ad7f307871700e9637490d3a445b1a0e78e479727828924e9e947301041c1c87834bbcb3d763e81f39afb98204c8da2fc5a2a4f7cd880b53b25c84a2
6
+ metadata.gz: e30b36e74c05cc9a3f63565691fd4366803be573f9909c1cfcce1292a65a1c7b70a1a6d324990555f89b774c786a8dc1316012f9f9a4330f52c3963573cedaa9
7
+ data.tar.gz: 8299b1e6c264a0031e2de1c557fd1a91eae1d24bf7badfc671e81fdc007421c4cc77dbc40cb8e6c15f66d54bd259be44b925772104055105988a704401f52418
data/README.md CHANGED
@@ -1,58 +1,48 @@
1
1
  # What's Embulk?
2
2
 
3
- Embulk is a plugin-based parallel bulk data loader that helps **data transfer** between various **storages**, **databases**, **NoSQL** and **cloud services**.
3
+ Embulk is a parallel bulk data loader that **helps data transfer between various storages, databases, NoSQL and cloud services**.
4
4
 
5
- You can release plugins to share your efforts of data cleaning, error handling, transaction control, and retrying. Packaging efforts into plugins **brings OSS-style development to the data scripts** which **was tend to be one-time adhoc scripts**.
6
-
7
- [Embulk, an open-source plugin-based parallel bulk data loader](http://www.slideshare.net/frsyuki/embuk-making-data-integration-works-relaxed) at Slideshare
5
+ **Embulk supports plugins** to add functions. You can [share the plugins](http://www.embulk.org/plugins/) to keep your custom scripts readable, maintainable, and reusable.
8
6
 
9
7
  [![Embulk](https://gist.githubusercontent.com/frsyuki/f322a77ee2766a508ba9/raw/e8539b6b4fda1b3357e8c79d3966aa8148dbdbd3/embulk-overview.png)](http://www.slideshare.net/frsyuki/embuk-making-data-integration-works-relaxed/12)
8
+ [Embulk, an open-source plugin-based parallel bulk data loader](http://www.slideshare.net/frsyuki/embuk-making-data-integration-works-relaxed) at Slideshare
10
9
 
11
10
  # Document
12
11
 
13
- * [Quick Start](#quick-start)
14
- * [Using plugins](#using-plugins)
15
- * [Using plugin bundle](#using-plugin-bundle)
16
- * [Releasing plugins to RubyGems](#releasing-plugins-to-rubygems)
17
- * [Resuming a failed transaction](#resuming-a-failed-transaction)
18
- * [Embulk Development](#embulk-development)
19
- * [Build](#build)
20
- * [Release](#release)
12
+ Embulk documents: http://www.embulk.org/docs/
21
13
 
22
14
  ## Quick Start
23
15
 
24
- The single-file package is the simplest way to try Embulk. You can download the latest embulk-VERSION.jar from [the releases page](https://bintray.com/embulk/maven/embulk/view#files) and run it with java.
25
-
26
16
  ### Linux & Mac & BSD
27
17
 
28
- Embulk is a Java application. Please make sure that you installed [Java](http://www.oracle.com/technetwork/java/javase/downloads/index.html).
18
+ Embulk is a Java application. Please make sure that [Java](http://www.oracle.com/technetwork/java/javase/downloads/index.html) is installed.
29
19
 
30
20
  Following 4 commands install embulk to your home directory:
31
21
 
32
- ```
22
+ ```sh
33
23
  curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
34
24
  chmod +x ~/.embulk/bin/embulk
35
25
  echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
36
26
  source ~/.bashrc
37
27
  ```
38
28
 
39
- Next step: [Trying the example](#trying-the-example)
29
+ Next step: [Running example in 4 commands](#running-example)
40
30
 
41
31
  ### Windows
42
32
 
43
- Embulk is a Java application. Please make sure that you installed [Java](http://www.oracle.com/technetwork/java/javase/downloads/index.html).
33
+ Embulk is a Java application. Please make sure that [Java](http://www.oracle.com/technetwork/java/javase/downloads/index.html) is installed.
44
34
 
45
- You can assume the jar file is a .bat file.
35
+ You can download `embulk.bat` using this command on cmd.exe or PowerShell.exe:
46
36
 
47
37
  ```
48
38
  PowerShell -Command "& {Invoke-WebRequest http://dl.embulk.org/embulk-latest.jar -OutFile embulk.bat}"
49
39
  ```
50
40
 
51
- Next step: [Trying the example](#trying-the-example)
41
+ Next step: [Running example in 4 commands](#running-example)
52
42
 
53
- ### Trying the example
43
+ ### Running example
54
44
 
55
- Let's load a CSV file, for example. `embulk example` subcommand generates a csv file and config file for you.
45
+ `embulk example` command generates a sample CSV file so that you can try embulk quickly:
56
46
 
57
47
  ```
58
48
  embulk example ./try1
@@ -78,9 +68,10 @@ embulk gem list
78
68
 
79
69
  Embulk bundles some built-in plugins such as `embulk-encoder-gzip` or `embulk-formatter-csv`. You can use those plugins with following configuration file:
80
70
 
81
- ```
71
+ ```yaml
82
72
  in:
83
- # ...
73
+ type: file
74
+ path_prefix: "./try1/csv/sample_"
84
75
  out:
85
76
  type: command
86
77
  command: "cat - > task.$INDEX.$SEQID.csv.gz"
@@ -90,27 +81,6 @@ out:
90
81
  type: csv
91
82
  ```
92
83
 
93
- ### Using plugin bundle
94
-
95
- `embulk bundle` subcommand creates (or updates if already exists) a private (isolated) bundle of a plugins.
96
- You can use the bundle using `-b <bundle_dir>` option. `embulk bundle` also generates some example plugins to \<bundle_dir>/embulk/\*.rb directory.
97
-
98
- See the generated \<bundle_dir>/Gemfile file how to plugin bundles work.
99
-
100
- ```
101
- embulk bundle ./embulk_bundle
102
- embulk guess -b ./embulk_bundle ...
103
- embulk run -b ./embulk_bundle ...
104
- ```
105
-
106
- ### Releasing plugins to RubyGems
107
-
108
- TODO: documents
109
-
110
- ```
111
- embulk-plugin-xyz
112
- ```
113
-
114
84
  ### Resuming a failed transaction
115
85
 
116
86
  Embulk supports resuming failed transactions.
@@ -132,6 +102,24 @@ If you give up on resuming the transaction, you can use `embulk cleanup` subcomm
132
102
  embulk cleanup config.yml -r resume-state.yml
133
103
  ```
134
104
 
105
+ ### Using plugin bundle
106
+
107
+ `embulk bundle` subcommand creates (or updates if already exists) a private (isolated) bundle of a plugins.
108
+ You can use the bundle using `-b <bundle_dir>` option. `embulk bundle` also generates some example plugins to \<bundle_dir>/embulk/\*.rb directory.
109
+
110
+ See the generated \<bundle_dir>/Gemfile file how to plugin bundles work.
111
+
112
+ ```
113
+ embulk bundle ./embulk_bundle
114
+ embulk guess -b ./embulk_bundle ...
115
+ embulk run -b ./embulk_bundle ...
116
+ ```
117
+
118
+ ## Use cases
119
+
120
+ * [Scheduled bulk data loading to Elasticsearch + Kibana 4 from CSV files](http://www.embulk.org/docs/recipe/scheduled-csv-load-to-elasticsearch-kibana4.html)
121
+
122
+ For further details, visit [Embulk documentation](http://www.embulk.org/docs/).
135
123
 
136
124
  ## Embulk Development
137
125
 
data/build.gradle CHANGED
@@ -11,7 +11,7 @@ def release_projects = [project(":embulk-core"), project(":embulk-standards")]
11
11
 
12
12
  allprojects {
13
13
  group = 'org.embulk'
14
- version = '0.6.16'
14
+ version = '0.6.17'
15
15
 
16
16
  ext {
17
17
  jrubyVersion = '1.7.19'
@@ -282,9 +282,9 @@ Manual operations:
282
282
  bintrayUpload.mustRunAfter('releaseCheck')
283
283
  rubyGemsUpload.mustRunAfter('releaseCheck')
284
284
 
285
- task set_version << {
285
+ task setVersion << {
286
286
  if (!project.hasProperty("to")) {
287
- throw new GradleException("Usage: ./gradlew -Pto=VERSION")
287
+ throw new GradleException("Usage: ./gradlew setVersion -Pto=VERSION")
288
288
  }
289
289
 
290
290
  File gradle_ver = file('build.gradle')
@@ -10,6 +10,7 @@ import org.embulk.config.ConfigDiff;
10
10
  import org.embulk.config.ConfigSource;
11
11
  import org.embulk.config.TaskSource;
12
12
  import org.embulk.plugin.PluginType;
13
+ import org.embulk.spi.time.Timestamp;
13
14
 
14
15
  public class Exec
15
16
  {
@@ -43,6 +44,11 @@ public class Exec
43
44
  return session().getInjector();
44
45
  }
45
46
 
47
+ public static Timestamp getTransactionTime()
48
+ {
49
+ return session().getTransactionTime();
50
+ }
51
+
46
52
  public static Logger getLogger(String name)
47
53
  {
48
54
  return session().getLogger(name);
@@ -19,7 +19,13 @@ public class InputStreamFileInput
19
19
  public void close() throws IOException;
20
20
  }
21
21
 
22
- public static class IteratorProvider implements Provider {
22
+ public interface Opener
23
+ {
24
+ public InputStream open() throws IOException;
25
+ }
26
+
27
+ public static class IteratorProvider implements Provider
28
+ {
23
29
  private Iterator<InputStream> iterator;
24
30
 
25
31
  public IteratorProvider(Iterable<InputStream> iterable)
@@ -32,6 +38,7 @@ public class InputStreamFileInput
32
38
  this.iterator = iterator;
33
39
  }
34
40
 
41
+ @Override
35
42
  public InputStream openNext() throws IOException
36
43
  {
37
44
  if (!iterator.hasNext()) {
@@ -49,6 +56,61 @@ public class InputStreamFileInput
49
56
  }
50
57
  }
51
58
 
59
+ private static class OpenerProvider implements Provider
60
+ {
61
+ private Opener opener;
62
+
63
+ public OpenerProvider(Opener opener)
64
+ {
65
+ this.opener = opener;
66
+ }
67
+
68
+ @Override
69
+ public InputStream openNext() throws IOException
70
+ {
71
+ if (opener == null) {
72
+ return null;
73
+ }
74
+ InputStream stream = opener.open();
75
+ opener = null;
76
+ return stream;
77
+ }
78
+
79
+ @Override
80
+ public void close() throws IOException
81
+ { }
82
+ }
83
+
84
+ private static class InputStreamProvider implements Provider
85
+ {
86
+ private InputStream input;
87
+
88
+ public InputStreamProvider(InputStream input)
89
+ {
90
+ this.input = input;
91
+ }
92
+
93
+ @Override
94
+ public InputStream openNext() throws IOException
95
+ {
96
+ if (input == null) {
97
+ return null;
98
+ }
99
+ InputStream ret = input;
100
+ input = null;
101
+ return ret;
102
+ }
103
+
104
+ @Override
105
+ public void close() throws IOException
106
+ {
107
+ if (input != null) {
108
+ input.close();
109
+ input = null;
110
+ }
111
+ }
112
+ }
113
+
52
114
  private final BufferAllocator allocator;
53
115
  private final Provider provider;
54
116
  private InputStream current;
@@ -60,6 +122,16 @@ public class InputStreamFileInput
60
122
  this.current = null;
61
123
  }
62
124
 
125
+ public InputStreamFileInput(BufferAllocator allocator, Opener opener)
126
+ {
127
+ this(allocator, new OpenerProvider(opener));
128
+ }
129
+
130
+ public InputStreamFileInput(BufferAllocator allocator, InputStream openedStream)
131
+ {
132
+ this(allocator, new InputStreamProvider(openedStream));
133
+ }
134
+
63
135
  public Buffer poll()
64
136
  {
65
137
  // TODO check current != null and throw Illegal State - file is not opened
@@ -0,0 +1,25 @@
1
+ package org.embulk.spi.util;
2
+
3
+ import java.io.InputStream;
4
+ import org.embulk.spi.TransactionalFileInput;
5
+ import org.embulk.spi.BufferAllocator;
6
+
7
+ public abstract class InputStreamTransactionalFileInput
8
+ extends InputStreamFileInput
9
+ implements TransactionalFileInput
10
+ {
11
+ public InputStreamTransactionalFileInput(BufferAllocator allocator, Provider provider)
12
+ {
13
+ super(allocator, provider);
14
+ }
15
+
16
+ public InputStreamTransactionalFileInput(BufferAllocator allocator, Opener opener)
17
+ {
18
+ super(allocator, opener);
19
+ }
20
+
21
+ public InputStreamTransactionalFileInput(BufferAllocator allocator, InputStream openedStream)
22
+ {
23
+ super(allocator, openedStream);
24
+ }
25
+ }
@@ -0,0 +1,53 @@
1
+ package org.embulk.spi.util;
2
+
3
+ import java.util.Map;
4
+ import com.google.common.base.Optional;
5
+ import org.embulk.config.Task;
6
+ import org.embulk.spi.Column;
7
+ import org.embulk.spi.Schema;
8
+ import org.embulk.spi.ColumnConfig;
9
+ import org.embulk.spi.SchemaConfig;
10
+ import org.embulk.spi.time.TimestampFormatter;
11
+ import org.embulk.spi.type.TimestampType;
12
+ import org.embulk.spi.time.TimestampParser;
13
+ import org.embulk.spi.SchemaConfig;
14
+
15
+ public class Timestamps
16
+ {
17
+ private Timestamps() { }
18
+
19
+ private interface TimestampColumnOption
20
+ extends Task, TimestampParser.TimestampColumnOption
21
+ { }
22
+
23
+ public static TimestampParser[] newTimestampColumnParsers(
24
+ TimestampParser.Task parserTask, SchemaConfig schema)
25
+ {
26
+ TimestampParser[] parsers = new TimestampParser[schema.getColumnCount()];
27
+ int i = 0;
28
+ for (ColumnConfig column : schema.getColumns()) {
29
+ if (column.getType() instanceof TimestampType) {
30
+ TimestampColumnOption option = column.getOption().loadConfig(TimestampColumnOption.class);
31
+ parsers[i] = new TimestampParser(parserTask, option);
32
+ }
33
+ i++;
34
+ }
35
+ return parsers;
36
+ }
37
+
38
+ public static TimestampFormatter[] newTimestampColumnFormatters(
39
+ TimestampFormatter.Task formatterTask, Schema schema,
40
+ Map<String, ? extends TimestampFormatter.TimestampColumnOption> columnOptions)
41
+ {
42
+ TimestampFormatter[] formatters = new TimestampFormatter[schema.getColumnCount()];
43
+ int i = 0;
44
+ for (Column column : schema.getColumns()) {
45
+ if (column.getType() instanceof TimestampType) {
46
+ Optional<TimestampFormatter.TimestampColumnOption> option = Optional.fromNullable(columnOptions.get(column.getName()));
47
+ formatters[i] = new TimestampFormatter(formatterTask, option);
48
+ }
49
+ i++;
50
+ }
51
+ return formatters;
52
+ }
53
+ }
@@ -0,0 +1,133 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="466px" height="268px" viewBox="0 0 466 268" enable-background="new 0 0 466 268" xml:space="preserve">
6
+ <g>
7
+ <path fill="#EF4F39" d="M124.753,173.479c0,0,7.781,2.789,8.031,6.721c0.57,8.859,5.539,30.307-0.93,30.686
8
+ c-8.516,0.502-20.797-12.975-24.602-22.738c-5.82-14.951-4.18-19.992-4.18-19.992L124.753,173.479z"/>
9
+ <g>
10
+ <g>
11
+ <path fill="#1F1F1F" d="M38.015,225.368c1.477,4.021,3.523,7.008,6.141,8.953s5.891,2.918,9.828,2.918
12
+ c2.859,0,5.742-0.58,8.648-1.744c0.762-0.312,3.422-1.586,7.984-3.822c1.383-0.672,2.93-1.006,4.625-1.006
13
+ c2.328,0,4.297,1.051,5.906,3.152c1.34,1.699,2.012,3.398,2.012,5.096c0,3.803-2.707,7.246-8.113,10.33
14
+ c-6.488,3.713-13.844,5.57-22.07,5.57c-12.297,0-21.98-4.273-29.047-12.814c-5.094-6.17-7.645-13.592-7.645-22.268
15
+ c0-11.762,3.777-21.152,11.336-28.172c6.527-6.037,14.266-9.057,23.207-9.057c7.828,0,14.781,2.416,20.859,7.246
16
+ c5.859,4.695,9.75,11.066,11.672,19.115c0.672,2.863,1.008,5.725,1.008,8.586c0,5.277-2.93,7.916-8.789,7.916H38.015z
17
+ M64.511,211.616c-0.848-3.264-1.832-5.701-2.949-7.312c-2.414-3.531-5.812-5.299-10.195-5.299c-3.758,0-6.953,1.365-9.594,4.094
18
+ c-1.699,1.787-3.195,4.627-4.492,8.518H64.511z"/>
19
+ <path fill="#1F1F1F" d="M112.202,189.481c2.367-2.102,4.539-3.623,6.508-4.561c3.352-1.609,7.133-2.416,11.336-2.416
20
+ c5.23,0,9.812,1.117,13.75,3.354c1.742,0.984,3.598,2.797,5.566,5.434c3.355-2.727,6.215-4.693,8.586-5.902
21
+ c3.934-1.922,8.16-2.885,12.676-2.885c6.977,0,12.742,2.215,17.305,6.641c4.609,4.518,6.91,10.061,6.91,16.635v35.146
22
+ c0,3.848-0.449,6.666-1.34,8.451c-0.762,1.432-1.957,2.627-3.59,3.59c-1.633,0.961-3.344,1.443-5.129,1.443
23
+ c-1.793,0-3.5-0.469-5.133-1.41c-1.633-0.939-2.828-2.146-3.59-3.623c-0.895-1.785-1.34-4.604-1.34-8.451v-30.652
24
+ c0-2.951-0.895-5.342-2.684-7.176c-2.012-2.146-4.559-3.221-7.645-3.221c-3.133,0-5.75,1.051-7.852,3.154
25
+ c-1.875,1.832-2.816,4.246-2.816,7.242v30.652c0,3.805-0.449,6.621-1.34,8.451c-0.762,1.477-1.957,2.684-3.59,3.623
26
+ c-1.633,0.941-3.344,1.41-5.129,1.41c-1.789,0-3.5-0.469-5.133-1.41c-1.633-0.939-2.828-2.146-3.59-3.623
27
+ c-0.895-1.785-1.34-4.604-1.34-8.451v-28.641c0-4.066-0.961-7.152-2.887-9.254c-1.922-2.104-4.449-3.154-7.578-3.154
28
+ c-3.086,0-5.699,1.098-7.848,3.287c-1.789,1.879-2.68,4.248-2.68,7.109v30.652c0,3.805-0.453,6.621-1.344,8.451
29
+ c-0.762,1.477-1.957,2.684-3.59,3.623c-1.633,0.941-3.34,1.41-5.133,1.41c-1.785,0-3.496-0.469-5.129-1.41
30
+ c-1.633-0.939-2.828-2.146-3.59-3.623c-0.895-1.785-1.34-4.604-1.34-8.451v-46.414c0-3.398,0.848-6.127,2.547-8.186
31
+ c1.879-2.279,4.336-3.42,7.379-3.42c2.594,0,4.809,0.873,6.641,2.617C109.897,186.284,110.952,187.603,112.202,189.481z"/>
32
+ <path fill="#1F1F1F" d="M112.202,189.481c2.367-2.102,4.539-3.623,6.508-4.561c3.352-1.609,7.133-2.416,11.336-2.416
33
+ c5.23,0,9.812,1.117,13.75,3.354c1.742,0.984,3.598,2.797,5.566,5.434c3.355-2.727,6.215-4.693,8.586-5.902
34
+ c3.934-1.922,8.16-2.885,12.676-2.885c6.977,0,12.742,2.215,17.305,6.641c4.609,4.518,6.91,10.061,6.91,16.635v35.146
35
+ c0,3.848-0.449,6.666-1.34,8.451c-0.762,1.432-1.957,2.627-3.59,3.59c-1.633,0.961-3.344,1.443-5.129,1.443
36
+ c-1.793,0-3.5-0.469-5.133-1.41c-1.633-0.939-2.828-2.146-3.59-3.623c-0.895-1.785-1.34-4.604-1.34-8.451v-30.652
37
+ c0-2.951-0.895-5.342-2.684-7.176c-2.012-2.146-4.559-3.221-7.645-3.221c-3.133,0-5.75,1.051-7.852,3.154
38
+ c-1.875,1.832-2.816,4.246-2.816,7.242v30.652c0,3.805-0.449,6.621-1.34,8.451c-0.762,1.477-1.957,2.684-3.59,3.623
39
+ c-1.633,0.941-3.344,1.41-5.129,1.41c-1.789,0-3.5-0.469-5.133-1.41c-1.633-0.939-2.828-2.146-3.59-3.623
40
+ c-0.895-1.785-1.34-4.604-1.34-8.451v-28.641c0-4.066-0.961-7.152-2.887-9.254c-1.922-2.104-4.449-3.154-7.578-3.154
41
+ c-3.086,0-5.699,1.098-7.848,3.287c-1.789,1.879-2.68,4.248-2.68,7.109v30.652c0,3.805-0.453,6.621-1.344,8.451
42
+ c-0.762,1.477-1.957,2.684-3.59,3.623c-1.633,0.941-3.34,1.41-5.133,1.41c-1.785,0-3.496-0.469-5.129-1.41
43
+ c-1.633-0.939-2.828-2.146-3.59-3.623c-0.895-1.785-1.34-4.604-1.34-8.451v-46.414c0-3.398,0.848-6.127,2.547-8.186
44
+ c1.879-2.279,4.336-3.42,7.379-3.42c2.594,0,4.809,0.873,6.641,2.617C109.897,186.284,110.952,187.603,112.202,189.481z"/>
45
+ </g>
46
+ </g>
47
+ <g>
48
+ <path fill="#FFFFFF" d="M32.706,101.839c0,0,12.794,37.536,28.406,50.635c23.352,19.592,42.266,24.008,63.57,26.375
49
+ c27.992,3.109,68.055,0.375,76.672-3.381c19.914-8.666,36.523-27.725,41.93-43.279c5.414-15.557-82.844-32.125-82.844-32.125
50
+ l-30.766-13.865c0,0-19.617-10.143-26.719-6.76c-7.102,3.381-13.859,5.748-19.273,7.1c-5.406,1.354-13.523,0.338-22.656,2.029
51
+ C51.901,90.257,32.706,101.839,32.706,101.839z"/>
52
+ <path fill="#EF4F39" d="M32.331,101.245c0,0,0.391,10.795,3.898,14.678c4.727,5.23,3.203,11.189,13.461,25.664
53
+ c13.281,18.732,38.328,36.789,89.406,38.908c50.391,2.094,50.086-1.395,50.086-1.395s-6.891,1.152-44.25-0.252
54
+ c-23.625-0.889-56.344-5.354-75.016-20.842c-17.734-14.709-24.203-24.42-29.125-39.309c-2.094-6.34-5.797-6.422-5.992-15.996
55
+ C34.776,101.249,32.331,101.245,32.331,101.245z"/>
56
+ <g>
57
+ <path fill="#F16523" d="M195.331,176.63c0,0,5.219-1.023,11.352-4.504c8.711-4.943,14.773-11.02,15.852-11.918
58
+ c4.883-4.057,15.219-16.484,15.219-16.484c-0.414,0.613-5.562,9.764-12.305,15.977c-4.484,4.133-1.898,2.156-9.25,7.861
59
+ c-9.078,7.043-22,11.92-22,11.92"/>
60
+ <path fill="#F16523" d="M284.198,12.147c0,0-7.016,13.777-24.008,15.553c-11.57,1.211-13.188,11.16-13.188,11.16
61
+ s-4.055-10.652-14.453-12.174c-15.477-2.264-20.375-13.525-20.375-13.525c-4.391,16.23,0.68,24.346,3.383,28.404
62
+ c5.188,7.781,18.258,9.469,21.305,16.23c3.039,6.764,0.672,11.498-2.703,27.391c-3.383,15.893-19.281,12.848-32.125,11.156
63
+ c-7.117-0.934-18.672-8.105-41.508-16.402c0.242-4.438-2.695-9.434-1.016-16.23c6.086-24.6,24.094-34.361,12.938-32.715
64
+ c-8.805,1.301-50.031,32.121-56.523,36.102c-8.344-1.617-17.086-2.822-26.156-3.387c-31.359-1.947-39.305,14.033-48.945,20.627
65
+ c-17.148,11.734-8.07,17.84-8.07,17.84s28.812,1.553,40.109,3.975c9.469,2.027,32.125,8.453,33.812,11.496
66
+ c1.695,3.043,4.398,11.834,12.516,10.145c8.109-1.691,8.75-7.969,8.75-7.969c-0.344,9.131,6.805,21.156,14.242,31.639
67
+ s19.273,13.188,19.273,13.188c2.031,25.359-11.562,49.064-8.031,49.195c23.844,0.889,38.156-23.922,40.453-28.275
68
+ c4.82-9.131,3.297-19.656,3.297-19.656c42.266-8.113,49.461-34.107,53.203-45.637c6.344-19.529,3.055-59.438,3.055-59.438
69
+ s8.789-0.676,20.961-9.467C286.565,42.579,284.198,12.147,284.198,12.147z"/>
70
+ </g>
71
+ <path fill="#FFFFFF" d="M107.753,97.312c0,0-0.617-14.115,18.625-10.881s19.953,13.1,4.945,17.168
72
+ C116.323,107.669,108.065,103.565,107.753,97.312z"/>
73
+ <g>
74
+ <circle fill="#1F1F1F" cx="101.776" cy="92.2" r="4.312"/>
75
+ <path fill="#FFFFFF" d="M101.776,96.761c-2.516,0-4.562-2.046-4.562-4.561c0-2.516,2.047-4.562,4.562-4.562
76
+ s4.562,2.047,4.562,4.562C106.339,94.715,104.292,96.761,101.776,96.761z M101.776,88.138c-2.24,0-4.062,1.822-4.062,4.062
77
+ c0,2.239,1.822,4.061,4.062,4.061s4.062-1.822,4.062-4.061C105.839,89.96,104.017,88.138,101.776,88.138z"/>
78
+ <path fill="#FFFFFF" d="M104.394,90.595c0,0.512-0.414,0.928-0.93,0.928c-0.508,0-0.93-0.416-0.93-0.928
79
+ c0-0.516,0.422-0.932,0.93-0.932C103.979,89.663,104.394,90.079,104.394,90.595z"/>
80
+ </g>
81
+ <g>
82
+ <path fill="#EF4F39" d="M164.237,161.2c-1.523,0.254-4.141,0.254-9.383-1.184c-4.789-1.311-12.648-9.082-13.984-10.43
83
+ c0.438,0.631,0.875,1.254,1.312,1.875c7.438,10.482,19.273,13.188,19.273,13.188c1.969,24.617-10.773,47.672-8.297,49.121
84
+ c0.008-0.064,0.094-0.949,0.258-1.764c0.164-0.846,0.594-2.283,1.266-3.805c0.68-1.521,10.062-18.682,12.172-26.543
85
+ c2.117-7.861,1.188-21.727,1.188-21.727S165.761,160.948,164.237,161.2z"/>
86
+ <path fill="#EF4F39" d="M122.995,115.067c0,0,2.531-7.607,10.648-6.086s5.328,10.271,5.328,10.271s0.031-6.586-5.711-7.734
87
+ C128.19,110.503,122.995,115.067,122.995,115.067z"/>
88
+ <path fill="#EF4F39" d="M117.237,126.362c-5.328-0.635-5.711-8.242-9.891-11.287c-3.484-2.529-25.367-9.129-34.242-11.031
89
+ s-36.266-3.803-38.547-3.93s-2.914-3.043-3.297-3.553c-0.242-0.326,0.25-2.391,0.633-3.816c-3.898,6.225,0.859,9.432,0.859,9.432
90
+ s28.812,1.553,40.109,3.975c9.469,2.027,32.125,8.453,33.812,11.496c1.695,3.043,4.398,11.834,12.516,10.145
91
+ c8.109-1.691,8.75-7.969,8.75-7.969S122.144,126.946,117.237,126.362z"/>
92
+ <path fill="#EF4F39" d="M251.394,111.146c-1.352,7.1-6.594,22.994-16.398,32.799c-6.102,6.098-15.898,10.652-23.672,14.203
93
+ c-6.266,2.859-15.219,3.887-15.219,3.887l1.07,3.879c42.266-8.113,49.461-34.107,53.203-45.637
94
+ c2.305-7.115,3.344-16.934,3.719-26.541C253.448,98.396,252.308,106.351,251.394,111.146z"/>
95
+ </g>
96
+ </g>
97
+ <rect x="133.667" y="203.567" fill="#1F1F1F" width="20.055" height="21.766"/>
98
+ <g>
99
+ <g>
100
+ <path fill="#1F1F1F" d="M226.835,188.409c2.816-2.104,5.188-3.512,7.109-4.227c2.992-1.162,6.059-1.744,9.188-1.744
101
+ c8.32,0,15.586,3.379,21.801,10.127c6.348,6.889,9.527,15.496,9.527,25.826c0,11.402-3.555,20.658-10.668,27.77
102
+ c-5.723,5.768-12.543,8.654-20.457,8.654c-4.609,0-8.562-1.031-11.875-3.086c-1.516-0.984-3.148-2.619-4.895-4.896
103
+ c-2.059,5.051-5.23,7.578-9.527,7.578c-2.637,0-4.961-0.85-6.973-2.549c-2.238-1.967-3.355-4.697-3.355-8.182v-77.543
104
+ c0-3.799,0.449-6.594,1.344-8.383c0.758-1.477,1.953-2.684,3.59-3.623c1.629-0.939,3.34-1.408,5.129-1.408s3.5,0.469,5.133,1.408
105
+ s2.828,2.146,3.586,3.623c0.895,1.789,1.344,4.584,1.344,8.383V188.409z M240.519,201.22c-3.758,0-7.02,1.631-9.793,4.896
106
+ c-2.684,3.219-4.023,7.379-4.023,12.477c0,5.141,1.34,9.324,4.023,12.543c2.773,3.264,6.078,4.896,9.926,4.896
107
+ c4.16,0,7.488-1.746,9.996-5.23c2.457-3.49,3.688-7.535,3.688-12.143c0-4.695-1.23-8.742-3.688-12.143
108
+ C248.097,202.987,244.718,201.22,240.519,201.22z"/>
109
+ <path fill="#1F1F1F" d="M345.358,196.39v29.916c0,6.842-1.637,12.387-4.898,16.635c-2.773,3.578-6.352,6.396-10.734,8.451
110
+ c-4.918,2.324-10.148,3.488-15.695,3.488c-7.781,0-14.598-2.078-20.457-6.238c-4.559-3.221-7.645-7.064-9.258-11.537
111
+ c-1.074-3.037-1.605-6.641-1.605-10.799V196.39c0-3.801,0.445-6.617,1.336-8.451c0.762-1.477,1.949-2.684,3.559-3.623
112
+ c1.605-0.938,3.332-1.408,5.164-1.408c1.789,0,3.496,0.471,5.129,1.408c1.633,0.939,2.828,2.146,3.59,3.623
113
+ c0.895,1.789,1.34,4.607,1.34,8.451v27.434c0,2.818,0.449,4.945,1.344,6.373c2.281,3.668,5.57,5.502,9.859,5.502
114
+ c3.129,0,5.793-1.074,7.984-3.221c2.145-2.059,3.219-4.941,3.219-8.654V196.39c0-3.844,0.445-6.662,1.34-8.451
115
+ c0.762-1.477,1.957-2.684,3.59-3.623c1.633-0.938,3.344-1.408,5.133-1.408c1.785,0,3.5,0.471,5.129,1.408
116
+ c1.633,0.939,2.828,2.146,3.59,3.623C344.909,189.728,345.358,192.546,345.358,196.39z"/>
117
+ <path fill="#1F1F1F" d="M377.351,166.138v74.789c0,3.848-0.445,6.666-1.344,8.451c-0.758,1.477-1.953,2.684-3.586,3.623
118
+ c-1.633,0.941-3.344,1.41-5.133,1.41s-3.5-0.469-5.129-1.41c-1.633-0.939-2.832-2.146-3.59-3.623
119
+ c-0.895-1.785-1.344-4.604-1.344-8.451v-74.789c0-3.799,0.449-6.594,1.344-8.383c0.758-1.477,1.957-2.684,3.59-3.623
120
+ c1.629-0.939,3.34-1.408,5.129-1.408s3.5,0.469,5.133,1.408s2.828,2.146,3.586,3.623
121
+ C376.905,159.544,377.351,162.339,377.351,166.138z"/>
122
+ <path fill="#1F1F1F" d="M409.343,220.403v20.523c0,3.805-0.445,6.621-1.34,8.451c-0.762,1.477-1.957,2.684-3.586,3.623
123
+ c-1.633,0.941-3.344,1.41-5.133,1.41s-3.496-0.469-5.129-1.41c-1.633-0.939-2.828-2.146-3.594-3.623
124
+ c-0.891-1.785-1.34-4.604-1.34-8.451v-74.789c0-3.799,0.449-6.594,1.34-8.383c0.766-1.477,1.961-2.684,3.594-3.623
125
+ s3.34-1.408,5.129-1.408s3.5,0.469,5.133,1.408c1.629,0.939,2.824,2.146,3.586,3.623c0.895,1.789,1.34,4.584,1.34,8.383v40.582
126
+ l18.516-18.982c3.445-3.533,6.527-5.299,9.258-5.299c2.727,0,5.051,0.984,6.977,2.951c1.922,1.924,2.883,4.227,2.883,6.908
127
+ c0,1.969-0.738,3.936-2.215,5.904c-0.488,0.625-1.566,1.744-3.219,3.354l-12.609,12.072l17.641,21.936
128
+ c2.902,3.578,4.355,6.551,4.355,8.918c0,3.178-1.27,5.793-3.82,7.85c-1.836,1.432-3.957,2.146-6.375,2.146
129
+ c-2.41,0-4.672-0.961-6.77-2.885c-0.629-0.58-1.656-1.787-3.09-3.621L409.343,220.403z"/>
130
+ </g>
131
+ </g>
132
+ </g>
133
+ </svg>