docxtor 0.1.1

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 (56) hide show
  1. data/.coveralls.yml +1 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +4 -0
  6. data/.wrong +1 -0
  7. data/Gemfile +18 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +117 -0
  10. data/Rakefile +7 -0
  11. data/TODO.md +5 -0
  12. data/docxtor.gemspec +32 -0
  13. data/lib/docxtor.rb +30 -0
  14. data/lib/docxtor/document/builder.rb +32 -0
  15. data/lib/docxtor/document/element.rb +96 -0
  16. data/lib/docxtor/document/heading.rb +13 -0
  17. data/lib/docxtor/document/page_break.rb +14 -0
  18. data/lib/docxtor/document/paragraph.rb +125 -0
  19. data/lib/docxtor/document/root.rb +17 -0
  20. data/lib/docxtor/document/table_of_contents.rb +95 -0
  21. data/lib/docxtor/generator.rb +13 -0
  22. data/lib/docxtor/package/builder.rb +35 -0
  23. data/lib/docxtor/package/part.rb +12 -0
  24. data/lib/docxtor/template_parser.rb +38 -0
  25. data/lib/docxtor/version.rb +3 -0
  26. data/spec/docxtor/document/builder_spec.rb +16 -0
  27. data/spec/docxtor/document/heading_spec.rb +9 -0
  28. data/spec/docxtor/document/paragraph_spec.rb +56 -0
  29. data/spec/docxtor/document/root_spec.rb +20 -0
  30. data/spec/docxtor/document/table_of_contents_spec.rb +18 -0
  31. data/spec/docxtor/docxtor_spec.rb +13 -0
  32. data/spec/docxtor/package/builder_spec.rb +37 -0
  33. data/spec/docxtor/package/part_spec.rb +16 -0
  34. data/spec/docxtor/prerequisites_spec.rb +9 -0
  35. data/spec/docxtor/support/contexts/integration_context.rb +6 -0
  36. data/spec/docxtor/support/contexts/xml_builder_context.rb +11 -0
  37. data/spec/docxtor/support/examples/.gitkeep +0 -0
  38. data/spec/docxtor/support/matchers/wordprocessingml_matchers.rb +42 -0
  39. data/spec/docxtor/support/matchers/xpath_matchers.rb +46 -0
  40. data/spec/docxtor/template_parser_spec.rb +18 -0
  41. data/spec/spec_helper.rb +35 -0
  42. data/templates/.gitkeep +0 -0
  43. data/templates/default/[Content_Types].xml +16 -0
  44. data/templates/default/_rels/.rels +4 -0
  45. data/templates/default/word/_rels/document.xml.rels +13 -0
  46. data/templates/default/word/endnotes.xml +17 -0
  47. data/templates/default/word/fontTable.xml +31 -0
  48. data/templates/default/word/footer1.xml +35 -0
  49. data/templates/default/word/footer2.xml +48 -0
  50. data/templates/default/word/footnotes.xml +17 -0
  51. data/templates/default/word/numbering.xml +212 -0
  52. data/templates/default/word/settings.xml +107 -0
  53. data/templates/default/word/styles.xml +368 -0
  54. data/templates/default/word/theme/theme1.xml +2 -0
  55. data/templates/default/word/websettings.xml +4 -0
  56. metadata +265 -0
File without changes
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ require File.expand_path('xpath_matchers', File.dirname(__FILE__))
3
+
4
+ module WordprocessingMLMatchers
5
+ extend RSpec::Matchers::DSL
6
+ include XPathMatchers
7
+
8
+ def contain_body
9
+ exist_xpath('//w:document/w:body')
10
+ end
11
+
12
+ def contain_paragraph_text
13
+ exist_xpath('//w:p/w:r/w:t')
14
+ end
15
+
16
+ def contain_paragraph_run
17
+ exist_xpath('//w:p/w:r')
18
+ end
19
+
20
+ def contain_element_property(el, prop)
21
+ exist_xpath("//w:#{el}/w:#{el}Pr/w:#{prop}")
22
+ end
23
+
24
+ def contain_element_style(el)
25
+ contain_element_property(el, 'pStyle')
26
+ end
27
+
28
+ # TODO: These a not the same, fix it
29
+
30
+ def contain_gallery_of_document_parts
31
+ exist_xpath('//w:sdt/w:sdtPr/w:docPartObj/w:docPartGallery')
32
+ end
33
+
34
+ def contain_sdt_content_heading
35
+ exist_xpath('//w:sdt/w:sdtPr/w:docPartObj/w:docPartGallery')
36
+ end
37
+
38
+ def contain_table_of_contents
39
+ contain_gallery_of_document_parts &&
40
+ contain_sdt_content_heading
41
+ end
42
+ end
@@ -0,0 +1,46 @@
1
+ module XPathMatchers
2
+ extend RSpec::Matchers::DSL
3
+ include RSpecXML::XMLMatchers
4
+
5
+ EXPR_PREFIX = '//'
6
+ LOCAL_NAME_EXPR = "*[local-name()='%s']"
7
+ ATTRIBUTE_SEPARATORS = ['|', '&', 'and', 'or']
8
+
9
+ matcher :exist_xpath do |xpath|
10
+ match do |xml|
11
+ xml.should have_xpath(ignore_namespaces(xpath))
12
+ end
13
+ description do
14
+ "xpath #{xpath} exist"
15
+ end
16
+
17
+ failure_message_for_should do |actual|
18
+ "expected xpath #{expected} to exist in #{actual}"
19
+ end
20
+
21
+ # TODO: Make it work with attributes
22
+ # Typical cases are:
23
+ #
24
+ # //person[@id='abc123']/@*[name()='weight' or name()='haircolor']
25
+ # //person[@id='abc123']/(@haircolor|@weight)`
26
+ # [@id='abc123']
27
+ # @*[name()='weight' or name()='haircolor']
28
+ #
29
+ # This should work, try it:
30
+ #
31
+ # //*[local-name()='a'][*[local-name()='aCode']='aaa']
32
+
33
+ # takes smth like //w:p/w:r and
34
+ # returns //*[local-name()='p']/*[local-name()='r]
35
+ def ignore_namespaces(xpath)
36
+ expressions = xpath.sub(EXPR_PREFIX, '').
37
+ split('/').map { |expr| to_local_name(expr) }.join('/')
38
+ EXPR_PREFIX + expressions
39
+ end
40
+
41
+ def to_local_name(expr)
42
+ element = expr.split(':').last
43
+ LOCAL_NAME_EXPR % element
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ module Docxtor
4
+ describe TemplateParser do
5
+ include_context 'integration' do
6
+ subject { TemplateParser.new(template) }
7
+
8
+ it 'finds exact count of template files' do
9
+ expected = Dir.chdir(template) {
10
+ Dir[TemplateParser::FILES_PATTERN].
11
+ delete_if { |file| File.directory?(file) }.
12
+ length
13
+ }
14
+ expect { subject.parts.length == expected }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ if ENV["COVERAGE"]
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
5
+
6
+ require 'rspec'
7
+ require 'rspec-xml'
8
+
9
+ require 'wrong/adapters/rspec'
10
+ Wrong.config.alias_assert :expect, :override => true
11
+
12
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
13
+
14
+ require 'docxtor'
15
+
16
+ if ENV["TRAVIS"]
17
+ require 'coveralls'
18
+ Coveralls.wear!
19
+ end
20
+
21
+ ['matchers', 'contexts', 'examples'].each do |dir|
22
+ dir_pattern = File.join(File.dirname(__FILE__),
23
+ 'docxtor', 'support', dir, '**', '*.rb')
24
+ Dir[File.expand_path(dir_pattern)].each { |f| require f }
25
+ end
26
+
27
+ RSpec.configure do |config|
28
+ config.before(:all) do
29
+ Dir.mkdir(File.join(File.dirname(__FILE__), "docxtor", "tmp"), 0700)
30
+ end
31
+
32
+ config.after(:all) do
33
+ FileUtils.rm_rf(File.join(File.dirname(__FILE__), "docxtor", "tmp"))
34
+ end
35
+ end
File without changes
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
3
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml" PartName="/word/footnotes.xml"/>
4
+ <Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>
5
+ <Default ContentType="application/xml" Extension="xml"/>
6
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" PartName="/word/document.xml"/>
7
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml" PartName="/word/numbering.xml"/>
8
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" PartName="/word/styles.xml"/>
9
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml" PartName="/word/endnotes.xml"/>
10
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml" PartName="/word/settings.xml"/>
11
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml" PartName="/word/footer2.xml"/>
12
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml" PartName="/word/footer1.xml"/>
13
+ <Override ContentType="application/vnd.openxmlformats-officedocument.theme+xml" PartName="/word/theme/theme1.xml"/>
14
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" PartName="/word/fontTable.xml"/>
15
+ <Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml" PartName="/word/webSettings.xml"/>
16
+ </Types>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
3
+ <Relationship Id="rId1" Target="word/document.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"/>
4
+ </Relationships>
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
3
+ <Relationship Id="rId8" Target="footer2.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer"/>
4
+ <Relationship Id="rId3" Target="settings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings"/>
5
+ <Relationship Id="rId7" Target="footer1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer"/>
6
+ <Relationship Id="rId2" Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"/>
7
+ <Relationship Id="rId1" Target="numbering.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering"/>
8
+ <Relationship Id="rId6" Target="endnotes.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes"/>
9
+ <Relationship Id="rId5" Target="footnotes.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"/>
10
+ <Relationship Id="rId10" Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"/>
11
+ <Relationship Id="rId4" Target="webSettings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings"/>
12
+ <Relationship Id="rId9" Target="fontTable.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable"/>
13
+ </Relationships>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:endnotes xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
3
+ <w:endnote w:id="0" w:type="separator">
4
+ <w:p w:rsidR="00F8394C" w:rsidRDefault="00F8394C">
5
+ <w:r>
6
+ <w:separator/>
7
+ </w:r>
8
+ </w:p>
9
+ </w:endnote>
10
+ <w:endnote w:id="1" w:type="continuationSeparator">
11
+ <w:p w:rsidR="00F8394C" w:rsidRDefault="00F8394C">
12
+ <w:r>
13
+ <w:continuationSeparator/>
14
+ </w:r>
15
+ </w:p>
16
+ </w:endnote>
17
+ </w:endnotes>
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:fonts xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
3
+ <w:font w:name="Times New Roman">
4
+ <w:panose1 w:val="02020603050405020304"/>
5
+ <w:charset w:val="CC"/>
6
+ <w:family w:val="roman"/>
7
+ <w:pitch w:val="variable"/>
8
+ <w:sig w:csb0="000001FF" w:csb1="00000000" w:usb0="E0002AFF" w:usb1="C0007841" w:usb2="00000009" w:usb3="00000000"/>
9
+ </w:font>
10
+ <w:font w:name="Arial">
11
+ <w:panose1 w:val="020B0604020202020204"/>
12
+ <w:charset w:val="CC"/>
13
+ <w:family w:val="swiss"/>
14
+ <w:pitch w:val="variable"/>
15
+ <w:sig w:csb0="000001FF" w:csb1="00000000" w:usb0="E0002AFF" w:usb1="C0007843" w:usb2="00000009" w:usb3="00000000"/>
16
+ </w:font>
17
+ <w:font w:name="Calibri">
18
+ <w:panose1 w:val="020F0502020204030204"/>
19
+ <w:charset w:val="CC"/>
20
+ <w:family w:val="swiss"/>
21
+ <w:pitch w:val="variable"/>
22
+ <w:sig w:csb0="0000019F" w:csb1="00000000" w:usb0="E10002FF" w:usb1="4000ACFF" w:usb2="00000009" w:usb3="00000000"/>
23
+ </w:font>
24
+ <w:font w:name="Cambria">
25
+ <w:panose1 w:val="02040503050406030204"/>
26
+ <w:charset w:val="CC"/>
27
+ <w:family w:val="roman"/>
28
+ <w:pitch w:val="variable"/>
29
+ <w:sig w:csb0="0000019F" w:csb1="00000000" w:usb0="A00002EF" w:usb1="4000004B" w:usb2="00000000" w:usb3="00000000"/>
30
+ </w:font>
31
+ </w:fonts>
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:ftr xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
3
+ <w:p w:rsidR="00940665" w:rsidRDefault="00940665">
4
+ <w:pPr>
5
+ <w:pStyle w:val="a3"/>
6
+ <w:framePr w:hAnchor="margin" w:vAnchor="text" w:wrap="around" w:xAlign="center" w:y="1"/>
7
+ <w:rPr>
8
+ <w:rStyle w:val="a4"/>
9
+ </w:rPr>
10
+ </w:pPr>
11
+ <w:r>
12
+ <w:rPr>
13
+ <w:rStyle w:val="a4"/>
14
+ </w:rPr>
15
+ <w:fldChar w:fldCharType="begin"/>
16
+ </w:r>
17
+ <w:r>
18
+ <w:rPr>
19
+ <w:rStyle w:val="a4"/>
20
+ </w:rPr>
21
+ <w:instrText xml:space="preserve">PAGE </w:instrText>
22
+ </w:r>
23
+ <w:r>
24
+ <w:rPr>
25
+ <w:rStyle w:val="a4"/>
26
+ </w:rPr>
27
+ <w:fldChar w:fldCharType="end"/>
28
+ </w:r>
29
+ </w:p>
30
+ <w:p w:rsidR="00940665" w:rsidRDefault="00940665">
31
+ <w:pPr>
32
+ <w:pStyle w:val="a3"/>
33
+ </w:pPr>
34
+ </w:p>
35
+ </w:ftr>
@@ -0,0 +1,48 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:ftr xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
3
+ <w:p w:rsidR="00940665" w:rsidRDefault="00940665">
4
+ <w:pPr>
5
+ <w:pStyle w:val="a3"/>
6
+ <w:framePr w:hAnchor="margin" w:vAnchor="text" w:wrap="around" w:xAlign="center" w:y="1"/>
7
+ <w:rPr>
8
+ <w:rStyle w:val="a4"/>
9
+ </w:rPr>
10
+ </w:pPr>
11
+ <w:r>
12
+ <w:rPr>
13
+ <w:rStyle w:val="a4"/>
14
+ </w:rPr>
15
+ <w:fldChar w:fldCharType="begin"/>
16
+ </w:r>
17
+ <w:r>
18
+ <w:rPr>
19
+ <w:rStyle w:val="a4"/>
20
+ </w:rPr>
21
+ <w:instrText xml:space="preserve">PAGE </w:instrText>
22
+ </w:r>
23
+ <w:r>
24
+ <w:rPr>
25
+ <w:rStyle w:val="a4"/>
26
+ </w:rPr>
27
+ <w:fldChar w:fldCharType="separate"/>
28
+ </w:r>
29
+ <w:r w:rsidR="001A4A26">
30
+ <w:rPr>
31
+ <w:rStyle w:val="a4"/>
32
+ <w:noProof/>
33
+ </w:rPr>
34
+ <w:t>111</w:t>
35
+ </w:r>
36
+ <w:r>
37
+ <w:rPr>
38
+ <w:rStyle w:val="a4"/>
39
+ </w:rPr>
40
+ <w:fldChar w:fldCharType="end"/>
41
+ </w:r>
42
+ </w:p>
43
+ <w:p w:rsidR="00940665" w:rsidRDefault="00940665">
44
+ <w:pPr>
45
+ <w:pStyle w:val="a3"/>
46
+ </w:pPr>
47
+ </w:p>
48
+ </w:ftr>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:footnotes xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
3
+ <w:footnote w:id="0" w:type="separator">
4
+ <w:p w:rsidR="00F8394C" w:rsidRDefault="00F8394C">
5
+ <w:r>
6
+ <w:separator/>
7
+ </w:r>
8
+ </w:p>
9
+ </w:footnote>
10
+ <w:footnote w:id="1" w:type="continuationSeparator">
11
+ <w:p w:rsidR="00F8394C" w:rsidRDefault="00F8394C">
12
+ <w:r>
13
+ <w:continuationSeparator/>
14
+ </w:r>
15
+ </w:p>
16
+ </w:footnote>
17
+ </w:footnotes>
@@ -0,0 +1,212 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:numbering xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
3
+ <w:abstractNum w:abstractNumId="0">
4
+ <w:nsid w:val="167C5681"/>
5
+ <w:multiLevelType w:val="hybridMultilevel"/>
6
+ <w:tmpl w:val="D1F061A8"/>
7
+ <w:lvl w:ilvl="0" w:tplc="0419000F">
8
+ <w:start w:val="1"/>
9
+ <w:numFmt w:val="decimal"/>
10
+ <w:lvlText w:val="%1."/>
11
+ <w:lvlJc w:val="left"/>
12
+ <w:pPr>
13
+ <w:tabs>
14
+ <w:tab w:pos="720" w:val="num"/>
15
+ </w:tabs>
16
+ <w:ind w:hanging="360" w:left="720"/>
17
+ </w:pPr>
18
+ </w:lvl>
19
+ <w:lvl w:ilvl="1" w:tentative="1" w:tplc="04190019">
20
+ <w:start w:val="1"/>
21
+ <w:numFmt w:val="lowerLetter"/>
22
+ <w:lvlText w:val="%2."/>
23
+ <w:lvlJc w:val="left"/>
24
+ <w:pPr>
25
+ <w:tabs>
26
+ <w:tab w:pos="1440" w:val="num"/>
27
+ </w:tabs>
28
+ <w:ind w:hanging="360" w:left="1440"/>
29
+ </w:pPr>
30
+ </w:lvl>
31
+ <w:lvl w:ilvl="2" w:tentative="1" w:tplc="0419001B">
32
+ <w:start w:val="1"/>
33
+ <w:numFmt w:val="lowerRoman"/>
34
+ <w:lvlText w:val="%3."/>
35
+ <w:lvlJc w:val="right"/>
36
+ <w:pPr>
37
+ <w:tabs>
38
+ <w:tab w:pos="2160" w:val="num"/>
39
+ </w:tabs>
40
+ <w:ind w:hanging="180" w:left="2160"/>
41
+ </w:pPr>
42
+ </w:lvl>
43
+ <w:lvl w:ilvl="3" w:tentative="1" w:tplc="0419000F">
44
+ <w:start w:val="1"/>
45
+ <w:numFmt w:val="decimal"/>
46
+ <w:lvlText w:val="%4."/>
47
+ <w:lvlJc w:val="left"/>
48
+ <w:pPr>
49
+ <w:tabs>
50
+ <w:tab w:pos="2880" w:val="num"/>
51
+ </w:tabs>
52
+ <w:ind w:hanging="360" w:left="2880"/>
53
+ </w:pPr>
54
+ </w:lvl>
55
+ <w:lvl w:ilvl="4" w:tentative="1" w:tplc="04190019">
56
+ <w:start w:val="1"/>
57
+ <w:numFmt w:val="lowerLetter"/>
58
+ <w:lvlText w:val="%5."/>
59
+ <w:lvlJc w:val="left"/>
60
+ <w:pPr>
61
+ <w:tabs>
62
+ <w:tab w:pos="3600" w:val="num"/>
63
+ </w:tabs>
64
+ <w:ind w:hanging="360" w:left="3600"/>
65
+ </w:pPr>
66
+ </w:lvl>
67
+ <w:lvl w:ilvl="5" w:tentative="1" w:tplc="0419001B">
68
+ <w:start w:val="1"/>
69
+ <w:numFmt w:val="lowerRoman"/>
70
+ <w:lvlText w:val="%6."/>
71
+ <w:lvlJc w:val="right"/>
72
+ <w:pPr>
73
+ <w:tabs>
74
+ <w:tab w:pos="4320" w:val="num"/>
75
+ </w:tabs>
76
+ <w:ind w:hanging="180" w:left="4320"/>
77
+ </w:pPr>
78
+ </w:lvl>
79
+ <w:lvl w:ilvl="6" w:tentative="1" w:tplc="0419000F">
80
+ <w:start w:val="1"/>
81
+ <w:numFmt w:val="decimal"/>
82
+ <w:lvlText w:val="%7."/>
83
+ <w:lvlJc w:val="left"/>
84
+ <w:pPr>
85
+ <w:tabs>
86
+ <w:tab w:pos="5040" w:val="num"/>
87
+ </w:tabs>
88
+ <w:ind w:hanging="360" w:left="5040"/>
89
+ </w:pPr>
90
+ </w:lvl>
91
+ <w:lvl w:ilvl="7" w:tentative="1" w:tplc="04190019">
92
+ <w:start w:val="1"/>
93
+ <w:numFmt w:val="lowerLetter"/>
94
+ <w:lvlText w:val="%8."/>
95
+ <w:lvlJc w:val="left"/>
96
+ <w:pPr>
97
+ <w:tabs>
98
+ <w:tab w:pos="5760" w:val="num"/>
99
+ </w:tabs>
100
+ <w:ind w:hanging="360" w:left="5760"/>
101
+ </w:pPr>
102
+ </w:lvl>
103
+ <w:lvl w:ilvl="8" w:tentative="1" w:tplc="0419001B">
104
+ <w:start w:val="1"/>
105
+ <w:numFmt w:val="lowerRoman"/>
106
+ <w:lvlText w:val="%9."/>
107
+ <w:lvlJc w:val="right"/>
108
+ <w:pPr>
109
+ <w:tabs>
110
+ <w:tab w:pos="6480" w:val="num"/>
111
+ </w:tabs>
112
+ <w:ind w:hanging="180" w:left="6480"/>
113
+ </w:pPr>
114
+ </w:lvl>
115
+ </w:abstractNum>
116
+ <w:abstractNum w:abstractNumId="1">
117
+ <w:nsid w:val="34B5542F"/>
118
+ <w:multiLevelType w:val="hybridMultilevel"/>
119
+ <w:tmpl w:val="86DC1F06"/>
120
+ <w:lvl w:ilvl="0" w:tplc="E89C2AEE">
121
+ <w:start w:val="1"/>
122
+ <w:numFmt w:val="decimal"/>
123
+ <w:lvlRestart w:val="0"/>
124
+ <w:lvlText w:val="%1."/>
125
+ <w:lvlJc w:val="left"/>
126
+ <w:pPr>
127
+ <w:tabs>
128
+ <w:tab w:pos="720" w:val="num"/>
129
+ </w:tabs>
130
+ <w:ind w:hanging="363" w:left="720"/>
131
+ </w:pPr>
132
+ </w:lvl>
133
+ <w:lvl w:ilvl="1" w:tentative="1" w:tplc="04190019">
134
+ <w:start w:val="1"/>
135
+ <w:numFmt w:val="lowerLetter"/>
136
+ <w:lvlText w:val="%2."/>
137
+ <w:lvlJc w:val="left"/>
138
+ <w:pPr>
139
+ <w:ind w:hanging="360" w:left="1440"/>
140
+ </w:pPr>
141
+ </w:lvl>
142
+ <w:lvl w:ilvl="2" w:tentative="1" w:tplc="0419001B">
143
+ <w:start w:val="1"/>
144
+ <w:numFmt w:val="lowerRoman"/>
145
+ <w:lvlText w:val="%3."/>
146
+ <w:lvlJc w:val="right"/>
147
+ <w:pPr>
148
+ <w:ind w:hanging="180" w:left="2160"/>
149
+ </w:pPr>
150
+ </w:lvl>
151
+ <w:lvl w:ilvl="3" w:tentative="1" w:tplc="0419000F">
152
+ <w:start w:val="1"/>
153
+ <w:numFmt w:val="decimal"/>
154
+ <w:lvlText w:val="%4."/>
155
+ <w:lvlJc w:val="left"/>
156
+ <w:pPr>
157
+ <w:ind w:hanging="360" w:left="2880"/>
158
+ </w:pPr>
159
+ </w:lvl>
160
+ <w:lvl w:ilvl="4" w:tentative="1" w:tplc="04190019">
161
+ <w:start w:val="1"/>
162
+ <w:numFmt w:val="lowerLetter"/>
163
+ <w:lvlText w:val="%5."/>
164
+ <w:lvlJc w:val="left"/>
165
+ <w:pPr>
166
+ <w:ind w:hanging="360" w:left="3600"/>
167
+ </w:pPr>
168
+ </w:lvl>
169
+ <w:lvl w:ilvl="5" w:tentative="1" w:tplc="0419001B">
170
+ <w:start w:val="1"/>
171
+ <w:numFmt w:val="lowerRoman"/>
172
+ <w:lvlText w:val="%6."/>
173
+ <w:lvlJc w:val="right"/>
174
+ <w:pPr>
175
+ <w:ind w:hanging="180" w:left="4320"/>
176
+ </w:pPr>
177
+ </w:lvl>
178
+ <w:lvl w:ilvl="6" w:tentative="1" w:tplc="0419000F">
179
+ <w:start w:val="1"/>
180
+ <w:numFmt w:val="decimal"/>
181
+ <w:lvlText w:val="%7."/>
182
+ <w:lvlJc w:val="left"/>
183
+ <w:pPr>
184
+ <w:ind w:hanging="360" w:left="5040"/>
185
+ </w:pPr>
186
+ </w:lvl>
187
+ <w:lvl w:ilvl="7" w:tentative="1" w:tplc="04190019">
188
+ <w:start w:val="1"/>
189
+ <w:numFmt w:val="lowerLetter"/>
190
+ <w:lvlText w:val="%8."/>
191
+ <w:lvlJc w:val="left"/>
192
+ <w:pPr>
193
+ <w:ind w:hanging="360" w:left="5760"/>
194
+ </w:pPr>
195
+ </w:lvl>
196
+ <w:lvl w:ilvl="8" w:tentative="1" w:tplc="0419001B">
197
+ <w:start w:val="1"/>
198
+ <w:numFmt w:val="lowerRoman"/>
199
+ <w:lvlText w:val="%9."/>
200
+ <w:lvlJc w:val="right"/>
201
+ <w:pPr>
202
+ <w:ind w:hanging="180" w:left="6480"/>
203
+ </w:pPr>
204
+ </w:lvl>
205
+ </w:abstractNum>
206
+ <w:num w:numId="1">
207
+ <w:abstractNumId w:val="0"/>
208
+ </w:num>
209
+ <w:num w:numId="2">
210
+ <w:abstractNumId w:val="1"/>
211
+ </w:num>
212
+ </w:numbering>