testa_appium_driver 0.1.11 → 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +23 -0
  3. data/.gitignore +16 -16
  4. data/.rspec +3 -3
  5. data/.rubocop.yml +13 -13
  6. data/CHANGELOG.md +5 -5
  7. data/CODE_OF_CONDUCT.md +102 -102
  8. data/Gemfile +12 -12
  9. data/Gemfile.lock +74 -0
  10. data/LICENSE.txt +21 -21
  11. data/README.md +402 -378
  12. data/Rakefile +12 -12
  13. data/{testa_appium_driver.iml → appium-driver.iml} +71 -78
  14. data/bin/console +17 -17
  15. data/bin/setup +8 -8
  16. data/lib/testa_appium_driver/android/class_selectors.rb +437 -437
  17. data/lib/testa_appium_driver/android/driver.rb +70 -69
  18. data/lib/testa_appium_driver/android/locator/attributes.rb +117 -113
  19. data/lib/testa_appium_driver/android/locator.rb +141 -141
  20. data/lib/testa_appium_driver/android/scroll_actions/uiautomator_scroll_actions.rb +61 -61
  21. data/lib/testa_appium_driver/android/selenium_element.rb +11 -7
  22. data/lib/testa_appium_driver/common/bounds.rb +149 -149
  23. data/lib/testa_appium_driver/common/constants.rb +37 -36
  24. data/lib/testa_appium_driver/common/exceptions/strategy_mix_exception.rb +11 -11
  25. data/lib/testa_appium_driver/common/helpers.rb +270 -270
  26. data/lib/testa_appium_driver/common/locator/scroll_actions.rb +397 -397
  27. data/lib/testa_appium_driver/common/locator.rb +627 -610
  28. data/lib/testa_appium_driver/common/scroll_actions/json_wire_scroll_actions.rb +3 -3
  29. data/lib/testa_appium_driver/common/scroll_actions/w3c_scroll_actions.rb +304 -237
  30. data/lib/testa_appium_driver/common/scroll_actions.rb +253 -246
  31. data/lib/testa_appium_driver/common/selenium_element.rb +19 -19
  32. data/lib/testa_appium_driver/driver.rb +328 -312
  33. data/lib/testa_appium_driver/ios/driver.rb +48 -48
  34. data/lib/testa_appium_driver/ios/locator/attributes.rb +84 -80
  35. data/lib/testa_appium_driver/ios/locator.rb +71 -70
  36. data/lib/testa_appium_driver/ios/selenium_element.rb +6 -6
  37. data/lib/testa_appium_driver/ios/type_selectors.rb +187 -187
  38. data/lib/testa_appium_driver/version.rb +5 -5
  39. data/lib/testa_appium_driver.rb +6 -6
  40. data/testa_appium_driver.gemspec +41 -41
  41. metadata +9 -16
  42. data/.idea/deployment.xml +0 -22
  43. data/.idea/inspectionProfiles/Project_Default.xml +0 -9
  44. data/.idea/misc.xml +0 -6
  45. data/.idea/modules.xml +0 -8
  46. data/.idea/runConfigurations/Android_Test.xml +0 -42
  47. data/.idea/runConfigurations.xml +0 -10
  48. data/.idea/sshConfigs.xml +0 -13
  49. data/.idea/vcs.xml +0 -6
  50. data/.idea/webServers.xml +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c55e4e3d29193b3bc89ea292de2c36d093897208050494204da865ea4902d6c
4
- data.tar.gz: 35014def9a47f5fcfb1242cd1c897a4c13add7f1e9359b66170c2057aa450e3c
3
+ metadata.gz: 42baeaf531486245427c9a3e2bc002e8c6bf659ec2f7e010cc7f46a56c863f2c
4
+ data.tar.gz: 31ea0d036c32405f744dfdbbce04d596ff3822cd54144270bed08fd4e7e6c90c
5
5
  SHA512:
6
- metadata.gz: 3562a893791f45303d3cf4cbb3d2b1d1510122ae296e9fb257ce25bd83a9388efacd69ebc9e149219fc5a02fc42f80a9c05f0be72241909b6cd142abfec48e8b
7
- data.tar.gz: 741a8b9d2b1683484e0100d01c53966d63f9eeacb19ca188589e32b62990ee1cc822d8306e6e23baf34f93ac0a34b929ce5342fdbe1d4a80f3be0e87acf7d28c
6
+ metadata.gz: 59ac915f5a1036eb9c943c8770295aaa5def6268685f9db2f7b802d9ac19128d39348c4a3cc9010d45fd0fea5f0ced98327f94a124b0eac55cfaff7b310193aa
7
+ data.tar.gz: aec59ca33a54aed586c832e82a5aa11ca9d331759aea810a89e6e6e0bd9193f48af7b69d6323427413dffba1d3e5bd693d726db4bc88d4f6f3d7439e55bcc00d
data/.gitattributes ADDED
@@ -0,0 +1,23 @@
1
+ # Set the default behavior, in case people don't have core.autocrlf set.
2
+ * text=auto
3
+
4
+ # Declare files that will always have LF line endings on checkout.
5
+ *.rb text eol=lf
6
+ *.yml text eol=lf
7
+ *.sh text eol=lf
8
+ *.Dockerfile eol=lf
9
+ *.dockerfile eol=lf
10
+ *.conf eol=lf
11
+ *.ru eol=lf
12
+ *.json eol=lf
13
+ *.js eol=lf
14
+ *.css eol=lf
15
+ *.erb eol=lf
16
+ *.html eol=lf
17
+ *.map eol=lf
18
+
19
+ # Denote all files that are truly binary and should not be modified.
20
+ *.png binary
21
+ *.jpg binary
22
+ *.bin binary
23
+ *.zip binary
data/.gitignore CHANGED
@@ -1,16 +1,16 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
9
-
10
- # rspec failure tracking
11
- .rspec_status
12
-
13
- /.idea/deployment.xml
14
- /.idea/workspace.xml
15
- /.idea/misc.xml
16
- Gemfile.lock
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ /.idea/deployment.xml
14
+ /.idea/workspace.xml
15
+ /.idea/misc.xml
16
+ testa_appium_driver-*.gem
data/.rspec CHANGED
@@ -1,3 +1,3 @@
1
- --format documentation
2
- --color
3
- --require spec_helper
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml CHANGED
@@ -1,13 +1,13 @@
1
- AllCops:
2
- TargetRubyVersion: 2.4
3
-
4
- Style/StringLiterals:
5
- Enabled: true
6
- EnforcedStyle: double_quotes
7
-
8
- Style/StringLiteralsInInterpolation:
9
- Enabled: true
10
- EnforcedStyle: double_quotes
11
-
12
- Layout/LineLength:
13
- Max: 120
1
+ AllCops:
2
+ TargetRubyVersion: 2.7.6
3
+
4
+ Style/StringLiterals:
5
+ Enabled: true
6
+ EnforcedStyle: double_quotes
7
+
8
+ Style/StringLiteralsInInterpolation:
9
+ Enabled: true
10
+ EnforcedStyle: double_quotes
11
+
12
+ Layout/LineLength:
13
+ Max: 120
data/CHANGELOG.md CHANGED
@@ -1,5 +1,5 @@
1
- ## [Unreleased]
2
-
3
- ## [0.1.0] - 2021-08-13
4
-
5
- - Initial release
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2021-08-13
4
+
5
+ - Initial release
data/CODE_OF_CONDUCT.md CHANGED
@@ -1,102 +1,102 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for
6
- everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity
7
- and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion,
8
- or sexual identity and orientation.
9
-
10
- We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to a positive environment for our community include:
15
-
16
- * Demonstrating empathy and kindness toward other people
17
- * Being respectful of differing opinions, viewpoints, and experiences
18
- * Giving and gracefully accepting constructive feedback
19
- * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
20
- * Focusing on what is best not just for us as individuals, but for the overall community
21
-
22
- Examples of unacceptable behavior include:
23
-
24
- * The use of sexualized language or imagery, and sexual attention or advances of any kind
25
- * Trolling, insulting or derogatory comments, and personal or political attacks
26
- * Public or private harassment
27
- * Publishing others' private information, such as a physical or email address, without their explicit permission
28
- * Other conduct which could reasonably be considered inappropriate in a professional setting
29
-
30
- ## Enforcement Responsibilities
31
-
32
- Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take
33
- appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive,
34
- or harmful.
35
-
36
- Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
37
- issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for
38
- moderation decisions when appropriate.
39
-
40
- ## Scope
41
-
42
- This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing
43
- the community in public spaces. Examples of representing our community include using an official e-mail address, posting
44
- via an official social media account, or acting as an appointed representative at an online or offline event.
45
-
46
- ## Enforcement
47
-
48
- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible
49
- for enforcement at karlo.razumovic@gmail.com. All complaints will be reviewed and investigated promptly and fairly.
50
-
51
- All community leaders are obligated to respect the privacy and security of the reporter of any incident.
52
-
53
- ## Enforcement Guidelines
54
-
55
- Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem
56
- in violation of this Code of Conduct:
57
-
58
- ### 1. Correction
59
-
60
- **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the
61
- community.
62
-
63
- **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation
64
- and an explanation of why the behavior was inappropriate. A public apology may be requested.
65
-
66
- ### 2. Warning
67
-
68
- **Community Impact**: A violation through a single incident or series of actions.
69
-
70
- **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including
71
- unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding
72
- interactions in community spaces as well as external channels like social media. Violating these terms may lead to a
73
- temporary or permanent ban.
74
-
75
- ### 3. Temporary Ban
76
-
77
- **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
78
-
79
- **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified
80
- period of time. No public or private interaction with the people involved, including unsolicited interaction with those
81
- enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
82
-
83
- ### 4. Permanent Ban
84
-
85
- **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate
86
- behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
87
-
88
- **Consequence**: A permanent ban from any sort of public interaction within the community.
89
-
90
- ## Attribution
91
-
92
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available
93
- at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
94
-
95
- Community Impact Guidelines were inspired
96
- by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
97
-
98
- [homepage]: https://www.contributor-covenant.org
99
-
100
- For answers to common questions about this code of conduct, see the FAQ at
101
- https://www.contributor-covenant.org/faq. Translations are available
102
- at https://www.contributor-covenant.org/translations.
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for
6
+ everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity
7
+ and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion,
8
+ or sexual identity and orientation.
9
+
10
+ We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to a positive environment for our community include:
15
+
16
+ * Demonstrating empathy and kindness toward other people
17
+ * Being respectful of differing opinions, viewpoints, and experiences
18
+ * Giving and gracefully accepting constructive feedback
19
+ * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
20
+ * Focusing on what is best not just for us as individuals, but for the overall community
21
+
22
+ Examples of unacceptable behavior include:
23
+
24
+ * The use of sexualized language or imagery, and sexual attention or advances of any kind
25
+ * Trolling, insulting or derogatory comments, and personal or political attacks
26
+ * Public or private harassment
27
+ * Publishing others' private information, such as a physical or email address, without their explicit permission
28
+ * Other conduct which could reasonably be considered inappropriate in a professional setting
29
+
30
+ ## Enforcement Responsibilities
31
+
32
+ Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take
33
+ appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive,
34
+ or harmful.
35
+
36
+ Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
37
+ issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for
38
+ moderation decisions when appropriate.
39
+
40
+ ## Scope
41
+
42
+ This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing
43
+ the community in public spaces. Examples of representing our community include using an official e-mail address, posting
44
+ via an official social media account, or acting as an appointed representative at an online or offline event.
45
+
46
+ ## Enforcement
47
+
48
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible
49
+ for enforcement at karlo.razumovic@gmail.com. All complaints will be reviewed and investigated promptly and fairly.
50
+
51
+ All community leaders are obligated to respect the privacy and security of the reporter of any incident.
52
+
53
+ ## Enforcement Guidelines
54
+
55
+ Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem
56
+ in violation of this Code of Conduct:
57
+
58
+ ### 1. Correction
59
+
60
+ **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the
61
+ community.
62
+
63
+ **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation
64
+ and an explanation of why the behavior was inappropriate. A public apology may be requested.
65
+
66
+ ### 2. Warning
67
+
68
+ **Community Impact**: A violation through a single incident or series of actions.
69
+
70
+ **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including
71
+ unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding
72
+ interactions in community spaces as well as external channels like social media. Violating these terms may lead to a
73
+ temporary or permanent ban.
74
+
75
+ ### 3. Temporary Ban
76
+
77
+ **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
78
+
79
+ **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified
80
+ period of time. No public or private interaction with the people involved, including unsolicited interaction with those
81
+ enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
82
+
83
+ ### 4. Permanent Ban
84
+
85
+ **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate
86
+ behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
87
+
88
+ **Consequence**: A permanent ban from any sort of public interaction within the community.
89
+
90
+ ## Attribution
91
+
92
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available
93
+ at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
94
+
95
+ Community Impact Guidelines were inspired
96
+ by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
97
+
98
+ [homepage]: https://www.contributor-covenant.org
99
+
100
+ For answers to common questions about this code of conduct, see the FAQ at
101
+ https://www.contributor-covenant.org/faq. Translations are available
102
+ at https://www.contributor-covenant.org/translations.
data/Gemfile CHANGED
@@ -1,12 +1,12 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- # Specify your gem's dependencies in testa_appium_driver.gemspec
6
- gemspec
7
-
8
- gem "rake", "~> 13.0"
9
-
10
- gem "rspec", "~> 3.0"
11
-
12
- gem "rubocop", "~> 1.7"
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in testa_appium_driver.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "rspec", "~> 3.0"
11
+
12
+ gem "rubocop", "~> 1.26.0", require: false
data/Gemfile.lock ADDED
@@ -0,0 +1,74 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ testa_appium_driver (0.1.131)
5
+ appium_lib_core (= 5.1.0)
6
+ json (~> 2.3)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ appium_lib_core (5.1.0)
12
+ faye-websocket (~> 0.11.0)
13
+ selenium-webdriver (~> 4.0)
14
+ ast (2.4.2)
15
+ childprocess (4.1.0)
16
+ diff-lcs (1.5.0)
17
+ eventmachine (1.2.7)
18
+ faye-websocket (0.11.1)
19
+ eventmachine (>= 0.12.0)
20
+ websocket-driver (>= 0.5.1)
21
+ json (2.6.2)
22
+ parallel (1.22.1)
23
+ parser (3.1.2.0)
24
+ ast (~> 2.4.1)
25
+ rainbow (3.1.1)
26
+ rake (13.0.6)
27
+ regexp_parser (2.4.0)
28
+ rexml (3.2.5)
29
+ rspec (3.11.0)
30
+ rspec-core (~> 3.11.0)
31
+ rspec-expectations (~> 3.11.0)
32
+ rspec-mocks (~> 3.11.0)
33
+ rspec-core (3.11.0)
34
+ rspec-support (~> 3.11.0)
35
+ rspec-expectations (3.11.0)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.11.0)
38
+ rspec-mocks (3.11.1)
39
+ diff-lcs (>= 1.2.0, < 2.0)
40
+ rspec-support (~> 3.11.0)
41
+ rspec-support (3.11.0)
42
+ rubocop (1.26.0)
43
+ parallel (~> 1.10)
44
+ parser (>= 3.1.0.0)
45
+ rainbow (>= 2.2.2, < 4.0)
46
+ regexp_parser (>= 1.8, < 3.0)
47
+ rexml
48
+ rubocop-ast (>= 1.16.0, < 2.0)
49
+ ruby-progressbar (~> 1.7)
50
+ unicode-display_width (>= 1.4.0, < 3.0)
51
+ rubocop-ast (1.18.0)
52
+ parser (>= 3.1.1.0)
53
+ ruby-progressbar (1.11.0)
54
+ rubyzip (2.3.2)
55
+ selenium-webdriver (4.1.0)
56
+ childprocess (>= 0.5, < 5.0)
57
+ rexml (~> 3.2, >= 3.2.5)
58
+ rubyzip (>= 1.2.2)
59
+ unicode-display_width (2.1.0)
60
+ websocket-driver (0.7.5)
61
+ websocket-extensions (>= 0.1.0)
62
+ websocket-extensions (0.1.5)
63
+
64
+ PLATFORMS
65
+ ruby
66
+
67
+ DEPENDENCIES
68
+ rake (~> 13.0)
69
+ rspec (~> 3.0)
70
+ rubocop (~> 1.26.0)
71
+ testa_appium_driver!
72
+
73
+ BUNDLED WITH
74
+ 2.1.2
data/LICENSE.txt CHANGED
@@ -1,21 +1,21 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2021 karlo.razumovic
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 karlo.razumovic
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.