haml 5.2.2 → 6.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.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +3 -0
- data/.github/workflows/test.yml +13 -14
- data/.gitignore +16 -16
- data/.yardopts +0 -3
- data/CHANGELOG.md +116 -3
- data/Gemfile +18 -11
- data/MIT-LICENSE +1 -1
- data/README.md +17 -23
- data/REFERENCE.md +69 -145
- data/Rakefile +48 -81
- data/bin/bench +66 -0
- data/bin/console +11 -0
- data/bin/ruby +3 -0
- data/bin/setup +7 -0
- data/bin/stackprof +27 -0
- data/bin/test +24 -0
- data/exe/haml +6 -0
- data/ext/haml/extconf.rb +10 -0
- data/ext/haml/haml.c +537 -0
- data/ext/haml/hescape.c +108 -0
- data/ext/haml/hescape.h +20 -0
- data/haml.gemspec +39 -37
- data/lib/haml/ambles.rb +20 -0
- data/lib/haml/attribute_builder.rb +134 -179
- data/lib/haml/attribute_compiler.rb +85 -194
- data/lib/haml/attribute_parser.rb +92 -126
- data/lib/haml/cli.rb +154 -0
- data/lib/haml/compiler/children_compiler.rb +155 -0
- data/lib/haml/compiler/comment_compiler.rb +51 -0
- data/lib/haml/compiler/doctype_compiler.rb +46 -0
- data/lib/haml/compiler/script_compiler.rb +114 -0
- data/lib/haml/compiler/silent_script_compiler.rb +24 -0
- data/lib/haml/compiler/tag_compiler.rb +76 -0
- data/lib/haml/compiler.rb +63 -296
- data/lib/haml/dynamic_merger.rb +67 -0
- data/lib/haml/engine.rb +48 -227
- data/lib/haml/error.rb +5 -4
- data/lib/haml/escape.rb +13 -0
- data/lib/haml/escape_any.rb +21 -0
- data/lib/haml/filters/base.rb +12 -0
- data/lib/haml/filters/cdata.rb +20 -0
- data/lib/haml/filters/coffee.rb +17 -0
- data/lib/haml/filters/css.rb +33 -0
- data/lib/haml/filters/erb.rb +10 -0
- data/lib/haml/filters/escaped.rb +22 -0
- data/lib/haml/filters/javascript.rb +33 -0
- data/lib/haml/filters/less.rb +20 -0
- data/lib/haml/filters/markdown.rb +11 -0
- data/lib/haml/filters/plain.rb +29 -0
- data/lib/haml/filters/preserve.rb +22 -0
- data/lib/haml/filters/ruby.rb +10 -0
- data/lib/haml/filters/sass.rb +15 -0
- data/lib/haml/filters/scss.rb +15 -0
- data/lib/haml/filters/text_base.rb +25 -0
- data/lib/haml/filters/tilt_base.rb +59 -0
- data/lib/haml/filters.rb +54 -378
- data/lib/haml/force_escape.rb +29 -0
- data/lib/haml/helpers.rb +3 -697
- data/lib/haml/html.rb +22 -0
- data/lib/haml/identity.rb +13 -0
- data/lib/haml/object_ref.rb +35 -0
- data/lib/haml/parser.rb +157 -22
- data/lib/haml/rails_helpers.rb +53 -0
- data/lib/haml/rails_template.rb +57 -0
- data/lib/haml/railtie.rb +3 -46
- data/lib/haml/ruby_expression.rb +32 -0
- data/lib/haml/string_splitter.rb +140 -0
- data/lib/haml/template.rb +15 -34
- data/lib/haml/temple_line_counter.rb +2 -1
- data/lib/haml/util.rb +18 -15
- data/lib/haml/version.rb +1 -2
- data/lib/haml/whitespace.rb +8 -0
- data/lib/haml.rb +8 -20
- metadata +211 -55
- data/.gitmodules +0 -3
- data/TODO +0 -24
- data/benchmark.rb +0 -70
- data/bin/haml +0 -9
- data/lib/haml/.gitattributes +0 -1
- data/lib/haml/buffer.rb +0 -182
- data/lib/haml/escapable.rb +0 -77
- data/lib/haml/exec.rb +0 -347
- data/lib/haml/generator.rb +0 -42
- data/lib/haml/helpers/action_view_extensions.rb +0 -60
- data/lib/haml/helpers/action_view_mods.rb +0 -132
- data/lib/haml/helpers/action_view_xss_mods.rb +0 -60
- data/lib/haml/helpers/safe_erubi_template.rb +0 -20
- data/lib/haml/helpers/safe_erubis_template.rb +0 -33
- data/lib/haml/helpers/xss_mods.rb +0 -114
- data/lib/haml/options.rb +0 -273
- data/lib/haml/plugin.rb +0 -54
- data/lib/haml/sass_rails_filter.rb +0 -47
- data/lib/haml/template/options.rb +0 -27
- data/lib/haml/temple_engine.rb +0 -124
- data/yard/default/.gitignore +0 -1
- data/yard/default/fulldoc/html/css/common.sass +0 -15
- data/yard/default/layout/html/footer.erb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c6e33698052b2d1823959741be8219446b8b3257f5124449daa8cd8deb70e4a
|
4
|
+
data.tar.gz: d2a168766babc32a3f83b065e6d158e5b937995cdd5a46552fb95d4035ad5924
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6d71bcdb86f5281b34c9f56684263db88e947b17c8d79eb764b6ecb8f17945ad7fc374b2ad8032066b0c7ae52e3c0045de3658b76fc073e5ee8ab73e3c7eae3
|
7
|
+
data.tar.gz: 408d9dd0b14378515d175778a9d9b472b70819c2371189aa145d2e787590213f453bba60e6dec2aee5aadf9e7bc0fd6c4b077f96676c9b6e899896ce60eb07cc
|
data/.github/FUNDING.yml
ADDED
data/.github/workflows/test.yml
CHANGED
@@ -8,29 +8,28 @@ on:
|
|
8
8
|
- opened
|
9
9
|
- synchronize
|
10
10
|
- reopened
|
11
|
+
schedule:
|
12
|
+
- cron: "00 15 * * *"
|
11
13
|
jobs:
|
12
14
|
test:
|
13
|
-
name: 'Ruby: ${{ matrix.ruby }}, Rails: ${{ matrix.rails }}'
|
14
15
|
runs-on: ubuntu-latest
|
15
16
|
strategy:
|
16
17
|
fail-fast: false
|
17
18
|
matrix:
|
18
|
-
ruby:
|
19
|
-
|
19
|
+
ruby:
|
20
|
+
- '2.5'
|
21
|
+
- '2.6'
|
22
|
+
- '2.7'
|
23
|
+
- '3.0'
|
24
|
+
- '3.1'
|
25
|
+
- jruby
|
26
|
+
- truffleruby-head
|
20
27
|
steps:
|
21
28
|
- uses: actions/checkout@v2
|
29
|
+
- run: sudo apt-get update && sudo apt-get install -y nodejs libxslt-dev # nodejs for execjs, libxslt for TruffleRuby nokogiri
|
22
30
|
- name: Set up Ruby
|
23
31
|
uses: ruby/setup-ruby@v1
|
24
32
|
with:
|
25
33
|
ruby-version: ${{ matrix.ruby }}
|
26
|
-
|
27
|
-
|
28
|
-
path: vendor/bundle
|
29
|
-
key: ${{ runner.os }}-${{ matrix.ruby }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
30
|
-
restore-keys: ${{ runner.os }}-gems-
|
31
|
-
- name: bundle install --gemfile=test/gemfiles/Gemfile.rails-${{matrix.rails}}.x
|
32
|
-
run: bundle config path vendor/bundle && bundle install -j$(nproc) --retry 3
|
33
|
-
- name: rake test
|
34
|
-
run: bundle exec rake test submodules
|
35
|
-
env:
|
36
|
-
RUBYOPT: "--enable-frozen-string-literal"
|
34
|
+
bundler-cache: true
|
35
|
+
- run: bundle exec rake test
|
data/.gitignore
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
/.
|
1
|
+
/.bundle/
|
2
2
|
/.yardoc
|
3
|
-
/
|
4
|
-
/
|
5
|
-
|
6
|
-
/
|
7
|
-
/
|
8
|
-
/
|
9
|
-
|
10
|
-
/
|
11
|
-
|
3
|
+
/Gemfile.lock
|
4
|
+
/_yardoc/
|
5
|
+
/.idea
|
6
|
+
/coverage/
|
7
|
+
/doc/
|
8
|
+
/pkg/
|
9
|
+
/spec/reports/
|
10
|
+
/tmp/
|
11
|
+
/haml/
|
12
12
|
.sass-cache
|
13
|
-
.rbenv-version
|
14
|
-
.rbx
|
15
13
|
.ruby-version
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
*.bundle
|
15
|
+
*.so
|
16
|
+
*.su
|
17
|
+
*.a
|
18
|
+
*.o
|
19
|
+
*.swp
|
data/.yardopts
CHANGED
@@ -7,10 +7,7 @@
|
|
7
7
|
--title "Haml Documentation"
|
8
8
|
--query 'object.type != :classvariable'
|
9
9
|
--query 'object.type != :constant || @api && @api.text == "public"'
|
10
|
-
--exclude lib/haml/plugin.rb
|
11
10
|
--exclude lib/haml/railtie.rb
|
12
|
-
--exclude lib/haml/helpers/action_view_mods.rb
|
13
|
-
--exclude lib/haml/helpers/xss_mods.rb
|
14
11
|
--hide-void-return
|
15
12
|
--protected
|
16
13
|
--no-private
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,125 @@
|
|
1
1
|
# Haml Changelog
|
2
2
|
|
3
|
+
## 6.1.1
|
4
|
+
|
5
|
+
* Fix an empty output of Ruby 3.1's Hash shorthand syntax [#1083](https://github.com/haml/haml/issues/1083)
|
6
|
+
|
7
|
+
## 6.1.0
|
8
|
+
|
9
|
+
* Optimize away a `to_s` call on `=` scripts
|
10
|
+
* Fix escaping for objects that return an `html_safe` string on `to_s` [#1117](https://github.com/haml/haml/issues/1117)
|
11
|
+
|
12
|
+
## 6.0.12
|
13
|
+
|
14
|
+
* Fix a whitespace removal with `>` and an `if`-`else` statement [#1114](https://github.com/haml/haml/issues/1114)
|
15
|
+
|
16
|
+
## 6.0.11
|
17
|
+
|
18
|
+
* Fix a whitespace removal with `>` and an `if` statement [#1114](https://github.com/haml/haml/issues/1114)
|
19
|
+
|
20
|
+
## 6.0.10
|
21
|
+
|
22
|
+
* Evaluate :erb filter in the template context like Haml 5
|
23
|
+
|
24
|
+
## 6.0.9
|
25
|
+
|
26
|
+
* Support sass-embedded [#1112](https://github.com/haml/haml/issues/1112)
|
27
|
+
|
28
|
+
## 6.0.8
|
29
|
+
|
30
|
+
* Support interpolation in HTML comments, which has not been working since 6.0.0
|
31
|
+
[#1107](https://github.com/haml/haml/issues/1107)
|
32
|
+
|
33
|
+
## 6.0.7
|
34
|
+
|
35
|
+
* `Haml::Engine` and `Haml::Template` use StringBuffer instead of ArrayBuffer
|
36
|
+
* It seems more performant in many cases with recent Ruby versions.
|
37
|
+
* `Haml::RailsTemplate` is not affected.
|
38
|
+
|
39
|
+
## 6.0.6
|
40
|
+
|
41
|
+
* Prevent CRuby from accidentally using the Ruby implementation fallback
|
42
|
+
* Reversing what v6.0.3 and v6.0.4 did, but still supporting Wasm.
|
43
|
+
|
44
|
+
## 6.0.5
|
45
|
+
|
46
|
+
* Resurrect `#haml_object_ref` support in an object reference [#1097](https://github.com/haml/haml/issues/1097)
|
47
|
+
* This was removed in 6.0.0, and added back in this version.
|
48
|
+
* Stop warning `remove_whitespace: true` option.
|
49
|
+
|
50
|
+
## 6.0.4
|
51
|
+
|
52
|
+
Released on October 2, 2022
|
53
|
+
([diff](https://github.com/haml/haml/compare/v6.0.3...v6.0.4)).
|
54
|
+
|
55
|
+
* Fix a parse failure of `%` in attributes [#1096](https://github.com/haml/haml/issues/1096)
|
56
|
+
* Add another fallback from C to Ruby for Wasm.
|
57
|
+
|
58
|
+
## 6.0.3
|
59
|
+
|
60
|
+
Released on September 28, 2022
|
61
|
+
([diff](https://github.com/haml/haml/compare/v6.0.2...v6.0.3)).
|
62
|
+
|
63
|
+
* For Wasm, fallback to Ruby when C extension is not available.
|
64
|
+
|
65
|
+
## 6.0.2
|
66
|
+
|
67
|
+
Released on September 28, 2022
|
68
|
+
([diff](https://github.com/haml/haml/compare/v6.0.1...v6.0.2)).
|
69
|
+
|
70
|
+
* Unescape HTML-safe arguments for `surround`, `succeed`, and `precede` on Rails
|
71
|
+
[#1088](https://github.com/haml/haml/issues/1088)
|
72
|
+
|
73
|
+
## 6.0.1
|
74
|
+
|
75
|
+
Released on September 23, 2022
|
76
|
+
([diff](https://github.com/haml/haml/compare/v6.0.0...v6.0.1)).
|
77
|
+
|
78
|
+
* Unescape HTML-safe interpolation on Rails [#1084](https://github.com/haml/haml/issues/1084)
|
79
|
+
* Resurrect Haml 5's `AttributeParser.available?` for syntax\_tree-haml [#1085](https://github.com/haml/haml/issues/1085)
|
80
|
+
|
81
|
+
## 6.0.0
|
82
|
+
|
83
|
+
Released on September 21, 2022
|
84
|
+
([diff](https://github.com/haml/haml/compare/v5.2.2...v6.0.0)).
|
85
|
+
|
86
|
+
* Replace the implementation with Hamlit
|
87
|
+
* Haml 6 is about 1.7x faster than Haml 5 in [this benchmark](benchmark/slim/run-benchmarks.rb).
|
88
|
+
* The parser is kept as is, but everything else is replaced.
|
89
|
+
* The `haml` CLI interface was also replaced.
|
90
|
+
* The interface of `Haml::Engine` is changed. `Haml::Template` is most likely what you need now.
|
91
|
+
* before: `Haml::Engine.new("%p Haml code!").render`
|
92
|
+
* after: `Haml::Template.new { "%p Haml code!" }.render`
|
93
|
+
* Most Haml helpers are removed.
|
94
|
+
* Rails:
|
95
|
+
* Kept: `find_and_reserve`, `preserve`, `surround`, `precede`, `succeed`, `capture_haml`
|
96
|
+
* Removed: `block_is_haml?`, `flatten`, `haml_concat`, `haml_indent`, `haml_tag`, `haml_tag_if`, `html_attrs`,
|
97
|
+
`html_escape`, `init_haml_helpers`, `is_haml?`, `list_of`, `non_haml`, `tab_down`, `tab_up`, `with_tabs`
|
98
|
+
* Tilt:
|
99
|
+
* Kept: `preserve`
|
100
|
+
* Removed: `block_is_haml?`, `capture_haml`, `escape_once`, `find_and_preserve`, `flatten`, `haml_concat`,
|
101
|
+
`haml_indent`, `haml_tag`, `haml_tag_if`, `html_attrs`, `html_escape`, `init_haml_helpers`, `is_haml?`,
|
102
|
+
`list_of`, `non_haml`, `precede`, `succeed`, `surround`, `tab_down`, `tab_up`, `with_tabs`
|
103
|
+
* Only the following attributes and `aria`/`data` attributes are considered boolean attributes:
|
104
|
+
* `allowfullscreen`, `async`, `autobuffer`, `autofocus`, `autoplay`, `checked`, `controls`, `default`,
|
105
|
+
`defer`, `disabled`, `download`, `formnovalidate`, `hidden`, `inert`, `ismap`, `itemscope`, `loop`,
|
106
|
+
`multiple`, `muted`, `novalidate`, `open`, `pubdate`, `readonly`, `required`, `reversed`, `scoped`,
|
107
|
+
`seamless`, `selected`, `sortable`, `truespeed`, `typemustmatch`
|
108
|
+
* Only `data` and `aria` attributes support using a nested Hash to render hyphenated attributes, e.g.
|
109
|
+
`data: { foo: 'bar' }` becomes `data-foo="bar"`, but this no longer works for non-`data`/`aria` attributes.
|
110
|
+
* Some legacy Rails integration is removed.
|
111
|
+
* The default value of `escape_html` option became true.
|
112
|
+
* `-` script lines no longer support capturing. Only `=` lines are supported to yield a nested block.
|
113
|
+
* Overriding `data` attributes with another falsy `data-*` attribute that has the same name
|
114
|
+
is no longer supported. [#1105](https://github.com/haml/haml/issues/1105)
|
115
|
+
* :erb filter is not executed in the template context (fixed in 6.0.10)
|
116
|
+
|
3
117
|
## 5.2.2
|
118
|
+
|
4
119
|
Released on July 27, 2021
|
5
120
|
([diff](https://github.com/haml/haml/compare/v5.2.1...v5.2.2)).
|
6
121
|
|
7
|
-
* Support
|
8
|
-
* Expanded test matrix to include Ruby 3.0 and Rails 6.1
|
9
|
-
* Only testing Ruby 2.7+ and Rails 5.2+
|
122
|
+
* Support `config.action_view.annotate_rendered_view_with_filenames = true` of Rails 6.1
|
10
123
|
|
11
124
|
## 5.2.1
|
12
125
|
|
data/Gemfile
CHANGED
@@ -1,16 +1,23 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
git_source(:github) do |repo_name|
|
4
|
+
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
|
5
|
+
"https://github.com/#{repo_name}.git"
|
6
|
+
end
|
7
|
+
|
8
|
+
# Specify your gem's dependencies in haml.gemspec
|
2
9
|
gemspec
|
3
10
|
|
4
|
-
gem
|
5
|
-
gem
|
6
|
-
gem
|
11
|
+
gem 'benchmark-ips', '2.3.0'
|
12
|
+
gem 'maxitest'
|
13
|
+
gem 'pry'
|
7
14
|
|
8
|
-
|
9
|
-
gem
|
10
|
-
|
11
|
-
gem
|
12
|
-
end
|
15
|
+
if /java/ === RUBY_PLATFORM # JRuby
|
16
|
+
gem 'pandoc-ruby'
|
17
|
+
else
|
18
|
+
gem 'redcarpet'
|
13
19
|
|
14
|
-
|
15
|
-
|
20
|
+
if RUBY_PLATFORM !~ /mswin|mingw/ && RUBY_ENGINE != 'truffleruby'
|
21
|
+
gem 'stackprof'
|
22
|
+
end
|
16
23
|
end
|
data/MIT-LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2006-
|
1
|
+
Copyright (c) 2006-2021 Hampton Catlin, Natalie Weizenbaum and Takashi Kokubun
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Haml
|
2
2
|
|
3
3
|
[](http://rubygems.org/gems/haml)
|
4
|
-
[](https://github.com/haml/haml/actions/workflows/test.yml)
|
5
5
|
[](https://codeclimate.com/github/haml/haml)
|
6
6
|
[](http://inch-ci.org/github/haml/haml)
|
7
7
|
|
@@ -10,13 +10,6 @@ more pleasant to write HTML documents, by eliminating redundancy, reflecting the
|
|
10
10
|
underlying structure that the document represents, and providing an elegant syntax
|
11
11
|
that's both powerful and easy to understand.
|
12
12
|
|
13
|
-
### Supported Versions
|
14
|
-
|
15
|
-
* Ruby 2.6+
|
16
|
-
* Rails 5.1+
|
17
|
-
|
18
|
-
Other versions may likely work, but we don't test against them.
|
19
|
-
|
20
13
|
## Basic Usage
|
21
14
|
|
22
15
|
Haml can be used from the command line or as part of a Ruby web framework. The
|
@@ -29,7 +22,7 @@ gem install haml
|
|
29
22
|
After you write some Haml, you can run
|
30
23
|
|
31
24
|
~~~sh
|
32
|
-
haml document.haml
|
25
|
+
haml render document.haml
|
33
26
|
~~~
|
34
27
|
|
35
28
|
to compile it to HTML. For more information on these commands, check out
|
@@ -48,8 +41,8 @@ To use Haml with Rails, simply add Haml to your Gemfile and run `bundle`.
|
|
48
41
|
gem 'haml'
|
49
42
|
~~~
|
50
43
|
|
51
|
-
If you'd like to replace Rails's
|
52
|
-
[haml-rails](https://github.com/
|
44
|
+
If you'd like to replace Rails's ERB-based generators with Haml, add
|
45
|
+
[haml-rails](https://github.com/haml/haml-rails) to your Gemfile as well.
|
53
46
|
|
54
47
|
## Formatting
|
55
48
|
|
@@ -169,34 +162,35 @@ on a specific area:
|
|
169
162
|
ruby -Itest test/helper_test.rb -n test_buffer_access
|
170
163
|
~~~
|
171
164
|
|
172
|
-
Haml currently supports Ruby 2.
|
165
|
+
Haml currently supports Ruby 2.0.0 and higher, so please make sure your changes run on 2.0+.
|
173
166
|
|
174
167
|
## Team
|
175
168
|
|
176
169
|
### Current Maintainers
|
177
170
|
|
178
|
-
* [Hampton Catlin](https://github.com/hcatlin)
|
179
|
-
* [Takashi Kokubun](https://github.com/k0kubun)
|
180
171
|
* [Akira Matsuda](https://github.com/amatsuda)
|
172
|
+
* [Matt Wildig](https://github.com/mattwildig)
|
173
|
+
* [Tee Parham](https://github.com/teeparham)
|
174
|
+
* [Takashi Kokubun](https://github.com/k0kubun)
|
181
175
|
|
182
176
|
### Alumni
|
183
177
|
|
184
178
|
Haml was created by [Hampton Catlin](http://hamptoncatlin.com), the author of
|
185
|
-
the original implementation.
|
179
|
+
the original implementation. Hampton is no longer involved in day-to-day coding,
|
180
|
+
but still consults on language issues.
|
186
181
|
|
187
|
-
[Natalie Weizenbaum](
|
182
|
+
[Natalie Weizenbaum](http://nex-3.com) was for many years the primary developer
|
188
183
|
and architect of the "modern" Ruby implementation of Haml.
|
189
184
|
|
190
|
-
|
191
|
-
alive! as former maintainers like:
|
192
|
-
|
193
|
-
[Norman Clarke](http://github.com/norman)
|
194
|
-
[Matt Wildig](https://github.com/mattwildig)
|
195
|
-
[Tee Parham](https://github.com/teeparham)
|
185
|
+
[Norman Clarke](http://github.com/norman) was the primary maintainer of Haml from 2012 to 2016.
|
196
186
|
|
197
187
|
## License
|
198
188
|
|
199
|
-
|
189
|
+
Some of Natalie's work on Haml was supported by Unspace Interactive.
|
190
|
+
|
191
|
+
Beyond that, the implementation is licensed under the MIT License.
|
192
|
+
|
193
|
+
Copyright (c) 2006-2019 Hampton Catlin, Natalie Weizenbaum and the Haml team
|
200
194
|
|
201
195
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
202
196
|
this software and associated documentation files (the "Software"), to deal in
|