@duckduckgo/autoconsent 16.54.0 → 16.56.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/addon-firefox/compact-rules.json +1 -1
  3. package/dist/addon-firefox/manifest.json +1 -1
  4. package/dist/addon-firefox/rule-index.json +1 -1
  5. package/dist/addon-firefox/rules.json +1 -1
  6. package/dist/addon-mv3/compact-rules.json +1 -1
  7. package/dist/addon-mv3/manifest.json +1 -1
  8. package/dist/addon-mv3/rule-index.json +1 -1
  9. package/dist/addon-mv3/rules.json +1 -1
  10. package/dist/autoconsent.standalone.js +1 -1
  11. package/package.json +1 -1
  12. package/rules/autoconsent/accept-cookie-box.json +25 -0
  13. package/rules/autoconsent/amasty-gdpr.json +63 -0
  14. package/rules/autoconsent/arena-ai.json +24 -0
  15. package/rules/autoconsent/aspnet-cookieinfo.json +30 -0
  16. package/rules/autoconsent/automattic-cmp-optout.json +4 -4
  17. package/rules/autoconsent/avacy.json +15 -0
  18. package/rules/autoconsent/breuninger.json +33 -0
  19. package/rules/autoconsent/bringatrailer.json +34 -0
  20. package/rules/autoconsent/canva.json +23 -0
  21. package/rules/autoconsent/chefcookie.json +42 -0
  22. package/rules/autoconsent/ciaopeople-it.json +6 -15
  23. package/rules/autoconsent/close-cookie-notice-snippet.json +9 -0
  24. package/rules/autoconsent/cookie-bar-frame.json +9 -0
  25. package/rules/autoconsent/cookieman.json +14 -0
  26. package/rules/autoconsent/cookiepermission-cp-overlay.json +14 -0
  27. package/rules/autoconsent/dfactory-cookie-notice.json +16 -0
  28. package/rules/autoconsent/diag.pl.json +35 -0
  29. package/rules/autoconsent/eventfrog.json +39 -0
  30. package/rules/autoconsent/first-visit-notice.json +25 -0
  31. package/rules/autoconsent/forsakringskassan.se.json +33 -0
  32. package/rules/autoconsent/gear4music.json +42 -0
  33. package/rules/autoconsent/gsb-cookie-banner.json +9 -0
  34. package/rules/autoconsent/handelsbanken.json +30 -0
  35. package/rules/autoconsent/ilovepdf.json +33 -0
  36. package/rules/autoconsent/jcookie.json +25 -0
  37. package/rules/autoconsent/kamsoft-cookiesmanager.json +47 -0
  38. package/rules/autoconsent/lab-network-consent.json +30 -0
  39. package/rules/autoconsent/latrobe-edu-au.json +22 -0
  40. package/rules/autoconsent/lawwwing.json +35 -0
  41. package/rules/autoconsent/legally-ok.json +30 -0
  42. package/rules/autoconsent/midway-usa.json +4 -4
  43. package/rules/autoconsent/modelsociety.json +26 -0
  44. package/rules/autoconsent/musti.json +32 -0
  45. package/rules/autoconsent/openai.json +3 -3
  46. package/rules/autoconsent/piwik-pro.json +40 -21
  47. package/rules/autoconsent/popupsmart-cookie-notice.json +27 -0
  48. package/rules/autoconsent/pornhub.json +1 -1
  49. package/rules/autoconsent/privacylab-elmo.json +33 -0
  50. package/rules/autoconsent/r42-consent-iframe.json +38 -0
  51. package/rules/autoconsent/racv.json +23 -0
  52. package/rules/autoconsent/radboud-cookie-overlay.json +30 -0
  53. package/rules/autoconsent/seg-social.json +33 -0
  54. package/rules/autoconsent/silktide.json +16 -0
  55. package/rules/autoconsent/sitevision-cookie-consent.json +48 -0
  56. package/rules/autoconsent/sitevision-iw-cookie.json +21 -0
  57. package/rules/autoconsent/sitevision.json +14 -0
  58. package/rules/autoconsent/sl-se.json +33 -0
  59. package/rules/autoconsent/sogei-cookiebar.json +47 -0
  60. package/rules/autoconsent/spaggiari-pvw.json +31 -0
  61. package/rules/autoconsent/sportsmans.com.json +10 -0
  62. package/rules/autoconsent/tagconcierge.json +21 -2
  63. package/rules/autoconsent/txxx-network.json +31 -0
  64. package/rules/autoconsent/u-cookie-consent.json +12 -6
  65. package/rules/autoconsent/webtoffee-cookie-consent.json +45 -0
  66. package/rules/compact-rules.json +1 -1
  67. package/rules/rule-index.json +1 -1
  68. package/rules/rules.json +1 -1
  69. package/tests/accept-cookie-box.spec.ts +9 -0
  70. package/tests/amasty-gdpr.spec.ts +11 -0
  71. package/tests/arena-ai.spec.ts +5 -0
  72. package/tests/aspnet-cookieinfo.spec.ts +3 -0
  73. package/tests/automattic-cmp-optout.spec.ts +1 -1
  74. package/tests/avacy.spec.ts +7 -0
  75. package/tests/breuninger.spec.ts +3 -0
  76. package/tests/bringatrailer.spec.ts +5 -0
  77. package/tests/canva.spec.ts +5 -0
  78. package/tests/chefcookie.spec.ts +9 -0
  79. package/tests/ciaopeople-it.spec.ts +7 -1
  80. package/tests/close-cookie-notice-snippet.spec.ts +13 -0
  81. package/tests/cookie-bar-frame.spec.ts +7 -0
  82. package/tests/cookieman.spec.ts +10 -0
  83. package/tests/cookiepermission-cp-overlay.spec.ts +3 -0
  84. package/tests/dfactory-cookie-notice.spec.ts +7 -0
  85. package/tests/diag.pl.spec.ts +3 -0
  86. package/tests/eventfrog.spec.ts +6 -0
  87. package/tests/first-visit-notice.spec.ts +7 -0
  88. package/tests/forsakringskassan.se.spec.ts +3 -0
  89. package/tests/gear4music.spec.ts +8 -0
  90. package/tests/gsb-cookie-banner.spec.ts +14 -0
  91. package/tests/handelsbanken.spec.ts +11 -0
  92. package/tests/ilovepdf.spec.ts +5 -0
  93. package/tests/jcookie.spec.ts +8 -0
  94. package/tests/kamsoft-cookiesmanager.spec.ts +8 -0
  95. package/tests/lab-network-consent.spec.ts +3 -0
  96. package/tests/latrobe-edu-au.spec.ts +3 -0
  97. package/tests/lawwwing.spec.ts +8 -0
  98. package/tests/legally-ok.spec.ts +6 -0
  99. package/tests/modelsociety.spec.ts +6 -0
  100. package/tests/musti.spec.ts +3 -0
  101. package/tests/openai.spec.ts +3 -1
  102. package/tests/piwik-pro.spec.ts +6 -0
  103. package/tests/popupsmart-cookie-notice.spec.ts +9 -0
  104. package/tests/pornhub.spec.ts +1 -1
  105. package/tests/privacylab-elmo.spec.ts +9 -0
  106. package/tests/r42-consent-iframe.spec.ts +18 -0
  107. package/tests/racv.spec.ts +3 -0
  108. package/tests/radboud-cookie-overlay.spec.ts +10 -0
  109. package/tests/seg-social.spec.ts +6 -0
  110. package/tests/silktide.spec.ts +9 -0
  111. package/tests/sitevision-cookie-consent.spec.ts +18 -0
  112. package/tests/sitevision-iw-cookie.spec.ts +10 -0
  113. package/tests/sitevision.spec.ts +9 -0
  114. package/tests/sl-se.spec.ts +3 -0
  115. package/tests/sogei-cookiebar.spec.ts +15 -0
  116. package/tests/spaggiari-pvw.spec.ts +14 -0
  117. package/tests/sportsmans.com.spec.ts +7 -0
  118. package/tests/tagconcierge.spec.ts +4 -3
  119. package/tests/txxx-network.spec.ts +10 -0
  120. package/tests/u-cookie-consent.spec.ts +3 -0
  121. package/tests/webtoffee-cookie-consent.spec.ts +20 -0
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "sitevision-cookie-consent",
3
+ "vendorUrl": "https://www.sitevision.se/",
4
+ "prehideSelectors": [".sv-cookie-consent-modal"],
5
+ "detectCmp": [
6
+ {
7
+ "exists": ".sv-cookie-consent-modal"
8
+ }
9
+ ],
10
+ "detectPopup": [
11
+ {
12
+ "visible": ".sv-cookie-consent-modal"
13
+ }
14
+ ],
15
+ "optIn": [
16
+ {
17
+ "waitForThenClick": ".sv-cookie-consent-modal form:has(input[name=analytics]) button[type=submit]"
18
+ }
19
+ ],
20
+ "optOut": [
21
+ {
22
+ "if": {
23
+ "exists": ".sv-cookie-consent-modal form:has(input[name=necessary]):not(:has(input[name=analytics])) button[type=submit]"
24
+ },
25
+ "then": [
26
+ {
27
+ "click": ".sv-cookie-consent-modal form:has(input[name=necessary]):not(:has(input[name=analytics])) button[type=submit]"
28
+ }
29
+ ],
30
+ "else": [
31
+ {
32
+ "click": ".sv-cookie-consent-modal .env-dialog__controls > button[type=button]"
33
+ },
34
+ {
35
+ "waitForVisible": ".sv-cookie-consent-modal button[type=submit][form]"
36
+ },
37
+ {
38
+ "click": ".sv-cookie-consent-modal form input[type=checkbox]:checked:not(:disabled)",
39
+ "all": true,
40
+ "optional": true
41
+ },
42
+ {
43
+ "click": ".sv-cookie-consent-modal button[type=submit][form]"
44
+ }
45
+ ]
46
+ }
47
+ ]
48
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "sitevision-iw-cookie",
3
+ "vendorUrl": "https://www.sitevision.se/",
4
+ "comment": "No self-test: any consent choice reloads the page. Opt-out stores cookie_consent=necessary.",
5
+ "prehideSelectors": [".sv-iw-cookie #cookie-banner"],
6
+ "detectCmp": [{ "exists": ".sv-iw-cookie #cookie-banner" }],
7
+ "detectPopup": [{ "visible": ".sv-iw-cookie #cookie-banner" }],
8
+ "optIn": [{ "waitForThenClick": ".sv-iw-cookie #cookie-banner button:last-of-type" }],
9
+ "optOut": [
10
+ {
11
+ "if": { "exists": ".sv-iw-cookie #cookie-banner button:nth-of-type(3)" },
12
+ "then": [{ "click": ".sv-iw-cookie #cookie-banner button:nth-of-type(2)" }],
13
+ "else": [
14
+ { "click": ".sv-iw-cookie #cookie-banner button:first-of-type" },
15
+ { "waitForVisible": ".sv-iw-cookie #cookie-modal" },
16
+ { "click": ".sv-iw-cookie #cookie-modal input[type=checkbox]:checked:not(:disabled)", "all": true, "optional": true },
17
+ { "click": ".sv-iw-cookie #cookie-modal > div > button:first-of-type" }
18
+ ]
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "sitevision",
3
+ "vendorUrl": "https://www.sitevision.se/",
4
+ "prehideSelectors": [".sv-cookie-consent-banner"],
5
+ "detectCmp": [{ "exists": ".sv-cookie-consent-banner" }],
6
+ "detectPopup": [{ "visible": ".sv-cookie-consent-banner" }],
7
+ "optIn": [{ "waitForThenClick": ".sv-cookie-consent-banner form:has(input[name=\"analytics\"]) button[type=\"submit\"]" }],
8
+ "optOut": [
9
+ {
10
+ "waitForThenClick": ".sv-cookie-consent-banner form:has(input[name=\"necessary\"]):not(:has(input[name=\"analytics\"])) button[type=\"submit\"]"
11
+ }
12
+ ],
13
+ "test": [{ "waitForVisible": ".sv-cookie-consent-banner", "check": "none", "timeout": 2000 }]
14
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "sl-se",
3
+ "vendorUrl": "https://sl.se/",
4
+ "runContext": {
5
+ "urlPattern": "^https?://(www\\.)?sl\\.se/"
6
+ },
7
+ "prehideSelectors": ["[data-test-id=cookie-consent-banner]"],
8
+ "detectCmp": [
9
+ {
10
+ "exists": "[data-test-id=cookie-consent-banner] #accept-necessary-cookies-button"
11
+ }
12
+ ],
13
+ "detectPopup": [
14
+ {
15
+ "visible": "[data-test-id=cookie-consent-banner] #accept-necessary-cookies-button"
16
+ }
17
+ ],
18
+ "optIn": [
19
+ {
20
+ "waitForThenClick": "[data-test-id=cookie-consent-banner] #accept-all-cookies-button"
21
+ }
22
+ ],
23
+ "optOut": [
24
+ {
25
+ "waitForThenClick": "[data-test-id=cookie-consent-banner] #accept-necessary-cookies-button"
26
+ }
27
+ ],
28
+ "test": [
29
+ {
30
+ "cookieContains": "cookie-accept-necessary=accepted"
31
+ }
32
+ ]
33
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "sogei-cookiebar",
3
+ "cosmetic": false,
4
+ "prehideSelectors": ["#cookiebar-tra"],
5
+ "detectCmp": [
6
+ {
7
+ "exists": "#cookiebar-tra #cb-RejectAll, #cookiebar #cb-RejectAll"
8
+ }
9
+ ],
10
+ "detectPopup": [
11
+ {
12
+ "visible": "#cookiebar-tra #cb-RejectAll, #cookiebar #cb-RejectAll"
13
+ }
14
+ ],
15
+ "optIn": [
16
+ {
17
+ "if": {
18
+ "exists": "#cb-AcceptAll"
19
+ },
20
+ "then": [
21
+ {
22
+ "waitForThenClick": "#cb-AcceptAll"
23
+ }
24
+ ],
25
+ "else": [
26
+ {
27
+ "click": "#cs input[type=checkbox]:not(:checked):not(:disabled)",
28
+ "all": true,
29
+ "optional": true
30
+ },
31
+ {
32
+ "waitForThenClick": "#cb-AcceptSelected"
33
+ }
34
+ ]
35
+ }
36
+ ],
37
+ "optOut": [
38
+ {
39
+ "waitForThenClick": "#cb-RejectAll"
40
+ }
41
+ ],
42
+ "test": [
43
+ {
44
+ "cookieContains": "cookieConsent="
45
+ }
46
+ ]
47
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "spaggiari-pvw",
3
+ "vendorUrl": "https://www.spaggiari.eu/",
4
+ "cosmetic": false,
5
+ "runContext": {
6
+ "main": true,
7
+ "frame": false
8
+ },
9
+ "prehideSelectors": [".cookiebar:has(.cookiebar-ko)"],
10
+ "detectCmp": [
11
+ {
12
+ "exists": ".cookiebar .cookiebar-buttons .cookiebar-ko"
13
+ }
14
+ ],
15
+ "detectPopup": [
16
+ {
17
+ "visible": ".cookiebar .cookiebar-buttons .cookiebar-ko"
18
+ }
19
+ ],
20
+ "optIn": [
21
+ {
22
+ "waitForThenClick": ".cookiebar .cookiebar-buttons .cookiebar-ok"
23
+ }
24
+ ],
25
+ "optOut": [
26
+ {
27
+ "waitForThenClick": ".cookiebar .cookiebar-buttons .cookiebar-ko",
28
+ "comment": "Rifiuta tutti"
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "sportsmans.com",
3
+ "comment": "The site banner only offers Accept All; rejecting goes through the hidden DataGrail layer behind it. DataGrail only reloads the page after the rejection in some regions, so the banner is hidden and there is no self-test. Opt-out stores dg-category-marketing:0 in datagrail_consent_preferences_s.",
4
+ "runContext": { "urlPattern": "^https?://(www\\.)?sportsmans\\.com/" },
5
+ "prehideSelectors": ["#js-cookie-notification"],
6
+ "detectCmp": [{ "exists": "#js-cookie-notification" }, { "exists": [".dg-consent-banner", "button.dg-button.reject_all"] }],
7
+ "detectPopup": [{ "visible": "#js-cookie-notification", "check": "any" }],
8
+ "optIn": [{ "waitForThenClick": "#js-cookie-notification #consentBtn" }],
9
+ "optOut": [{ "waitForThenClick": [".dg-consent-banner", "button.dg-button.reject_all"] }, { "hide": "#js-cookie-notification" }]
10
+ }
@@ -13,9 +13,28 @@
13
13
  "then": [{ "click": "#consent-banner-modal a[href=\"#reject\"]" }],
14
14
  "else": [
15
15
  { "waitForThenClick": "#consent-banner-modal a[href=\"#settings\"]" },
16
- { "waitForThenClick": "#consent-banner-settings a[href=\"#reject\"]" }
16
+ { "waitForVisible": "#consent-banner-settings" },
17
+ {
18
+ "if": { "exists": "#consent-banner-settings a[href=\"#reject\"]" },
19
+ "then": [{ "click": "#consent-banner-settings a[href=\"#reject\"]" }],
20
+ "else": [
21
+ {
22
+ "click": "#consent-banner-settings input[type=\"checkbox\"]:checked:not(:disabled)",
23
+ "all": true,
24
+ "optional": true
25
+ },
26
+ { "waitForThenClick": "#consent-banner-settings a[href=\"#save\"]" }
27
+ ]
28
+ }
17
29
  ]
18
30
  }
19
31
  ],
20
- "test": [{ "visible": "#consent-banner-main", "check": "none" }]
32
+ "test": [
33
+ {
34
+ "any": [
35
+ { "visible": "#consent-banner-main", "check": "none" },
36
+ { "visible": "#consent-banner-modal, #consent-banner-settings", "check": "none" }
37
+ ]
38
+ }
39
+ ]
21
40
  }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "txxx-network",
3
+ "vendorUrl": "https://txxx.com/",
4
+ "cosmetic": false,
5
+ "detectCmp": [
6
+ {
7
+ "exists": ".cookie-notify:has(a[href*=\"cookies_policy\"]) > button.btn, .cookies-policy-block:has(a[href*=\"cookies_policy\"]) > button.btn, .header__cookie:has(a[href*=\"cookies_policy\"]) > button.btn"
8
+ }
9
+ ],
10
+ "detectPopup": [
11
+ {
12
+ "visible": ".cookie-notify:has(a[href*=\"cookies_policy\"]) > button.btn, .cookies-policy-block:has(a[href*=\"cookies_policy\"]) > button.btn, .header__cookie:has(a[href*=\"cookies_policy\"]) > button.btn"
13
+ }
14
+ ],
15
+ "optIn": [
16
+ {
17
+ "waitForThenClick": ".cookie-notify:has(a[href*=\"cookies_policy\"]) > button.btn, .cookies-policy-block:has(a[href*=\"cookies_policy\"]) > button.btn, .header__cookie:has(a[href*=\"cookies_policy\"]) > button.btn"
18
+ }
19
+ ],
20
+ "optOut": [
21
+ {
22
+ "waitForThenClick": ".cookie-notify:has(a[href*=\"cookies_policy\"]) > button.btn, .cookies-policy-block:has(a[href*=\"cookies_policy\"]) > button.btn, .header__cookie:has(a[href*=\"cookies_policy\"]) > button.btn"
23
+ }
24
+ ],
25
+ "test": [
26
+ {
27
+ "visible": ".cookie-notify:has(a[href*=\"cookies_policy\"]) > button.btn, .cookies-policy-block:has(a[href*=\"cookies_policy\"]) > button.btn, .header__cookie:has(a[href*=\"cookies_policy\"]) > button.btn",
28
+ "check": "none"
29
+ }
30
+ ]
31
+ }
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "u-cookie-consent",
3
- "prehideSelectors": [".u-cookie-frame"],
4
- "detectCmp": [{ "exists": ".u-cookie-frame [data-attr='btn-reject-cookies']" }],
5
- "detectPopup": [{ "visible": ".u-cookie-frame [data-attr='btn-reject-cookies']" }],
6
- "optIn": [{ "waitForThenClick": ".u-cookie-frame [data-attr='btn-accept-cookies']" }],
7
- "optOut": [{ "waitForThenClick": ".u-cookie-frame [data-attr='btn-reject-cookies']" }],
8
- "test": [{ "waitForVisible": ".u-cookie-frame [data-attr='btn-reject-cookies']", "check": "none", "timeout": 2000 }]
3
+ "prehideSelectors": [".u-cookie-frame, .modal:has([data-attr='btn-reject-cookies'])"],
4
+ "detectCmp": [{ "exists": ".u-cookie-frame [data-attr='btn-reject-cookies'], .modal [data-attr='btn-reject-cookies']" }],
5
+ "detectPopup": [{ "visible": ".u-cookie-frame [data-attr='btn-reject-cookies'], .modal [data-attr='btn-reject-cookies']" }],
6
+ "optIn": [{ "waitForThenClick": ".u-cookie-frame [data-attr='btn-accept-cookies'], .modal [data-attr='btn-accept-cookies']" }],
7
+ "optOut": [{ "waitForThenClick": ".u-cookie-frame [data-attr='btn-reject-cookies'], .modal [data-attr='btn-reject-cookies']" }],
8
+ "test": [
9
+ {
10
+ "waitForVisible": ".u-cookie-frame [data-attr='btn-reject-cookies'], .modal [data-attr='btn-reject-cookies']",
11
+ "check": "none",
12
+ "timeout": 2000
13
+ }
14
+ ]
9
15
  }
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "webtoffee-cookie-consent",
3
+ "prehideSelectors": [".wcc-overlay,.wcc-consent-container"],
4
+ "detectCmp": [{ "exists": ".wcc-consent-container" }],
5
+ "detectPopup": [{ "visible": ".wcc-consent-container" }],
6
+ "optIn": [
7
+ {
8
+ "if": { "exists": ".wcc-consent-container [data-tag=accept-button]" },
9
+ "then": [{ "waitForThenClick": ".wcc-consent-container [data-tag=accept-button]" }],
10
+ "else": [{ "waitForThenClick": ".wcc-consent-container [data-tag=close-button]" }]
11
+ }
12
+ ],
13
+ "optOut": [
14
+ {
15
+ "if": { "exists": ".wcc-consent-container [data-tag=reject-button]" },
16
+ "then": [{ "waitForThenClick": ".wcc-consent-container [data-tag=reject-button]" }],
17
+ "else": [
18
+ {
19
+ "if": { "exists": ".wcc-consent-container [data-tag=donotsell-button]" },
20
+ "then": [
21
+ { "waitForThenClick": ".wcc-consent-container [data-tag=donotsell-button]" },
22
+ { "waitForVisible": ".wcc-modal-open [data-tag=optout-option-toggle]" },
23
+ { "click": ".wcc-modal-open [data-tag=optout-option-toggle]:not(:checked)", "optional": true },
24
+ { "waitForThenClick": ".wcc-modal-open [data-tag=optout-confirm-button]" }
25
+ ],
26
+ "else": [
27
+ { "waitForThenClick": ".wcc-consent-container [data-tag=settings-button]" },
28
+ {
29
+ "waitForVisible": ".wcc-modal-open [data-tag=detail-save-button],.wcc-consent-bar-expand [data-tag=detail-save-button]"
30
+ },
31
+ {
32
+ "click": ".wcc-modal-open [data-tag=detail-category-toggle] input:checked,.wcc-consent-bar-expand [data-tag=detail-category-toggle] input:checked",
33
+ "all": true,
34
+ "optional": true
35
+ },
36
+ {
37
+ "waitForThenClick": ".wcc-modal-open [data-tag=detail-save-button],.wcc-consent-bar-expand [data-tag=detail-save-button]"
38
+ }
39
+ ]
40
+ }
41
+ ]
42
+ }
43
+ ],
44
+ "test": [{ "cookieContains": "action:yes" }]
45
+ }