metanorma-standoc 1.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +212 -0
- data/lib/asciidoctor/standoc/base.rb +7 -6
- data/lib/asciidoctor/standoc/biblio.rng +42 -3
- data/lib/asciidoctor/standoc/cleanup.rb +1 -1
- data/lib/asciidoctor/standoc/cleanup_footnotes.rb +1 -1
- data/lib/asciidoctor/standoc/front.rb +10 -0
- data/lib/asciidoctor/standoc/inline.rb +1 -0
- data/lib/asciidoctor/standoc/macros.rb +3 -1
- data/lib/asciidoctor/standoc/ref.rb +3 -4
- data/lib/asciidoctor/standoc/utils.rb +13 -1
- data/lib/metanorma/standoc/processor.rb +2 -2
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +4 -4
- data/spec/asciidoctor-standoc/base_spec.rb +17 -5
- data/spec/asciidoctor-standoc/cleanup_spec.rb +151 -113
- data/spec/asciidoctor-standoc/inline_spec.rb +10 -2
- data/spec/asciidoctor-standoc/isobib_cache_spec.rb +167 -129
- data/spec/asciidoctor-standoc/macros_spec.rb +1 -1
- data/spec/asciidoctor-standoc/refs_spec.rb +283 -215
- data/spec/asciidoctor-standoc/validate_spec.rb +10 -9
- data/spec/examples/iso_123_.xml +1 -0
- data/spec/examples/iso_123_all_parts.xml +1 -0
- data/spec/examples/iso_123_no_year_note.xml +1 -0
- data/spec/examples/iso_124_.xml +1 -0
- data/spec/examples/iso_216_.xml +2 -1
- data/spec/examples/iso_iec_12382_.xml +2 -1
- data/spec/metanorma/processor_spec.rb +5 -5
- data/spec/spec_helper.rb +7 -0
- data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +879 -0
- data/spec/vcr_cassettes/isobib_get_123.yml +667 -0
- data/spec/vcr_cassettes/isobib_get_124.yml +1201 -0
- data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +129 -0
- data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +424 -0
- metadata +34 -28
@@ -5,7 +5,7 @@ require "json"
|
|
5
5
|
require "pathname"
|
6
6
|
require "open-uri"
|
7
7
|
require "uuidtools"
|
8
|
-
require "
|
8
|
+
require "sterile"
|
9
9
|
|
10
10
|
module Asciidoctor
|
11
11
|
module Standoc
|
@@ -32,6 +32,18 @@ module Asciidoctor
|
|
32
32
|
"??"
|
33
33
|
end
|
34
34
|
|
35
|
+
def smart_render_xml(x)
|
36
|
+
xstr = x.to_xml if x.respond_to? :to_xml
|
37
|
+
xml = Nokogiri::XML(xstr)
|
38
|
+
xml.traverse do |n|
|
39
|
+
next unless n.text?
|
40
|
+
n.replace(n.text.gsub(/ -- /, " — ").
|
41
|
+
gsub(/--/, "—").gsub(/\.\.\./, "…").
|
42
|
+
smart_format)
|
43
|
+
end
|
44
|
+
xml.to_xml.sub(/<\?[^>]+>/, "")
|
45
|
+
end
|
46
|
+
|
35
47
|
def warning(node, msg, text)
|
36
48
|
return if @novalid
|
37
49
|
warntext = "asciidoctor: WARNING"\
|
@@ -21,8 +21,8 @@ module Metanorma
|
|
21
21
|
"Metanorma::Standoc #{Metanorma::Standoc::VERSION}/IsoDoc #{IsoDoc::VERSION}"
|
22
22
|
end
|
23
23
|
|
24
|
-
def input_to_isodoc(file)
|
25
|
-
Metanorma::Input::Asciidoc.new.process(file, @asciidoctor_backend)
|
24
|
+
def input_to_isodoc(file, filename)
|
25
|
+
Metanorma::Input::Asciidoc.new.process(file, filename, @asciidoctor_backend)
|
26
26
|
end
|
27
27
|
|
28
28
|
def output(isodoc_node, outname, format, options={})
|
data/metanorma-standoc.gemspec
CHANGED
@@ -30,7 +30,8 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_dependency "ruby-jing"
|
31
31
|
spec.add_dependency "isodoc", "~> 0.9.0"
|
32
32
|
spec.add_dependency "iev", "~> 0.2.0"
|
33
|
-
spec.add_dependency "relaton", "~> 0.
|
33
|
+
spec.add_dependency "relaton", "~> 0.3.0"
|
34
|
+
spec.add_dependency "sterile"
|
34
35
|
|
35
36
|
spec.add_development_dependency "bundler", "~> 1.15"
|
36
37
|
spec.add_development_dependency "byebug"
|
@@ -43,7 +44,6 @@ Gem::Specification.new do |spec|
|
|
43
44
|
spec.add_development_dependency "simplecov", "~> 0.15"
|
44
45
|
spec.add_development_dependency "timecop", "~> 0.9"
|
45
46
|
spec.add_development_dependency "metanorma", "~> 0.2.6"
|
46
|
-
spec.add_development_dependency "
|
47
|
-
spec.add_development_dependency "
|
48
|
-
spec.add_development_dependency "iecbib", "~> 0.1.1"
|
47
|
+
spec.add_development_dependency "vcr"
|
48
|
+
spec.add_development_dependency "webmock"
|
49
49
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "spec_helper"
|
2
|
+
require "fileutils"
|
2
3
|
|
3
4
|
RSpec.describe Asciidoctor::Standoc do
|
4
5
|
it "has a version number" do
|
@@ -16,7 +17,7 @@ RSpec.describe Asciidoctor::Standoc do
|
|
16
17
|
end
|
17
18
|
|
18
19
|
it "converts a blank document" do
|
19
|
-
|
20
|
+
FileUtils.rm_f "test.doc"
|
20
21
|
expect(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)).to be_equivalent_to <<~"OUTPUT"
|
21
22
|
= Document title
|
22
23
|
Author
|
@@ -119,11 +120,22 @@ RSpec.describe Asciidoctor::Standoc do
|
|
119
120
|
:language: el
|
120
121
|
:script: Grek
|
121
122
|
:publisher: IEC,IETF,ISO
|
123
|
+
:uri: A
|
124
|
+
:xml-uri: B
|
125
|
+
:html-uri: C
|
126
|
+
:pdf-uri: D
|
127
|
+
:doc-uri: E
|
128
|
+
:relaton-uri: F
|
122
129
|
INPUT
|
123
130
|
<?xml version="1.0" encoding="UTF-8"?>
|
124
131
|
<standard-document xmlns="http://riboseinc.com/isoxml">
|
125
132
|
<bibdata type="article">
|
126
|
-
|
133
|
+
<source>A</source>
|
134
|
+
<source type="xml">B</source>
|
135
|
+
<source type="html">C</source>
|
136
|
+
<source type="pdf">D</source>
|
137
|
+
<source type="doc">E</source>
|
138
|
+
<source type="relaton">F</source>
|
127
139
|
<docidentifier>
|
128
140
|
<project-number part="1" subpart="1">ISO/IEC/IETF 1000</project-number>
|
129
141
|
</docidentifier>
|
@@ -200,7 +212,7 @@ RSpec.describe Asciidoctor::Standoc do
|
|
200
212
|
end
|
201
213
|
|
202
214
|
it "reads scripts into blank HTML document" do
|
203
|
-
|
215
|
+
FileUtils.rm_f "test.html"
|
204
216
|
Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
|
205
217
|
= Document title
|
206
218
|
Author
|
@@ -213,7 +225,7 @@ RSpec.describe Asciidoctor::Standoc do
|
|
213
225
|
end
|
214
226
|
|
215
227
|
it "uses specified fonts and assets in HTML" do
|
216
|
-
|
228
|
+
FileUtils.rm_f "test.html"
|
217
229
|
Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
|
218
230
|
= Document title
|
219
231
|
Author
|
@@ -238,7 +250,7 @@ RSpec.describe Asciidoctor::Standoc do
|
|
238
250
|
end
|
239
251
|
|
240
252
|
it "uses specified fonts and assets in Word" do
|
241
|
-
|
253
|
+
FileUtils.rm_f "test.doc"
|
242
254
|
Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
|
243
255
|
= Document title
|
244
256
|
Author
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "iecbib"
|
3
|
+
require "fileutils"
|
3
4
|
|
4
5
|
RSpec.describe Asciidoctor::Standoc do
|
5
6
|
it "removes empty text elements" do
|
@@ -806,132 +807,169 @@ r = 1 %</stem>
|
|
806
807
|
end
|
807
808
|
|
808
809
|
it "separates IEV citations by top-level clause" do
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
810
|
+
FileUtils.rm_rf File.expand_path("~/.relaton-bib.pstore1")
|
811
|
+
FileUtils.mv File.expand_path("~/.relaton-bib.pstore"), File.expand_path("~/.relaton-bib.pstore1"), force: true
|
812
|
+
FileUtils.rm_rf File.expand_path("~/.iev.pstore1")
|
813
|
+
FileUtils.mv File.expand_path("~/.iev.pstore"), File.expand_path("~/.iev.pstore1"), force: true
|
814
|
+
FileUtils.rm_rf "test.relaton.pstore"
|
815
|
+
FileUtils.rm_rf "test.iev.pstore"
|
816
|
+
# mock_iecbib_get_iec60050_102_01
|
817
|
+
# mock_iecbib_get_iec60050_103_01
|
818
|
+
# mock_iev
|
819
|
+
VCR.use_cassette "separates_iev_citations_by_top_level_clause" do
|
816
820
|
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
817
|
-
|
821
|
+
#{CACHED_ISOBIB_BLANK_HDR}
|
818
822
|
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
== Terms and definitions
|
824
|
-
=== Automation1
|
823
|
+
[bibliography]
|
824
|
+
== Normative References
|
825
|
+
* [[[iev,IEV]]], _iev_
|
825
826
|
|
826
|
-
|
827
|
-
|
827
|
+
== Terms and definitions
|
828
|
+
=== Automation1
|
828
829
|
|
829
|
-
|
830
|
+
[.source]
|
831
|
+
<<iev,clause="103-01-02">>
|
830
832
|
|
831
|
-
|
832
|
-
<<iev,clause="102-01-02">>
|
833
|
+
=== Automation2
|
833
834
|
|
834
|
-
|
835
|
+
[.source]
|
836
|
+
<<iev,clause="102-01-02">>
|
835
837
|
|
836
|
-
|
837
|
-
<<iev,clause="103-01-02">>
|
838
|
-
INPUT
|
839
|
-
#{BLANK_HDR}
|
838
|
+
=== Automation3
|
840
839
|
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
840
|
+
[.source]
|
841
|
+
<<iev,clause="103-01-02">>
|
842
|
+
INPUT
|
843
|
+
#{BLANK_HDR}
|
844
|
+
|
845
|
+
<sections>
|
846
|
+
<terms id="_" obligation="normative"><title>Terms and definitions</title><term id="_">
|
847
|
+
<preferred>Automation1</preferred>
|
848
|
+
<termsource status="identical">
|
849
|
+
<origin bibitemid="IEC60050-103" type="inline" citeas="IEC 60050-103:2009"><locality type="clause"><referenceFrom>103-01-02</referenceFrom></locality></origin>
|
850
|
+
</termsource>
|
851
|
+
</term>
|
852
|
+
<term id="_">
|
853
|
+
<preferred>Automation2</preferred>
|
854
|
+
<termsource status="identical">
|
855
|
+
<origin bibitemid="IEC60050-102" type="inline" citeas="IEC 60050-102:2007"><locality type="clause"><referenceFrom>102-01-02</referenceFrom></locality></origin>
|
856
|
+
</termsource>
|
857
|
+
</term>
|
858
|
+
<term id="_">
|
859
|
+
<preferred>Automation3</preferred>
|
860
|
+
<termsource status="identical">
|
861
|
+
<origin bibitemid="IEC60050-103" type="inline" citeas="IEC 60050-103:2009"><locality type="clause"><referenceFrom>103-01-02</referenceFrom></locality></origin>
|
862
|
+
</termsource>
|
863
|
+
</term></terms></sections><bibliography><references id="_" obligation="informative">
|
864
|
+
<title>Normative References</title>
|
865
|
+
<bibitem type="international-standard" id="IEC60050-102">
|
866
|
+
<fetched>#{Date.today}</fetched>
|
867
|
+
<title format="text/plain" language="en" script="Latn">International Electrotechnical Vocabulary -- Part 102: Mathematics -- General concepts and linear algebra</title>
|
868
|
+
<uri type="src">https://webstore.iec.ch/publication/160</uri>
|
869
|
+
<uri type="obp">/preview/info_iec60050-102%7Bed1.0%7Db.pdf</uri>
|
870
|
+
<docidentifier type="IEC">IEC 60050-102:2007</docidentifier>
|
871
|
+
<date type="published">
|
872
|
+
<on>2007</on>
|
873
|
+
</date>
|
874
|
+
<contributor>
|
875
|
+
<role type="publisher"/>
|
876
|
+
<organization>
|
877
|
+
<name>International Electrotechnical Commission</name>
|
878
|
+
<abbreviation>IEC</abbreviation>
|
879
|
+
<uri>www.iec.ch</uri>
|
880
|
+
</organization>
|
881
|
+
</contributor>
|
882
|
+
<edition>1.0</edition>
|
883
|
+
<language>en</language>
|
884
|
+
<script>Latn</script>
|
885
|
+
<abstract format="plain" language="en" script="Latn">This part of IEC 60050 gives the general mathematical terminology used in the fields of electricity, electronics and telecommunications, together with basic concepts in linear algebra. It maintains a clear distinction between mathematical concepts and physical concepts, even if some terms are used in both cases. Another part will deal with functions. It has the status of a horizontal standard in accordance with IEC Guide 108.</abstract>
|
886
|
+
<status>
|
887
|
+
<stage>60</stage>
|
888
|
+
<substage>60</substage>
|
889
|
+
</status>
|
890
|
+
<copyright>
|
891
|
+
<from>2007</from>
|
892
|
+
<owner>
|
893
|
+
<organization>
|
894
|
+
<name>International Electrotechnical Commission</name>
|
895
|
+
<abbreviation>IEC</abbreviation>
|
896
|
+
<uri>www.iec.ch</uri>
|
897
|
+
</organization>
|
898
|
+
</owner>
|
899
|
+
</copyright>
|
900
|
+
<editorialgroup>
|
901
|
+
<technical-committee number="1" type="technicalCommittee">TC 1 - Terminology</technical-committee>
|
902
|
+
</editorialgroup>
|
903
|
+
<ics>
|
904
|
+
<code>01.040.07</code>
|
905
|
+
<text>Natural and applied sciences (Vocabularies)</text>
|
906
|
+
</ics>
|
907
|
+
<ics>
|
908
|
+
<code>07.020</code>
|
909
|
+
<text>Mathematics</text>
|
910
|
+
</ics>
|
911
|
+
</bibitem><bibitem type="international-standard" id="IEC60050-103">
|
912
|
+
<fetched>#{Date.today}</fetched>
|
913
|
+
<title format="text/plain" language="en" script="Latn">International Electrotechnical Vocabulary -- Part 103: Mathematics -- Functions </title>
|
914
|
+
<uri type="src">https://webstore.iec.ch/publication/161</uri>
|
915
|
+
<uri type="obp">/preview/info_iec60050-103%7Bed1.0%7Db.pdf</uri>
|
916
|
+
<docidentifier type="IEC">IEC 60050-103:2009</docidentifier>
|
917
|
+
<date type="published">
|
918
|
+
<on>2009</on>
|
919
|
+
</date>
|
920
|
+
<contributor>
|
921
|
+
<role type="publisher"/>
|
922
|
+
<organization>
|
923
|
+
<name>International Electrotechnical Commission</name>
|
924
|
+
<abbreviation>IEC</abbreviation>
|
925
|
+
<uri>www.iec.ch</uri>
|
926
|
+
</organization>
|
927
|
+
</contributor>
|
928
|
+
<edition>1.0</edition>
|
929
|
+
<language>en</language>
|
930
|
+
<script>Latn</script>
|
931
|
+
<abstract format="plain" language="en" script="Latn">IEC 60050-103:2009 gives the terminology relative to functions of one or more variables. Together with IEC 60050-102, it covers the mathematical terminology used in the fields of electricity, electronics and telecommunications. It maintains a clear distinction between mathematical concepts and physical concepts, even if some terms are used in both cases. Mathematical symbols are generally in accordance with IEC 60027-1 and ISO 80000-2. This standard cancels and replaces Sections 101-13, 101-14 and 101-15 of International Standard IEC 60050-101:1998. It has the status of a horizontal standard in accordance with IEC Guide 108.</abstract>
|
932
|
+
<status>
|
933
|
+
<stage>60</stage>
|
934
|
+
<substage>60</substage>
|
935
|
+
</status>
|
936
|
+
<copyright>
|
937
|
+
<from>2009</from>
|
938
|
+
<owner>
|
939
|
+
<organization>
|
940
|
+
<name>International Electrotechnical Commission</name>
|
941
|
+
<abbreviation>IEC</abbreviation>
|
942
|
+
<uri>www.iec.ch</uri>
|
943
|
+
</organization>
|
944
|
+
</owner>
|
945
|
+
</copyright>
|
946
|
+
<editorialgroup>
|
947
|
+
<technical-committee number="1" type="technicalCommittee">TC 1 - Terminology</technical-committee>
|
948
|
+
</editorialgroup>
|
949
|
+
<ics>
|
950
|
+
<code>01.040.07</code>
|
951
|
+
<text>Natural and applied sciences (Vocabularies)</text>
|
952
|
+
</ics>
|
953
|
+
<ics>
|
954
|
+
<code>07.020</code>
|
955
|
+
<text>Mathematics</text>
|
956
|
+
</ics>
|
957
|
+
</bibitem>
|
958
|
+
</references></bibliography>
|
959
|
+
</standard-document>
|
924
960
|
OUTPUT
|
925
|
-
|
926
|
-
|
927
|
-
|
961
|
+
end
|
962
|
+
FileUtils.rm_rf File.expand_path("~/.iev.pstore")
|
963
|
+
FileUtils.mv File.expand_path("~/.iev.pstore1"), File.expand_path("~/.iev.pstore"), force: true
|
964
|
+
FileUtils.rm_rf File.expand_path("~/.relaton-bib.pstore")
|
965
|
+
FileUtils.mv File.expand_path("~/.relaton-bib.pstore1"), File.expand_path("~/.relaton-bib.pstore"), force: true
|
928
966
|
end
|
929
967
|
|
930
968
|
private
|
931
969
|
|
932
970
|
def mock_iecbib_get_iec60050_103_01
|
933
971
|
expect(Iecbib::IecBibliography).to receive(:get).with("IEC 60050-103", nil, {keep_year: true}) do
|
934
|
-
IsoBibItem.from_xml(<<~"OUTPUT")
|
972
|
+
IsoBibItem::XMLParser.from_xml(<<~"OUTPUT")
|
935
973
|
<bibitem type="international-standard" id="IEC60050-103">
|
936
974
|
<title format="text/plain" language="en" script="Latn">International Electrotechnical Vocabulary</title>
|
937
975
|
<docidentifier>IEC 60050-103:2009</docidentifier>
|
@@ -969,7 +1007,7 @@ end
|
|
969
1007
|
|
970
1008
|
def mock_iecbib_get_iec60050_102_01
|
971
1009
|
expect(Iecbib::IecBibliography).to receive(:get).with("IEC 60050-102", nil, {keep_year: true}) do
|
972
|
-
IsoBibItem.from_xml(<<~"OUTPUT")
|
1010
|
+
IsoBibItem::XMLParser.from_xml(<<~"OUTPUT")
|
973
1011
|
<bibitem type="international-standard" id="IEC60050-102">
|
974
1012
|
<title format="text/plain" language="en" script="Latn">International Electrotechnical Vocabulary</title>
|
975
1013
|
<docidentifier>IEC 60050-102:2007</docidentifier>
|
@@ -1007,7 +1045,7 @@ end
|
|
1007
1045
|
|
1008
1046
|
def mock_iev
|
1009
1047
|
expect(Iecbib::IecBibliography).to receive(:get).with("IEV", nil, {}) do
|
1010
|
-
IsoBibItem.from_xml(<<~"OUTPUT")
|
1048
|
+
IsoBibItem::XMLParser.from_xml(<<~"OUTPUT")
|
1011
1049
|
<bibitem type="international-standard" id="IEC60050:2001">
|
1012
1050
|
<title format="text/plain" language="en" script="Latn">International Electrotechnical Vocabulary</title>
|
1013
1051
|
<docidentifier>IEC 60050:2011</docidentifier>
|
@@ -147,13 +147,21 @@ RSpec.describe Asciidoctor::Standoc do
|
|
147
147
|
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
148
148
|
#{ASCIIDOC_BLANK_HDR}
|
149
149
|
Hello!footnote:[Footnote text]
|
150
|
+
|
151
|
+
== Title footnote:[Footnote text 2]
|
150
152
|
INPUT
|
151
153
|
#{BLANK_HDR}
|
152
|
-
|
154
|
+
<preface><foreword obligation="informative">
|
155
|
+
<title>Foreword</title>
|
153
156
|
<p id="_">Hello!<fn reference="1">
|
154
157
|
<p id="_">Footnote text</p>
|
155
158
|
</fn></p>
|
156
|
-
</sections>
|
159
|
+
</foreword></preface><sections>
|
160
|
+
<clause id="_" inline-header="false" obligation="normative">
|
161
|
+
<title>Title<fn reference="2">
|
162
|
+
<p id="_">Footnote text 2</p>
|
163
|
+
</fn></title>
|
164
|
+
</clause></sections>
|
157
165
|
</standard-document>
|
158
166
|
OUTPUT
|
159
167
|
end
|