public
Description: the [OpenWFEru] workflow and BPM engine (ruby)
Homepage: http://openwferu.rubyforge.org
Clone URL: git://github.com/jmettraux/ruote.git
release 0.9.18
jmettraux (author)
Wed May 21 18:54:04 -0700 2008
commit  6ec44023b32ce84dbf3fa6cc37940ce5d92bbcbb
tree    8a414950609bb20f14b826480826be889fda0fef
parent  da6aa21d25dc637c19bee87e70ed500c07992243
...
1
2
 
3
4
5
 
 
6
7
8
9
 
 
 
 
 
 
 
10
11
 
12
13
 
14
15
 
16
17
18
19
 
 
 
 
 
 
20
21
22
 
23
24
25
 
26
27
28
29
30
31
 
 
32
33
34
35
36
37
 
38
39
40
 
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
...
1
 
2
3
4
5
6
7
8
9
10
 
11
12
13
14
15
16
17
18
 
19
20
 
21
22
 
23
24
 
25
 
26
27
28
29
30
31
32
 
33
34
35
 
36
37
38
 
 
 
 
 
39
40
41
42
43
44
 
 
45
46
 
47
48
49
50
51
52
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
0
@@ -1,133 +1,101 @@
0
 
0
-= OpenWFE-ru 0.9.17 released
0
+= OpenWFEru (Ruote) 0.9.18 released
0
 
0
 OpenWFEru is an open source workflow / BPM engine implemented in Ruby.
0
 
0
+download : http://rubyforge.org/frs/?group_id=2609
0
+
0
 
0
 == What's new
0
 
0
-This release mainly focuses on separating OpenWFEru from its Rufus components [1], lots of code pieces reusable elsewhere have been extracted out of OpenWFEru as Ruby gems.
0
+The gems have been renamed "ruote" and "ruote-extras". The require paths have not changed.
0
+
0
+This name is shorter, easier to spell and serves as a handy prefix for subprojects like "ruote-web" and "ruote-rest".
0
+
0
+The source of all the Ruote projects (and the Rufus ones) has moved from RubyForge subversion to GitHub [1], feel free to fork.
0
+
0
+This new "ruote" uses threads in a more economic way. This adaptation was driven by deployments on JRuby 1.1.1 which exposed flaws in the way threads were used by OpenWFEru. Ruote now runs happily on Ruby 1.8.6 and JRuby 1.1.1.
0
 
0
-There has been a lot of work put in simplifying the internals of the engine, nothing changed on the surface though.
0
+There is a new "step" expression [2], spaghetti processes are now easier to script (it's OK as "ruote" is the name of a pasta variety).
0
 
0
-The engine.register_participant method now sports a :position optional argument (can be set to :first to insert a participant in the first position).
0
+This "step" expression is heavily involved in a new sub-project named "ruote-transition" [3][4]. It's a kind of translator that turns XPDL and YAWL process definitions to the Ruote process definition language.
0
 
0
-Process 'tags' have been made more visible via the process status (see [2]).
0
+Another addition to the "ruote" family is "ruote-rest" [5], a RESTful workflow / BPM system based on OpenWFEru and the Sinatra [6].
0
 
0
-Tomaso provided us with a more compact variant of the ActiveRecord based workitems, requiring less space (but less searchable).
0
 
0
-Many changes in OpenWFEru are visible via its demo web application, Densha [3], there is also a new example / tutorial, heavily leveraging Densha, it's available at [4].
0
+[1] http://github.com/jmettraux
0
+[2] http://openwferu.rubyforge.org/expressions.html#exp_step
0
+[3] http://github.com/jmettraux/ruote-transition
0
+[4] http://jmettraux.wordpress.com/2008/05/18/xpdl-for-fun/
0
+[5] http://jmettraux.wordpress.com/2008/05/07/restful-workflow-engine-on-sinatra/
0
+[6] http://sinatrarb.com
0
 
0
-The nicest new feature visible through Densha is probably "process gardening" where a 'business process administrator' can modify running process instances on the fly (see [5]).
0
 
0
+Many thanks to all that have contributed patches, suggested ideas and provided feedback.
0
 
0
-Feedback is welcome at : http://groups.google.com/group/openwferu-users
0
 
0
+== Feedback / help
0
 
0
-[1] http://rufus.rubyforge.org/
0
-[2] http://jmettraux.wordpress.com/2007/12/03/state-machine/
0
-[3] http://difference.openwfe.org:3000/
0
-[4] http://openwferu.rubyforge.org/ttt/p0.html
0
-[5] http://jmettraux.wordpress.com/2008/03/10/process-gardening/
0
+user mailing list : http://groups.google.com/group/openwferu-users
0
+dev mailing list : http://groups.google.com/group/openwferu-dev
0
 
0
 
0
 == What's next
0
 
0
-- 1.0 (instead of 0.9.18) ?
0
-- integration of rufus-verbs
0
+- 1.0 (instead of 0.9.19) ?
0
 - write mode for fluo
0
-- simplification for engine level crons
0
 - more expressions display support for Densha process definition graphical rendering
0
+- http verbs in the process definition language
0
 - more vapor
0
 
0
 
0
 == CHANGELOG
0
 
0
-- todo #18861 : aliased 'restore' to 'set-fields' and turned it into
0
- a ValueMixin user - s1617
0
-- todo #18806 : removed require "rubygems" from engine, leaving responsability
0
- to customer code - s1610
0
-- todo #18769 : now keeping track of raw_representation for all exps - s1604
0
-- todo #18773 : implemented engine.update_expression(fexp) - s1601
0
-- todo #18771 : deprecated SymbolHash (raw expression representation) - s1600
0
-- todo #18747 : allowing "iterator :on => :f" (symbol for designated source
0
- of value) - s1598
0
-- todo #18745 : let [concurrent-]iterator accept on-field, on-var, ... - s1597
0
-- todo #18701 : implemented engine.update_expression_data(fei, d) - s1583
0
-- bug #18700 : FlowExpressionId.from_h not working with jsonified hashes.
0
- Fixed - s1582
0
-- todo #18671 : added is_paused?(wfid) to StatusMixin - s1579
0
-- bug #18643 : made the workitem search a bit more 'google-like' - s1571
0
-- bug #18580 : active participant last_modified not kept. Fixed - s1568
0
-- bug #18557 : exp 'participant' not replying with applied item to cancel()
0
- calls. Fixed - s1552
0
-- todo #18531 : added 'unapplied' option to engine.process_stack() - s1547
0
-- bug #18348 : cron subprocesses subid reset at 0 upon restart. Fixed - s1542
0
-- bug #18254 : socketlistener not replying with <ok-reply/>. Fixed - s1530
0
-- bug #18218 : intermittent process_status.paused? failure. Fixed - s1520
0
-- todo #16635 : allowed recursion for top processes - s1518
0
-- todo #18192 : dropped SimpleExpRepresentation for Array - s1514
0
-- todo #18152 : simplified raw_xml and raw_prog to only raw.rb - s1513
0
-- todo #18110 : switched from open-uri to rufus-verbs for reading [remote]
0
- process definitions - s1512
0
-- todo #18145 : moved to no-params constructors for FlowExpression based
0
- classes - s1511
0
-- todo #18078 : <break if="${f:f}"/> will now work if field f is set - s1507
0
-- todo #15813 : isolated ValueMixin and used it in 'set', 'print', 'eval',
0
- 'reval' and 'log' - s1504
0
-- todo #17888 : optimized Workitem.search() - s1498
0
-- bug #17873 : ActiveParticipant not accepting string fields with length
0
- > 255. Fixed - s1497
0
-- bug #17850 : proc definitions whose 1st line is blank were not accepted.
0
- Fixed - s1496
0
-- todo #17851 : caching the paused? process info - s1494
0
-- todo #17826 : simplified workitem [] and []= impl - s1489
0
-- todo #17823 : implemented basecamp participant (extras) - s1486
0
-- todo #17744 : extracted sqs.rb and now depending on gem 'rufus-sqs' - s1470
0
-- patch #17720 : Tomaso's workitem.unset_attribute(). Patched - s1466
0
-- todo #17475 : extracted csv stuff and now depending on gem 'rufus-decision'
0
- - s1453
0
-- todo #17476 : extracted kotoba.rb and now depending on gem 'rufus-mnemo'
0
- - s1451
0
-- todo #17472 : extracted safe.rb and now depending on gem 'rufus-eval' - s1450
0
-- todo #17442 : extracted dollar.rb and now depending on gem 'rufus-dollar'
0
- - s1446
0
-- todo #16658 : extracted scheduler and now depending on gem 'rufus-scheduler'
0
- - s1444
0
-- todo #17100 : extracted lru and now depending on gem 'rufus-lru' - s1440
0
-- todo #17063 : compact workitems - s1438
0
-- todo #16976 : allowing compact :var, :v and :f for the '[un]defined'
0
- expressions - s1434
0
-- todo #16831 : allowing compact :var, :v and :f for :variable and :field
0
- (and also :val for :value) (for exp attributes) - s1431
0
-- todo #16825 : implemented the 'exp' doppelganger expression - s1429
0
-- bug #16833 : not using a monitor anymore in the scheduler, relying on
0
- queues. Finer granularity, more robust scheduler - s1425
0
-- bug #16791 : subprocess ref="sub_proc" was always looking for "sub-proc".
0
- Fixed - s1415
0
-- todo #16654 : allow every jobs to unschedule or reschedule self - s1404
0
-- todo #16586 : added the '[ is][ not] set' concept to the $ notation - s1397
0
-- todo #16588 : set a min frequency of 0.3s for WaitingExpression impls - s1395
0
-- todo #16492 : optimized the 'reserve' expression - s1390
0
-- todo #16323 : added wfname() and wfrevision() to ProcessStatus - s1360
0
-- todo #16254 : relaxed the rules for process name/revision detection
0
- in Ruby defined processes - s1347
0
-- todo #16228 : fulldup delegation - s1345
0
-- todo #16205 : replaced the expstorage each() system with the
0
- find_expressions() one - s1344
0
-- todo #16152 : scheduler : made schedule_every() reschedule even if
0
- it experienced an exception - s1337
0
-- todo #16066 : require 'openwfe/engine' and 'openwfe/participants' now ok
0
- - s1325
0
-- todo #16040 : implemented ProcessStatus.tags - s1323
0
-- todo #15925 : implemented engine.get_variables(fei_or_wfid) - s1319
0
-- todo #15985 : register_participant now has a :position param - s1313
0
-- todo #15954 : moved ${r:x} eval to safe level 4 - s1305
0
-- todo #15897 : revised expression_pool.cancel's fetch_root - s1298
0
-- bug #15830 : cancelling a cursor or a loop did not cancel active child
0
- expression. Fixed - s1293
0
-- bug #15814 : loop and cursor and no proper environment. Fixed - s1289
0
-- bug #15793 : hide db_id from user forms - s1287
0
-- todo #15758 : implemented the 'eval' expression - s1278
0
-- todo #15757 : made sure evaluation of process segments is accepted - s1276
0
+- todo #20221 : added engine.process_representation(wfid) method
0
+- todo #20244 : 'description' is now an expression like any other
0
+- todo #20228 : made sure removed expressions did not appear in
0
+ process_stack.representation()
0
+- bug #20225 : 'description' problem in process_stack.representation. Fixed.
0
+- todo #20202 : using 'ref' as the main 'step' attribute
0
+- bug #18954 : activity feed service stuck after 100 entries. Fixed.
0
+- bug #20128 : upgraded to atom-tools 2.0.1
0
+- todo #20111 : step_tail optimization of the "step" expression
0
+- todo #18222 : the <a> expression now accepts JSON
0
+- todo #20108 : upgraded the <a> expression to OpenWFE::Xml
0
+- bug #20059 : wfid growing .0.1.2.3 instead of .3 in some cases. Fixed.
0
+- todo #18935 : implemented "step" expression (test/ft_79b)
0
+- bug #20061 : get_description broken with Ruby pdef with no desc. Fixed.
0
+- todo #20016 : allowing "define 'process_def_name' do ... end"
0
+- todo #19933 : reintroduced ${vf:x} and ${fv:y}
0
+- todo #19536 : added :engine_name application context parameter
0
+- todo #19839 : moved storeparticipants out of worklist/
0
+- bug #19739 : made sure that ActiveParticipant didn't flatten Date and Time
0
+ instances found in workitem fields
0
+- todo #19704 : introduced parameter :definition_in_launchitem_allowed
0
+ (defaults to false)
0
+- bug #19607 : preventing cancel root expression bug (in case of error
0
+ in process)
0
+- todo #19559 : using Queue instead of schedule_every for threaded
0
+ expression storage
0
+- todo #19624 : 'if' now logs a warning message if more than 2 or 3 children
0
+- todo #19620 : making sure that the custom thread names are displayed
0
+ when ctrl-\ing JRuby
0
+- todo #19615 : making sure WorkQueue is freed when stopped.
0
+- bug #19576 : update_raw_expression() broken. Fixed.
0
+- todo #19575 : turned WorkQueueMixin into the WorkQueue service
0
+- todo #19532 : removed unnecessary synchronizations
0
+- todo #19471 : implemented new, lighter xml codec openwfe/util/xml
0
+- patch #19500 : size patch for db backed engine by Maarten Oelering
0
+- todo #19026 : keeping track of raw_representation in-flight changes
0
+ in [replying] children
0
+- : switched source to http://github.com/jmettraux/ruote
0
+- todo #19060 : added representation() to the result of engine.process_stack()
0
+- todo #19339 : fixed fulldup for Time and Date[Time] as reported by Maarten
0
+- todo #19104 : reformed the template system ( see http://tinyurl.com/2y6z9r )
0
+- bug #19095 : namespace problem for db enabled engine. Fix by Tomaso.
0
+- todo #19072 : 'cron' now leaves his template in the expool
0
+- todo #19061 : lib/openwfe/engine/ cleanup (more later)
0
+- todo #18995 : made 'cron' aware of process pause
0
+- todo #18518 : changed 'cron', broke the // exception
0
+- patch #18953 : smart dsub for expression args by Nick Petrella
0
 
...
30
31
32
33
 
34
35
36
...
39
40
41
42
 
 
43
44
45
46
47
48
49
50
 
 
51
52
53
...
58
59
60
61
62
 
 
63
64
65
66
67
68
 
69
70
71
...
73
74
75
76
 
 
77
78
79
...
113
114
115
116
 
117
118
119
120
121
122
 
 
123
124
125
...
30
31
32
 
33
34
35
36
...
39
40
41
 
42
43
44
45
46
47
48
49
 
 
50
51
52
53
54
...
59
60
61
 
 
62
63
64
65
66
67
68
 
69
70
71
72
...
74
75
76
 
77
78
79
80
81
...
115
116
117
 
118
119
120
121
122
 
 
123
124
125
126
127
0
@@ -30,7 +30,7 @@ CLEAN.include("pkg", "html", "rdoc", "work", "logs")
0
 
0
 spec = Gem::Specification.new do |s|
0
 
0
- s.name = "openwferu"
0
+ s.name = "ruote"
0
     s.version = OpenWFE::OPENWFERU_VERSION
0
     s.authors = [ "John Mettraux", "Alain Hoang" ]
0
     s.email = "john at openwfe dot org"
0
@@ -39,15 +39,16 @@ spec = Gem::Specification.new do |s|
0
     s.summary = "an open source ruby workflow and bpm engine"
0
 
0
     s.require_path = "lib"
0
- s.autorequire = "openwferu"
0
+ s.rubyforge_project = "openwferu"
0
+ #s.autorequire = "ruote"
0
     s.test_file = "test/rake_qtest.rb"
0
     s.has_rdoc = true
0
     s.extra_rdoc_files = [ 'README.txt' ]
0
 
0
     [ 'builder',
0
       'json_pure',
0
- 'rufus-lru',
0
- 'rufus-scheduler',
0
+ 'rufus-lru',
0
+ 'rufus-scheduler',
0
       'rufus-dollar',
0
       'rufus-eval',
0
       'rufus-mnemo',
0
@@ -58,14 +59,14 @@ spec = Gem::Specification.new do |s|
0
     end
0
 
0
     files = FileList[ "{bin,docs,lib,test,examples}/**/*" ]
0
- files.exclude "rdoc"
0
- files.exclude "extras"
0
+ files.exclude "rdoc"
0
+ files.exclude "extras"
0
     s.files = files.to_a
0
 end
0
 
0
 extras_spec = Gem::Specification.new do |s|
0
 
0
- s.name = "openwferu-extras"
0
+ s.name = "ruote-extras"
0
     s.version = OpenWFE::OPENWFERU_VERSION
0
     s.authors = [ "John Mettraux" ]
0
     s.email = "john at openwfe dot org"
0
@@ -73,7 +74,8 @@ extras_spec = Gem::Specification.new do |s|
0
     s.platform = Gem::Platform::RUBY
0
     s.summary = "OpenWFEru extras (sqs, csv, ...)"
0
     s.require_path = "lib"
0
- s.autorequire = "openwferu-extras"
0
+ s.rubyforge_project = "openwferu"
0
+ #s.autorequire = "ruote-extras"
0
     s.has_rdoc = false
0
 
0
     #[ 'rufus-decision', 'rufus-sqs' ].each do |d|
0
@@ -113,13 +115,13 @@ if RAKEVERSION != "0.8.1"
0
     #
0
     # Create a task to build the static docs (html)
0
     #
0
- ws = Rote::DocTask.new(:doc) do |site|
0
+ ws = Rote::DocTask.new(:doc) do |site|
0
 
0
         site.output_dir = 'html'
0
         site.layout_dir = 'doc/layouts'
0
         site.pages.dir = 'doc/pages'
0
- site.pages.include('**/*.thtml')
0
-
0
+ site.pages.include('**/*.thtml')
0
+
0
         site.ext_mapping(/thtml|textile/, 'html') do |page|
0
             page.extend Format::HTML
0
             page.page_filter Filters::RedCloth.new
...
1
2
3
 
4
5
6
 
7
8
9
10
11
12
 
13
14
15
...
83
84
85
86
 
87
88
89
...
123
124
125
126
 
127
128
129
 
130
...
1
2
 
3
4
5
 
6
7
8
9
10
11
 
12
13
14
15
...
83
84
85
 
86
87
88
89
...
123
124
125
 
126
127
128
 
129
130
0
@@ -1,15 +1,15 @@
0
 h2. OpenWFEru quickstart
0
 
0
-make sure you are using Ruby 1.8.5 at least
0
+make sure you are using Ruby 1.8.6 at least
0
 
0
 <pre>
0
- $ sudo gem install -y rufus-mnemo openwferu
0
+ $ sudo gem install -y ruote
0
 </pre>
0
 
0
 
0
 h3. your first OpenWFEru powered program
0
 
0
-edit a file named '"openwferu.rb":/examples/openwferu.rb'
0
+edit a file named '"openwferu.rb":/examples/workflow.rb'
0
 
0
     
0
 #:code#ruby#
0
@@ -83,7 +83,7 @@ engine.wait_for fei
0
 run that file
0
 
0
 <pre>
0
- $ ruby openwferu.rb
0
+ $ ruby workflow.rb
0
 </pre>
0
 
0
 
0
@@ -123,8 +123,8 @@ h3. (uninstalling openwferu)
0
 Maybe OpenWFEru isn't for you :
0
 
0
 <pre>
0
- $ sudo gem uninstall openwferu
0
+ $ sudo gem uninstall ruote
0
 </pre>
0
 
0
-(the openwferu gem depends on the gems 'rufus-lru', 'rufus-scheduler', 'rufus-eval' and 'rufus-dollar'. You might want to remove them as well)
0
+(the "ruote" gem depends on the gems 'rufus-lru', 'rufus-mnemo', 'rufus-scheduler', 'rufus-eval' and 'rufus-dollar'. You might want to remove them as well)
0
 
...
204
205
206
 
207
208
209
...
215
216
217
 
 
 
218
219
220
...
204
205
206
207
208
209
210
...
216
217
218
219
220
221
222
223
224
0
@@ -204,6 +204,7 @@ module Extras
0
 
0
                 wi.attributes.delete("compact_workitems")
0
                 i.yattributes = wi.attributes
0
+
0
             else
0
 
0
                 i.yattributes = nil
0
@@ -215,6 +216,9 @@ module Extras
0
 
0
             i.save!
0
                 # making sure to throw an exception in case of trouble
0
+ #
0
+ # damn, insert then update :(
0
+
0
             #end
0
 
0
             i
...
2
3
4
5
6
 
 
7
8
 
9
10
11
12
13
 
 
 
 
14
15
 
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
 
 
 
 
 
 
 
 
 
 
30
31
32
...
2
3
4
 
 
5
6
7
 
8
9
 
 
 
 
10
11
12
13
14
 
15
16
17
18
 
 
 
 
 
 
 
 
 
 
 
19
20
21
22
23
24
25
26
27
28
29
30
31
32
0
@@ -2,31 +2,31 @@
0
 #--
0
 # Copyright (c) 2005-2008, John Mettraux, OpenWFE.org
0
 # All rights reserved.
0
-#
0
-# Redistribution and use in source and binary forms, with or without
0
+#
0
+# Redistribution and use in source and binary forms, with or without
0
 # modification, are permitted provided that the following conditions are met:
0
-#
0
+#
0
 # . Redistributions of source code must retain the above copyright notice, this
0
-# list of conditions and the following disclaimer.
0
-#
0
-# . Redistributions in binary form must reproduce the above copyright notice,
0
-# this list of conditions and the following disclaimer in the documentation
0
+# list of conditions and the following disclaimer.
0
+#
0
+# . Redistributions in binary form must reproduce the above copyright notice,
0
+# this list of conditions and the following disclaimer in the documentation
0
 # and/or other materials provided with the distribution.
0
-#
0
+#
0
 # . Neither the name of the "OpenWFE" nor the names of its contributors may be
0
 # used to endorse or promote products derived from this software without
0
 # specific prior written permission.
0
-#
0
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0
+#
0
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0
 # POSSIBILITY OF SUCH DAMAGE.
0
 #++
0
 #

Comments

    No one has commented yet.