@effekt-lang/effekt 0.18.0 → 0.19.0

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.
@@ -0,0 +1,64 @@
1
+ module regex
2
+
3
+ import string
4
+
5
+ extern include chez "text/pregexp.scm"
6
+
7
+ extern type Regex
8
+
9
+ record Match(matched: String, index: Int)
10
+
11
+ extern pure def regex(str: String): Regex =
12
+ js "new RegExp(${str})"
13
+ chez "(pregexp ${str})"
14
+ vm "regex::regex(String)"
15
+
16
+ def exec(reg: Regex, str: String): Option[Match] = {
17
+ val v = internal::exec(reg, str)
18
+ if (v.isUndefined)
19
+ None()
20
+ else
21
+ Some(Match(internal::matched(v), internal::index(v)))
22
+ }
23
+
24
+ namespace internal {
25
+
26
+ /// The type RegexMatch is used internally to represent platform
27
+ /// dependent results of matching a regex.
28
+ extern type RegexMatch
29
+ // js: { matched: String, index: Int } | undefined
30
+ // vm: scala.util.matching.Regex.Match | null
31
+
32
+ extern pure def matched(r: RegexMatch): String =
33
+ js "${r}.matched"
34
+ chez "(vector-ref ${r} 0)"
35
+ vm "regex::matched(RegexMatch)"
36
+
37
+ extern pure def index(r: RegexMatch): Int =
38
+ js "${r}.index"
39
+ chez "(vector-ref ${r} 1)"
40
+ vm "regex::index(RegexMatch)"
41
+
42
+ extern js """
43
+ function regex$exec(reg, str) {
44
+ var res = reg.exec(str);
45
+ if (res === null) { return undefined }
46
+ else { return { matched: res[0], index: res.index } }
47
+ }
48
+ """
49
+
50
+ extern chez """
51
+ (define regex-exec
52
+ (lambda (regex str)
53
+ (let* ([positions (pregexp-match-positions regex str)]
54
+ [match (pregexp-match regex str)])
55
+ (if (and positions match)
56
+ (vector (car match) (caar positions))
57
+ #f))))
58
+ """
59
+
60
+ extern io def exec(reg: Regex, str: String): RegexMatch =
61
+ js "regex$exec(${reg}, ${str})"
62
+ chez "(regex-exec ${reg} ${str})"
63
+ vm "regex::exec(Regex, String)"
64
+ }
@@ -0,0 +1,234 @@
1
+ module set
2
+
3
+ import map
4
+
5
+ /// Ordered finite immutable set, backed by balanced binary trees of logarithmic depth.
6
+ record Set[A](tree: internal::Tree[A, Unit], compare: (A, A) => Ordering at {})
7
+
8
+ /// Create a new empty set using a pure, first-class comparison function.
9
+ ///
10
+ /// O(1)
11
+ def empty[A](compare: (A, A) => Ordering at {}): Set[A] =
12
+ Set(internal::empty(), compare)
13
+
14
+ /// Create a new empty set using a generic comparison function.
15
+ /// Only available on JavaScript backends!
16
+ ///
17
+ /// O(1)
18
+ def emptyGeneric[A](): Set[A] =
19
+ Set(
20
+ internal::empty(),
21
+ box { (left: A, right: A) => genericCompare(left, right) }
22
+ )
23
+
24
+ /// Check if set `s` is empty.
25
+ ///
26
+ /// O(1)
27
+ def isEmpty[A](s: Set[A]): Bool = internal::isEmpty(s.tree)
28
+
29
+ /// Check if set `s` is nonempty.
30
+ ///
31
+ /// O(1)
32
+ def nonEmpty[A](s: Set[A]): Bool = internal::nonEmpty(s.tree)
33
+
34
+ /// Create a new set containing a single `element`.
35
+ /// Requires a pure, first-class comparison function.
36
+ ///
37
+ /// O(1)
38
+ def singleton[A](element: A, compare: (A, A) => Ordering at {}): Set[A] =
39
+ Set(internal::singleton(element, ()), compare)
40
+
41
+ /// Create a new set containing a single `element` and a generic comparison function.
42
+ /// Only available on the JavaScript backends!
43
+ ///
44
+ /// O(1)
45
+ def singletonGeneric[A](element: A): Set[A] =
46
+ Set(
47
+ internal::singleton(element, ()),
48
+ box { (left: A, right: A) => genericCompare(left, right) }
49
+ )
50
+
51
+ /// Get the size of the set (the number of its elements).
52
+ ///
53
+ /// O(1)
54
+ def size[A](s: Set[A]): Int = internal::size(s.tree)
55
+
56
+ /// Insert a new element `a` into the set `s`.
57
+ ///
58
+ /// O(log N)
59
+ def insert[A](s: Set[A], a: A): Set[A] = {
60
+ val newTree = internal::put(s.tree, s.compare, a, ())
61
+ Set(newTree, s.compare)
62
+ }
63
+
64
+ /// Create a set from a given map by ignoring the values.
65
+ ///
66
+ /// O(N)
67
+ def fromMapKeys[K, V](map: Map[K, V]): Set[K] =
68
+ Set(internal::forget(map.tree), map.compare)
69
+
70
+ /// Create a map from a set and a function,
71
+ /// reusing the set's comparison.
72
+ ///
73
+ /// O(N)
74
+ def toMap[K, V](keys: Set[K]) { valueOf: K => V }: Map[K, V] = {
75
+ val newTree: internal::Tree[K, V] = internal::map(keys.tree) { (k, _v) => valueOf(k) }
76
+ Map(newTree, keys.compare)
77
+ }
78
+
79
+ /// Create a set from a given list and a pure, first-class comparison function.
80
+ ///
81
+ /// O(N log N)
82
+ /// O(N) if the list is sorted
83
+ def fromList[A](list: List[A], compare: (A, A) => Ordering at {}): Set[A] = {
84
+ val tree: internal::Tree[A, Unit] = internal::fromList(list.map { k => (k, ()) }, compare)
85
+ Set(tree, compare)
86
+ }
87
+
88
+ /// Create a set from a given list with a generic comparison function.
89
+ /// Works only on the JavaScript backends!
90
+ ///
91
+ /// O(N log N)
92
+ /// O(N) if the list is sorted
93
+ def fromListGeneric[A](list: List[A]): Set[A] = {
94
+ val compare: (A, A) => Ordering at {} = box { (left, right) => genericCompare(left, right) }
95
+ val tree: internal::Tree[A, Unit] = internal::fromList(list.map { k => (k, ()) }, compare)
96
+ Set(tree, compare)
97
+ }
98
+
99
+ /// Traverse all elements in order, running the function `action` on each element.
100
+ ///
101
+ /// Law: `s.foreach { action } === s.toList.foreach { action }`
102
+ ///
103
+ /// O(N)
104
+ def foreach[A](s: Set[A]) { action: A => Unit }: Unit =
105
+ internal::foreach(s.tree) { (k, _v) => action(k) }
106
+
107
+ /// Create a list from a given set.
108
+ ///
109
+ /// O(N)
110
+ def toList[A](s: Set[A]): List[A] = {
111
+ var acc = Nil()
112
+ s.foreach { a =>
113
+ acc = Cons(a, acc)
114
+ }
115
+ acc.reverse
116
+ }
117
+
118
+ /// Check if a predicate holds for all elements in a given set.
119
+ ///
120
+ /// O(N)
121
+ def all[A](s: Set[A]) { predicate : A => Bool }: Bool = {
122
+ var result = true
123
+ s.foreach { a =>
124
+ if (not(predicate(a))) { result = false }
125
+ }
126
+ result
127
+ }
128
+
129
+ /// Check if a predicate holds for at least one element in a given set.
130
+ ///
131
+ /// O(N)
132
+ def any[A](s: Set[A]) { predicate: A => Bool }: Bool = {
133
+ var result = false
134
+ s.foreach { a =>
135
+ if (predicate(a)) { result = true }
136
+ }
137
+ result
138
+ }
139
+
140
+ /// Check if a set contains a given element.
141
+ ///
142
+ /// O(log N)
143
+ def contains[A](s: Set[A], a: A): Bool =
144
+ internal::get(s.tree, s.compare, a) match {
145
+ case None() => false
146
+ case Some(v) => true
147
+ }
148
+
149
+
150
+ /// Check if set `s1` is a subset of set `s2`.
151
+ ///
152
+ /// O(N log N)
153
+ def subset[A](s1: Set[A], s2: Set[A]): Bool = {
154
+ s1.all { a =>
155
+ s2.contains(a)
156
+ }
157
+ }
158
+
159
+ /// Check if set `s1` is a superset of set `s2`.
160
+ ///
161
+ /// O(N log N)
162
+ def superset[A](s1: Set[A], s2: Set[A]): Bool = {
163
+ s2.subset(s1)
164
+ }
165
+
166
+ /// Remove an element from a set.
167
+ /// If the element is not in the set, the original set is returned.
168
+ ///
169
+ /// O(log N)
170
+ def delete[A](s: Set[A], a: A): Set[A] = {
171
+ val newTree = internal::delete(s.tree, s.compare, a)
172
+ Set(newTree, s.compare)
173
+ }
174
+
175
+ /// Remove many elements from a set.
176
+ ///
177
+ /// O(M log N) where M is the size of the list.
178
+ def deleteMany[A](s: Set[A], list: List[A]): Set[A] = {
179
+ var tmp = s
180
+ list.foreach { a =>
181
+ tmp = tmp.delete(a)
182
+ }
183
+ tmp
184
+ }
185
+
186
+ /// Construct a new set which contains all elements of `s1`
187
+ /// except those where the element is in `s2`.
188
+ /// Uses an explicit comparison function.
189
+ ///
190
+ /// O(???)
191
+ def difference[A](s1: Set[A], s2: Set[A], compare: (A, A) => Ordering at {}): Set[A] = {
192
+ val newTree = internal::difference(s1.tree, s2.tree, compare)
193
+ Set(newTree, compare)
194
+ }
195
+
196
+ /// Construct a new set which contains all elements of `s1`
197
+ /// except those where the element is in `s2`.
198
+ /// Uses a comparison function from `s1`.
199
+ ///
200
+ /// O(???)
201
+ def difference[A](s1: Set[A], s2: Set[A]): Set[A] =
202
+ s1.difference(s2, s1.compare)
203
+
204
+ /// Construct a new set which contains both elements of `s1` and `s2`.
205
+ /// Uses an explicit comparison function.
206
+ ///
207
+ /// O(???)
208
+ def union[A](s1: Set[A], s2: Set[A], compare: (A, A) => Ordering at {}): Set[A] = {
209
+ val newTree = internal::union(s1.tree, s2.tree, compare) { (_k, _v1, _v2) => () }
210
+ Set(newTree, compare)
211
+ }
212
+
213
+ /// Construct a new set which contains both elements of `s1` and `s2`.
214
+ /// Uses a comparison function from `s1`.
215
+ ///
216
+ /// O(???)
217
+ def union[A](s1: Set[A], s2: Set[A]): Set[A] =
218
+ s1.union(s2, s1.compare)
219
+
220
+ /// Construct a new set which contains only elements which are in both of `s1` and `s2`.
221
+ /// Uses an explicit comparison function.
222
+ ///
223
+ /// O(???)
224
+ def intersection[A](s1: Set[A], s2: Set[A], compare: (A, A) => Ordering at {}): Set[A] = {
225
+ val newTree = internal::intersection(s1.tree, s2.tree, compare) { (_k, _v1, _v2) => () }
226
+ Set(newTree, compare)
227
+ }
228
+
229
+ /// Construct a new set which contains only elements which are in both of `s1` and `s2`.
230
+ /// Uses a comparison function from `s1`.
231
+ ///
232
+ /// O(???)
233
+ def intersection[A](s1: Set[A], s2: Set[A]): Set[A] =
234
+ s1.intersection(s2, s1.compare)
@@ -2,6 +2,9 @@ module stream
2
2
 
3
3
  import array
4
4
  import bytearray
5
+ import map
6
+ import set
7
+
5
8
  import io/filesystem
6
9
  import io/error
7
10
 
@@ -63,6 +66,26 @@ def each(bytes: ByteArray): Unit / emit[Byte] = {
63
66
  go(0)
64
67
  }
65
68
 
69
+ /// Turns a `map` into a producer of a push stream
70
+ /// of `(key, value)` pairs by emitting each contained *in order*.
71
+ def each[K, V](map: Map[K, V]): Unit / emit[(K, V)] =
72
+ map.foreach { (k, v) => do emit((k, v)) }
73
+
74
+ /// Turns a `map` into a producer of a push stream
75
+ /// of its keys by emitting each contained *in order*.
76
+ def eachKey[K, V](map: Map[K, V]): Unit / emit[K] =
77
+ map.foreach { (k, _v) => do emit(k) }
78
+
79
+ /// Turns a `map` into a producer of a push stream
80
+ /// of its values by emitting each contained.
81
+ def eachValue[K, V](map: Map[K, V]): Unit / emit[V] =
82
+ map.foreach { (_k, v) => do emit(v) }
83
+
84
+ /// Turns a `set` into a producer of a push stream
85
+ /// by emitting each contained *in order*.
86
+ def each[A](set: Set[A]): Unit / emit[A] =
87
+ set.foreach { x => do emit(x) }
88
+
66
89
  // not option
67
90
  // not dequeue
68
91
  // not queue
@@ -168,6 +191,28 @@ def feed[T, R](list: List[T]) { reader: () => R / read[T] }: R = {
168
191
  }
169
192
  }
170
193
 
194
+ def collectMap[K, V, R](compare: (K, K) => Ordering at {}) { stream: () => R / emit[(K, V)] }: (R, Map[K, V]) =
195
+ try {
196
+ (stream(), map::empty(compare))
197
+ } with emit[(K, V)] { case (k, v) =>
198
+ val (r, map) = resume(());
199
+ (r, map.put(k, v))
200
+ }
201
+
202
+ def collectMap[K, V](compare: (K, K) => Ordering at {}) { stream: () => Any / emit[(K, V)] }: Map[K, V] =
203
+ collectMap[K, V, Any](compare){stream}.second
204
+
205
+ def collectSet[A, R](compare: (A, A) => Ordering at {}) { stream: () => R / emit[A] }: (R, Set[A]) =
206
+ try {
207
+ (stream(), set::empty(compare))
208
+ } with emit[A] { (v) =>
209
+ val (r, set) = resume(());
210
+ (r, set.insert(v))
211
+ }
212
+
213
+ def collectSet[A](compare: (A, A) => Ordering at {}) { stream: () => Any / emit[A] }: Set[A] =
214
+ collectSet[A, Any](compare){stream}.second
215
+
171
216
  def feed[T, R](array: Array[T]) { reader: () => R / read[T] }: R = {
172
217
  var i = 0
173
218
  try {
@@ -243,11 +243,13 @@ extern pure def toInt(ch: Char): Int =
243
243
  js "${ch}"
244
244
  chez "${ch}"
245
245
  llvm "ret %Int ${ch}"
246
+ vm "string::toInt(Char)"
246
247
 
247
248
  extern pure def toChar(codepoint: Int): Char =
248
249
  js "${codepoint}"
249
250
  chez "${codepoint}"
250
251
  llvm "ret %Int ${codepoint}"
252
+ vm "string::toChar(Int)"
251
253
 
252
254
 
253
255
  extern pure def infixLt(x: Char, y: Char): Bool =
@@ -259,6 +261,7 @@ extern pure def infixLt(x: Char, y: Char): Bool =
259
261
  %adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
260
262
  ret %Pos %adt_boolean
261
263
  """
264
+ vm "string::infixLt(Char, Char)"
262
265
 
263
266
  extern pure def infixLte(x: Char, y: Char): Bool =
264
267
  js "(${x} <= ${y})"
@@ -269,6 +272,7 @@ extern pure def infixLte(x: Char, y: Char): Bool =
269
272
  %adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
270
273
  ret %Pos %adt_boolean
271
274
  """
275
+ vm "string::infixLte(Char, Char)"
272
276
 
273
277
  extern pure def infixGt(x: Char, y: Char): Bool =
274
278
  js "(${x} > ${y})"
@@ -279,6 +283,7 @@ extern pure def infixGt(x: Char, y: Char): Bool =
279
283
  %adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
280
284
  ret %Pos %adt_boolean
281
285
  """
286
+ vm "string::infixGt(Char, Char)"
282
287
 
283
288
  extern pure def infixGte(x: Char, y: Char): Bool =
284
289
  js "(${x} >= ${y})"
@@ -289,6 +294,7 @@ extern pure def infixGte(x: Char, y: Char): Bool =
289
294
  %adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
290
295
  ret %Pos %adt_boolean
291
296
  """
297
+ vm "string::infixGte(Char, Char)"
292
298
 
293
299
 
294
300
  /**
@@ -327,3 +333,4 @@ extern pure def unsafeCharAt(str: String, n: Int): Char =
327
333
  %x = call %Int @c_bytearray_character_at(%Pos ${str}, %Int ${n})
328
334
  ret %Int %x
329
335
  """
336
+ vm "string::unsafeCharAt(String, Int)"
@@ -152,16 +152,45 @@ struct Pos c_bytearray_equal(const struct Pos left, const struct Pos right) {
152
152
  erasePositive(right);
153
153
  return BooleanFalse;
154
154
  }
155
- for (uint64_t j = 0; j < left_size; ++j) {
156
- if (c_bytearray_data(left)[j] != c_bytearray_data(right)[j]) {
157
- erasePositive(left);
158
- erasePositive(right);
159
- return BooleanFalse;
160
- }
155
+
156
+ int cmp = memcmp(c_bytearray_data(left), c_bytearray_data(right), left_size);
157
+ erasePositive(left);
158
+ erasePositive(right);
159
+ return (cmp == 0 ? BooleanTrue : BooleanFalse);
160
+ }
161
+
162
+ Int c_bytearray_compare(const struct Pos left, const struct Pos right) {
163
+ uint64_t left_size = left.tag;
164
+ uint64_t right_size = right.tag;
165
+ uint64_t min_size = (left_size < right_size) ? left_size : right_size;
166
+
167
+ uint8_t* left_data = c_bytearray_data(left);
168
+ uint8_t* right_data = c_bytearray_data(right);
169
+
170
+ if (left_data == right_data) {
171
+ erasePositive(left);
172
+ erasePositive(right);
173
+ return 0;
161
174
  }
175
+
176
+ int cmp = memcmp(left_data, right_data, min_size);
177
+
162
178
  erasePositive(left);
163
179
  erasePositive(right);
164
- return BooleanTrue;
180
+
181
+ if (cmp < 0) {
182
+ return -1;
183
+ } else if (cmp > 0) {
184
+ return 1;
185
+ }
186
+
187
+ if (left_size < right_size) {
188
+ return -1;
189
+ } else if (left_size > right_size) {
190
+ return 1;
191
+ }
192
+
193
+ return 0;
165
194
  }
166
195
 
167
196
  // TODO deprecate
@@ -37,6 +37,7 @@ declare %Pos @c_bytearray_show_Double(double)
37
37
 
38
38
  declare %Pos @c_bytearray_concatenate(%Pos, %Pos)
39
39
  declare %Pos @c_bytearray_equal(%Pos, %Pos)
40
+ declare %Int @c_bytearray_compare(%Pos, %Pos)
40
41
 
41
42
  declare %Pos @c_bytearray_substring(%Pos, i64, i64)
42
43
  declare %Int @c_bytearray_character_at(%Pos, i64)
@@ -40,4 +40,5 @@ int main(int argc, char *argv[]) {
40
40
  uv_loop_t *loop = uv_default_loop();
41
41
  uv_run(loop, UV_RUN_DEFAULT);
42
42
  uv_loop_close(loop);
43
+ return 0;
43
44
  }
@@ -1,4 +1,4 @@
1
- <!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Eclipse Public License 2.0 (EPL) | The Eclipse Foundation</title><meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:image content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.110.0"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=1737314120"><script>(function(e,t,n,s,o){e[s]=e[s]||[],e[s].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var a=t.getElementsByTagName(n)[0],i=t.createElement(n),r=s!="dataLayer"?"&l="+s:"";i.async=!0,i.src="https://www.googletagmanager.com/gtm.js?id="+o+r,a.parentNode.insertBefore(i,a)})(window,document,"script","dataLayer","GTM-5WLCZXC")</script><script>var tableClasses="table"</script><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel=stylesheet type=text/css></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WLCZXC" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><a class=sr-only href=#content>Skip to main content</a><header class="header-wrapper header-wrapper" id=header><div class=header-toolbar><div class=container><div class=header-toolbar-row><div class="toolbar-btn toolbar-search-btn dropdown"><button class=dropdown-toggle id=toolbar-search type=button data-toggle=dropdown tabindex=0 aria-label=Search>
1
+ <!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Eclipse Public License 2.0 (EPL) | The Eclipse Foundation</title><meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:image content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.110.0"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=1737918922"><script>(function(e,t,n,s,o){e[s]=e[s]||[],e[s].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var a=t.getElementsByTagName(n)[0],i=t.createElement(n),r=s!="dataLayer"?"&l="+s:"";i.async=!0,i.src="https://www.googletagmanager.com/gtm.js?id="+o+r,a.parentNode.insertBefore(i,a)})(window,document,"script","dataLayer","GTM-5WLCZXC")</script><script>var tableClasses="table"</script><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel=stylesheet type=text/css></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WLCZXC" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><a class=sr-only href=#content>Skip to main content</a><header class="header-wrapper header-wrapper" id=header><div class=header-toolbar><div class=container><div class=header-toolbar-row><div class="toolbar-btn toolbar-search-btn dropdown"><button class=dropdown-toggle id=toolbar-search type=button data-toggle=dropdown tabindex=0 aria-label=Search>
2
2
  <i class="fa fa-search fa-lg" aria-role=none></i></button><div class="toolbar-search-bar-wrapper dropdown-menu dropdown-menu-right" aria-labelledby=toolbar-search><form action=https://www.eclipse.org/home/search method=get><div class=search-bar><input class=search-bar-input name=q placeholder=Search>
3
3
  <button>
4
4
  <i class="fa fa-search" type=submit></i></button></div></form></div></div><div class="toolbar-btn toolbar-user-menu-btn dropdown"><button class=dropdown-toggle id=toolbar-user-menu type=button data-toggle=dropdown tabindex=0 aria-label="User Menu">
@@ -57,5 +57,5 @@ open source software collaboration and innovation.</p></div><div class=mega-menu
57
57
  <i class="fa-brands fa-linkedin-in fa-stack-1x fa-inverse" aria-hidden=true></i>
58
58
  <span class=sr-only>Linkedin account</span></span></a></li></ul></div></div><div class="footer-sections row equal-height-md font-bold"><div class=col-md-15><div class=row><section id=footer-eclipse-foundation class="footer-section col-sm-8"><div class=menu-heading>Eclipse Foundation</div><ul class=nav><li><a href=https://www.eclipse.org/org/>About</a></li><li><a href=https://projects.eclipse.org/>Projects</a></li><li><a href=https://www.eclipse.org/collaborations/>Collaborations</a></li><li><a href=https://www.eclipse.org/membership/>Membership</a></li><li><a href=https://www.eclipse.org/sponsor/>Sponsor</a></li></ul></section><section id=footer-legal class="footer-section col-sm-8"><div class=menu-heading>Legal</div><ul class=nav><li><a href=https://www.eclipse.org/legal/privacy/>Privacy Policy</a></li><li><a href=https://www.eclipse.org/legal/terms-of-use/>Terms of Use</a></li><li><a href=https://www.eclipse.org/legal/compliance/>Compliance</a></li><li><a href=https://www.eclipse.org/org/documents/Community_Code_of_Conduct.php>Code of Conduct</a></li><li><a href=https://www.eclipse.org/legal/>Legal Resources</a></li><li><a class=toolbar-manage-cookies href=# onclick=event.preventDefault()>Manage Cookies</a></li></ul></section><section id=footer-more class="footer-section col-sm-8"><div class=menu-heading>More</div><ul class=nav><li><a href=https://www.eclipse.org/security/>Report a Vulnerability</a></li><li><a href=https://status.eclipse.org/>Service Status</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact Us</a></li><li><a href=https://www.eclipse.org/projects/support/>Support</a></li></ul></section></div></div><div id=footer-end class="footer-section col-md-8 col-md-offset-1 col-sm-24"><div class=footer-end-newsletter><form id=mc-embedded-subscribe-form action=https://eclipsecon.us6.list-manage.com/subscribe/post method=post novalidate target=_blank><label class=footer-end-newsletter-label for=email>Subscribe to our Newsletter</label><div class=footer-end-newsletter-input-wrapper><input class=footer-end-newsletter-input type=email id=email name=EMAIL autocomplete=email placeholder="Enter your email address"><div><i class="fa fa-solid fa-envelope fa-lg" aria-hidden=true></i></div></div><input type=hidden name=u value=eaf9e1f06f194eadc66788a85>
59
59
  <input type=hidden name=id value=46e57eacf1>
60
- <input id=mc-embedded-subscribe type=submit name=subscribe hidden></form></div></div></div><div class="col-sm-24 margin-top-20"><div class=row><div id=copyright class=col-md-16><p id=copyright-text>Copyright &copy; Eclipse Foundation AISBL. All Rights Reserved.</p></div></div></div><a href=# class=scrollup>Back to the top</a></div></footer><div id=footer-js><script src="/public/js/main.js?v1.0?v=1737314120"></script>
60
+ <input id=mc-embedded-subscribe type=submit name=subscribe hidden></form></div></div></div><div class="col-sm-24 margin-top-20"><div class=row><div id=copyright class=col-md-16><p id=copyright-text>Copyright &copy; Eclipse Foundation AISBL. All Rights Reserved.</p></div></div></div><a href=# class=scrollup>Back to the top</a></div></footer><div id=footer-js><script src="/public/js/main.js?v1.0?v=1737918922"></script>
61
61
  <script>(function(){})(jQuery,document)</script></div></body></html>
@@ -298,7 +298,7 @@ jQuery(function(jQuery){jQuery.datepicker.setDefaults({"closeText":"Close","curr
298
298
  <script type="text/javascript" src="https://c0.wp.com/c/6.7.1/wp-includes/js/jquery/ui/dialog.min.js" id="jquery-ui-dialog-js"></script>
299
299
  <script type="text/javascript" id="events-manager-js-extra">
300
300
  /* <![CDATA[ */
301
- var EM = {"ajaxurl":"https:\/\/opensource.org\/wp-admin\/admin-ajax.php","locationajaxurl":"https:\/\/opensource.org\/wp-admin\/admin-ajax.php?action=locations_search","firstDay":"1","locale":"en","dateFormat":"yy-mm-dd","ui_css":"https:\/\/opensource.org\/wp-content\/plugins\/events-manager\/includes\/css\/jquery-ui\/build.min.css","show24hours":"0","is_ssl":"1","autocomplete_limit":"10","calendar":{"breakpoints":{"small":560,"medium":908,"large":false}},"phone":"","datepicker":{"format":"Y-m-d"},"search":{"breakpoints":{"small":650,"medium":850,"full":false}},"url":"https:\/\/opensource.org\/wp-content\/plugins\/events-manager","bookingInProgress":"Please wait while the booking is being submitted.","tickets_save":"Save Ticket","bookingajaxurl":"https:\/\/opensource.org\/wp-admin\/admin-ajax.php","bookings_export_save":"Export Bookings","bookings_settings_save":"Save Settings","booking_delete":"Are you sure you want to delete?","booking_offset":"30","bookings":{"submit_button":{"text":{"default":"Submit Booking","free":"Submit Booking","payment":"Submit Booking - %s","processing":"Processing ..."}},"update_listener":""},"bb_full":"Sold Out","bb_book":"Book Now","bb_booking":"Booking...","bb_booked":"Booking Submitted","bb_error":"Booking Error. Try again?","bb_cancel":"Cancel","bb_canceling":"Canceling...","bb_cancelled":"Cancelled","bb_cancel_error":"Cancellation Error. Try again?","txt_search":"Search","txt_searching":"Searching...","txt_loading":"Loading...","cache":"1","api_nonce":"78434fac4e","attendance_api_url":"https:\/\/opensource.org\/wp-json\/events-manager\/v1\/attendance"};
301
+ var EM = {"ajaxurl":"https:\/\/opensource.org\/wp-admin\/admin-ajax.php","locationajaxurl":"https:\/\/opensource.org\/wp-admin\/admin-ajax.php?action=locations_search","firstDay":"1","locale":"en","dateFormat":"yy-mm-dd","ui_css":"https:\/\/opensource.org\/wp-content\/plugins\/events-manager\/includes\/css\/jquery-ui\/build.min.css","show24hours":"0","is_ssl":"1","autocomplete_limit":"10","calendar":{"breakpoints":{"small":560,"medium":908,"large":false}},"phone":"","datepicker":{"format":"Y-m-d"},"search":{"breakpoints":{"small":650,"medium":850,"full":false}},"url":"https:\/\/opensource.org\/wp-content\/plugins\/events-manager","bookingInProgress":"Please wait while the booking is being submitted.","tickets_save":"Save Ticket","bookingajaxurl":"https:\/\/opensource.org\/wp-admin\/admin-ajax.php","bookings_export_save":"Export Bookings","bookings_settings_save":"Save Settings","booking_delete":"Are you sure you want to delete?","booking_offset":"30","bookings":{"submit_button":{"text":{"default":"Submit Booking","free":"Submit Booking","payment":"Submit Booking - %s","processing":"Processing ..."}},"update_listener":""},"bb_full":"Sold Out","bb_book":"Book Now","bb_booking":"Booking...","bb_booked":"Booking Submitted","bb_error":"Booking Error. Try again?","bb_cancel":"Cancel","bb_canceling":"Canceling...","bb_cancelled":"Cancelled","bb_cancel_error":"Cancellation Error. Try again?","txt_search":"Search","txt_searching":"Searching...","txt_loading":"Loading...","cache":"1","api_nonce":"2142c68a49","attendance_api_url":"https:\/\/opensource.org\/wp-json\/events-manager\/v1\/attendance"};
302
302
  /* ]]> */
303
303
  </script>
304
304
  <script type="text/javascript" src="https://149753425.v2.pressablecdn.com/wp-content/plugins/events-manager/includes/js/events-manager.js?ver=6.6.3" id="events-manager-js"></script>
@@ -861,6 +861,10 @@ form.customize-unpreviewable {
861
861
  height: auto;
862
862
  border-radius: 8px;
863
863
  margin-bottom: 10px;
864
+ }
865
+
866
+ .updated {
867
+ display: none;
864
868
  } </style>
865
869
  </head>
866
870
 
@@ -1026,7 +1030,7 @@ form.customize-unpreviewable {
1026
1030
  <li id="menu-item-5429" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5429"><a href="https://go.opensource.org/osaid-latest">OSAI Definition</a></li>
1027
1031
  <li id="menu-item-5421" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5428"><a href="https://opensource.org/ai/process">Process</a></li>
1028
1032
  <li id="menu-item-5430" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5430"><a href="https://opensource.org/ai/timeline">Timeline</a></li>
1029
- <li id="menu-item-24456" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-24456"><a href="https://opensource.org/ai/faqs">FAQs</a></li>
1033
+ <li id="menu-item-24456" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-24456"><a href="https://opensource.org/ai/faq">FAQ</a></li>
1030
1034
  <li id="menu-item-17410" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-17410"><a href="https://opensource.org/ai/forums">Forum</a></li>
1031
1035
  </ul>
1032
1036
  </div>
@@ -1251,37 +1255,37 @@ wp.jpI18nLoader.state = {"baseUrl":"https://opensource.org/wp-content/languages/
1251
1255
  <script type="text/javascript" src="https://149753425.v2.pressablecdn.com/wp-content/plugins/gutenberg/build/url/index.min.js?ver=499ac283dc628dfb623e" id="wp-url-js"></script>
1252
1256
  <script type="text/javascript" id="jetpack-instant-search-js-before">
1253
1257
  /* <![CDATA[ */
1254
- var JetpackInstantSearchOptions=JSON.parse(decodeURIComponent("%7B%22overlayOptions%22%3A%7B%22colorTheme%22%3A%22light%22%2C%22enableInfScroll%22%3Atrue%2C%22enableFilteringOpensOverlay%22%3Atrue%2C%22enablePostDate%22%3Atrue%2C%22enableSort%22%3Atrue%2C%22highlightColor%22%3A%22%23fdd7b9%22%2C%22overlayTrigger%22%3A%22submit%22%2C%22resultFormat%22%3A%22expanded%22%2C%22showPoweredBy%22%3Atrue%2C%22defaultSort%22%3A%22relevance%22%2C%22excludedPostTypes%22%3A%5B%22attachment%22%5D%7D%2C%22homeUrl%22%3A%22https%3A%5C%2F%5C%2Fopensource.org%22%2C%22locale%22%3A%22en-US%22%2C%22postsPerPage%22%3A12%2C%22siteId%22%3A210318891%2C%22postTypes%22%3A%7B%22post%22%3A%7B%22singular_name%22%3A%22Post%22%2C%22name%22%3A%22Posts%22%7D%2C%22page%22%3A%7B%22singular_name%22%3A%22Page%22%2C%22name%22%3A%22Pages%22%7D%2C%22attachment%22%3A%7B%22singular_name%22%3A%22Media%22%2C%22name%22%3A%22Media%22%7D%2C%22supporter%22%3A%7B%22singular_name%22%3A%22Supporter%22%2C%22name%22%3A%22Supporters%22%7D%2C%22board-member%22%3A%7B%22singular_name%22%3A%22Board%20Member%22%2C%22name%22%3A%22Board%20Members%22%7D%2C%22license%22%3A%7B%22singular_name%22%3A%22License%22%2C%22name%22%3A%22Licenses%22%7D%2C%22meeting-minutes%22%3A%7B%22singular_name%22%3A%22Meeting%20Minutes%22%2C%22name%22%3A%22Meeting%20Minutes%22%7D%2C%22press-mentions%22%3A%7B%22singular_name%22%3A%22Press%20mentions%22%2C%22name%22%3A%22Press%20mentions%22%7D%7D%2C%22webpackPublicPath%22%3A%22https%3A%5C%2F%5C%2Fopensource.org%5C%2Fwp-content%5C%2Fplugins%5C%2Fjetpack%5C%2Fjetpack_vendor%5C%2Fautomattic%5C%2Fjetpack-search%5C%2Fbuild%5C%2Finstant-search%5C%2F%22%2C%22isPhotonEnabled%22%3Atrue%2C%22isFreePlan%22%3Afalse%2C%22apiRoot%22%3A%22https%3A%5C%2F%5C%2Fopensource.org%5C%2Fwp-json%5C%2F%22%2C%22apiNonce%22%3A%2278434fac4e%22%2C%22isPrivateSite%22%3Afalse%2C%22isWpcom%22%3Afalse%2C%22hasOverlayWidgets%22%3Atrue%2C%22widgets%22%3A%5B%7B%22filters%22%3A%5B%7B%22name%22%3A%22Post%20Types%22%2C%22type%22%3A%22post_type%22%2C%22count%22%3A6%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22post_type_0%22%7D%2C%7B%22name%22%3A%22Categories%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22category%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22taxonomy_1%22%7D%2C%7B%22name%22%3A%22Tags%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22post_tag%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22taxonomy_2%22%7D%2C%7B%22name%22%3A%22Year%22%2C%22type%22%3A%22date_histogram%22%2C%22count%22%3A5%2C%22field%22%3A%22post_date%22%2C%22interval%22%3A%22year%22%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22date_histogram_3%22%7D%5D%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%7D%5D%2C%22widgetsOutsideOverlay%22%3A%5B%5D%2C%22hasNonSearchWidgets%22%3Afalse%2C%22preventTrackingCookiesReset%22%3Afalse%7D"));
1258
+ var JetpackInstantSearchOptions=JSON.parse(decodeURIComponent("%7B%22overlayOptions%22%3A%7B%22colorTheme%22%3A%22light%22%2C%22enableInfScroll%22%3Atrue%2C%22enableFilteringOpensOverlay%22%3Atrue%2C%22enablePostDate%22%3Atrue%2C%22enableSort%22%3Atrue%2C%22highlightColor%22%3A%22%23fdd7b9%22%2C%22overlayTrigger%22%3A%22submit%22%2C%22resultFormat%22%3A%22expanded%22%2C%22showPoweredBy%22%3Atrue%2C%22defaultSort%22%3A%22relevance%22%2C%22excludedPostTypes%22%3A%5B%22attachment%22%5D%7D%2C%22homeUrl%22%3A%22https%3A%5C%2F%5C%2Fopensource.org%22%2C%22locale%22%3A%22en-US%22%2C%22postsPerPage%22%3A12%2C%22siteId%22%3A210318891%2C%22postTypes%22%3A%7B%22post%22%3A%7B%22singular_name%22%3A%22Post%22%2C%22name%22%3A%22Posts%22%7D%2C%22page%22%3A%7B%22singular_name%22%3A%22Page%22%2C%22name%22%3A%22Pages%22%7D%2C%22attachment%22%3A%7B%22singular_name%22%3A%22Media%22%2C%22name%22%3A%22Media%22%7D%2C%22supporter%22%3A%7B%22singular_name%22%3A%22Supporter%22%2C%22name%22%3A%22Supporters%22%7D%2C%22board-member%22%3A%7B%22singular_name%22%3A%22Board%20Member%22%2C%22name%22%3A%22Board%20Members%22%7D%2C%22license%22%3A%7B%22singular_name%22%3A%22License%22%2C%22name%22%3A%22Licenses%22%7D%2C%22meeting-minutes%22%3A%7B%22singular_name%22%3A%22Meeting%20Minutes%22%2C%22name%22%3A%22Meeting%20Minutes%22%7D%2C%22press-mentions%22%3A%7B%22singular_name%22%3A%22Press%20mentions%22%2C%22name%22%3A%22Press%20mentions%22%7D%7D%2C%22webpackPublicPath%22%3A%22https%3A%5C%2F%5C%2Fopensource.org%5C%2Fwp-content%5C%2Fplugins%5C%2Fjetpack%5C%2Fjetpack_vendor%5C%2Fautomattic%5C%2Fjetpack-search%5C%2Fbuild%5C%2Finstant-search%5C%2F%22%2C%22isPhotonEnabled%22%3Atrue%2C%22isFreePlan%22%3Afalse%2C%22apiRoot%22%3A%22https%3A%5C%2F%5C%2Fopensource.org%5C%2Fwp-json%5C%2F%22%2C%22apiNonce%22%3A%222142c68a49%22%2C%22isPrivateSite%22%3Afalse%2C%22isWpcom%22%3Afalse%2C%22hasOverlayWidgets%22%3Atrue%2C%22widgets%22%3A%5B%7B%22filters%22%3A%5B%7B%22name%22%3A%22Post%20Types%22%2C%22type%22%3A%22post_type%22%2C%22count%22%3A6%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22post_type_0%22%7D%2C%7B%22name%22%3A%22Categories%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22category%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22taxonomy_1%22%7D%2C%7B%22name%22%3A%22Tags%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22post_tag%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22taxonomy_2%22%7D%2C%7B%22name%22%3A%22Year%22%2C%22type%22%3A%22date_histogram%22%2C%22count%22%3A5%2C%22field%22%3A%22post_date%22%2C%22interval%22%3A%22year%22%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%2C%22filter_id%22%3A%22date_histogram_3%22%7D%5D%2C%22widget_id%22%3A%22jetpack-search-filters-4%22%7D%5D%2C%22widgetsOutsideOverlay%22%3A%5B%5D%2C%22hasNonSearchWidgets%22%3Afalse%2C%22preventTrackingCookiesReset%22%3Afalse%7D"));
1255
1259
  /* ]]> */
1256
1260
  </script>
1257
1261
  <script type="text/javascript" src="https://149753425.v2.pressablecdn.com/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-search/build/instant-search/jp-search.js?minify=false&amp;ver=da5ecd9f722e7fcb409e" id="jetpack-instant-search-js"></script>
1258
- <script data-service="jetpack-statistics" data-category="statistics" type="text/plain" data-cmplz-src="//stats.wp.com/w.js?ver=202504" id="jp-tracks-js"></script>
1262
+ <script data-service="jetpack-statistics" data-category="statistics" type="text/plain" data-cmplz-src="//stats.wp.com/w.js?ver=202505" id="jp-tracks-js"></script>
1259
1263
  <script type="text/javascript" id="osi-theme-scripts-js-before">
1260
1264
  /* <![CDATA[ */
1261
1265
  const OSI_LICENSE_DB = {"ajaxURL":"https:\/\/opensource.org\/wp-admin\/admin-ajax.php","action":"osi_license_db"}
1262
1266
  /* ]]> */
1263
1267
  </script>
1264
1268
  <script type="text/javascript" src="https://149753425.v2.pressablecdn.com/wp-content/themes/osi/assets/js/build/theme.js?ver=1724798073" id="osi-theme-scripts-js"></script>
1265
- <script data-service="jetpack-statistics" data-category="statistics" type="text/plain" data-cmplz-src="https://stats.wp.com/e-202504.js" id="jetpack-stats-js" data-wp-strategy="defer"></script>
1269
+ <script data-service="jetpack-statistics" data-category="statistics" type="text/plain" data-cmplz-src="https://stats.wp.com/e-202505.js" id="jetpack-stats-js" data-wp-strategy="defer"></script>
1266
1270
  <script type="text/javascript" id="jetpack-stats-js-after">
1267
1271
  /* <![CDATA[ */
1268
1272
  _stq = window._stq || [];
1269
- _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"210318891\",\"post\":\"395\",\"tz\":\"0\",\"srv\":\"opensource.org\",\"hp\":\"atomic\",\"ac\":\"3\",\"amp\":\"0\",\"j\":\"1:14.3-a.1\"}") ]);
1273
+ _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"210318891\",\"post\":\"395\",\"tz\":\"0\",\"srv\":\"opensource.org\",\"hp\":\"atomic\",\"ac\":\"3\",\"amp\":\"0\",\"j\":\"1:14.3-a.3\"}") ]);
1270
1274
  _stq.push([ "clickTrackerInit", "210318891", "395" ]);
1271
1275
  /* ]]> */
1272
1276
  </script>
1273
1277
  <script type="text/javascript" id="cmplz-cookiebanner-js-extra">
1274
1278
  /* <![CDATA[ */
1275
- var complianz = {"prefix":"cmplz_","user_banner_id":"1","set_cookies":[],"block_ajax_content":"","banner_version":"67","version":"7.2.0","store_consent":"","do_not_track_enabled":"1","consenttype":"optin","region":"eu","geoip":"","dismiss_timeout":"","disable_cookiebanner":"1","soft_cookiewall":"","dismiss_on_scroll":"","cookie_expiry":"365","url":"https:\/\/opensource.org\/wp-json\/complianz\/v1\/","locale":"lang=en&locale=en_US","set_cookies_on_root":"","cookie_domain":"","current_policy_id":"16","cookie_path":"\/","categories":{"statistics":"statistics","marketing":"marketing"},"tcf_active":"","placeholdertext":"Click to accept {category} cookies and enable this content","css_file":"https:\/\/opensource.org\/wp-content\/uploads\/complianz\/css\/banner-{banner_id}-{type}.css?v=67","page_links":{"eu":{"cookie-statement":{"title":"","url":"https:\/\/opensource.org\/license\/mpl-2-0"}}},"tm_categories":"","forceEnableStats":"","preview":"","clean_cookies":"","aria_label":"Click to accept {category} cookies and enable this content"};
1279
+ var complianz = {"prefix":"cmplz_","user_banner_id":"1","set_cookies":[],"block_ajax_content":"","banner_version":"67","version":"7.2.0","store_consent":"","do_not_track_enabled":"1","consenttype":"optin","region":"eu","geoip":"","dismiss_timeout":"","disable_cookiebanner":"1","soft_cookiewall":"","dismiss_on_scroll":"","cookie_expiry":"365","url":"https:\/\/opensource.org\/wp-json\/complianz\/v1\/","locale":"lang=en&locale=en_US","set_cookies_on_root":"","cookie_domain":"","current_policy_id":"16","cookie_path":"\/","categories":{"statistics":"statistics","marketing":"marketing"},"tcf_active":"","placeholdertext":"Click to accept {category} cookies and enable this content","css_file":"https:\/\/opensource.org\/wp-content\/uploads\/complianz\/css\/banner-{banner_id}-{type}.css?v=67","page_links":{"eu":{"cookie-statement":{"title":"","url":"https:\/\/opensource.org\/license\/cvw"}}},"tm_categories":"","forceEnableStats":"","preview":"","clean_cookies":"","aria_label":"Click to accept {category} cookies and enable this content"};
1276
1280
  /* ]]> */
1277
1281
  </script>
1278
1282
  <script defer type="text/javascript" src="https://149753425.v2.pressablecdn.com/wp-content/plugins/complianz-gdpr/cookiebanner/js/complianz.min.js?ver=1736534359" id="cmplz-cookiebanner-js"></script>
1279
1283
 
1280
- <script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'904bff21bdea07c8',t:'MTczNzM0MzkzOC4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
1284
+ <script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9085b008ed428224',t:'MTczNzk0ODg3My4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
1281
1285
  </html>
1282
1286
  <!--
1283
- generated 7 seconds ago
1284
- generated in 0.522 seconds
1287
+ generated 6 seconds ago
1288
+ generated in 0.574 seconds
1285
1289
  served from batcache in 0.003 seconds
1286
- expires in 293 seconds
1290
+ expires in 294 seconds
1287
1291
  -->