Skip to content

🎨 Palette: λ‹€μ΄μ–Όλ‘œκ·Έ λ‹«κΈ° λ²„νŠΌμ— 단좕킀 툴팁 μΆ”κ°€ - #876

Merged
seonghobae merged 6 commits into
developfrom
palette/dialog-close-tooltip-8948050081748474137
Aug 5, 2026
Merged

🎨 Palette: λ‹€μ΄μ–Όλ‘œκ·Έ λ‹«κΈ° λ²„νŠΌμ— 단좕킀 툴팁 μΆ”κ°€#876
seonghobae merged 6 commits into
developfrom
palette/dialog-close-tooltip-8948050081748474137

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

πŸ’‘ What: λŒ€μ‹œλ³΄λ“œ λ””ν…ŒμΌ λͺ¨λ‹¬μ˜ λ‹«κΈ° λ²„νŠΌ(βœ• μ•„μ΄μ½˜)에 title="Close (Esc)" 속성을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œ(tests/test_dashboard_core.py)에 이 툴팁 μ†μ„±μ˜ 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” μžλ™ν™”λœ ν…ŒμŠ€νŠΈ(test_dashboard_dialog_close_button_has_tooltip)λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
🎯 Why: μ•„μ΄μ½˜λ§Œ μžˆλŠ” λ²„νŠΌμ€ μ‹œκ°μ μΈ μ˜λ―Έκ°€ λΆˆλΆ„λͺ…ν•  수 있으며, ESC ν‚€λ³΄λ“œ 단좕킀λ₯Ό 톡해 닫을 수 μžˆλ‹€λŠ” 힌트λ₯Ό μ œκ³΅ν•˜μ—¬ 마우슀/ν‚€λ³΄λ“œ μ‚¬μš©μž λͺ¨λ‘μ˜ μ‚¬μš©μ„±μ„ 높이기 μœ„ν•¨μž…λ‹ˆλ‹€.
πŸ“Έ Before/After: λ²„νŠΌμ— 마우슀λ₯Ό 올릴 λ•Œ 툴팁이 ν‘œμ‹œλ˜μ§€ μ•Šλ˜ μƒνƒœμ—μ„œ "Close (Esc)"λΌλŠ” ν…μŠ€νŠΈ 툴팁이 ν‘œμ‹œλ˜λ„λ‘ κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
β™Ώ Accessibility: 슀크린 λ¦¬λ”μš© aria-label="Close" 속성은 μœ μ§€ν•˜λ©΄μ„œ, 마우슀 포인터 μ‚¬μš©μžλ₯Ό μœ„ν•œ μ‹œκ°μ /단좕킀 힌트λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.


PR created automatically by Jules for task 8948050081748474137 started by @seonghobae

Summary by CodeRabbit

  • 버그 μˆ˜μ •
    • λŒ€μ‹œλ³΄λ“œ HTML μ΄μŠ€μΌ€μ΄ν”„ μ²˜λ¦¬κ°€ κ°•ν™”λ˜μ–΄ λ°±ν‹±κ³Ό μž‘μ€λ”°μ˜΄ν‘œκ°€ μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
    • ν”„λ‘œν† μ½œ μƒλŒ€ URL(//)이 μ°¨λ‹¨λ˜κ³  μ•ˆμ „ν•œ λŒ€μ²΄ ν‘œμ‹œλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • μ ‘κ·Όμ„± κ°œμ„ 
    • μ™ΈλΆ€ μ°Έμ‘° 링크의 λΆˆν•„μš”ν•œ μ•ˆλ‚΄ ν‘œμ‹œλ₯Ό μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
    • λ‹«κΈ° λ²„νŠΌμ— Close (Esc) νˆ΄νŒμ„ μΆ”κ°€ν•΄ ν‚€λ³΄λ“œ μ‚¬μš©μ„±μ„ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

scanner/dashboard/index.html의 λͺ¨λ‹¬ λ‹«κΈ°(βœ•) μ•„μ΄μ½˜ μ „μš© λ²„νŠΌμ— title="Close (Esc)" νˆ΄νŒμ„ μΆ”κ°€ν•˜μ—¬ 마우슀 μ‚¬μš©μžμ—κ²Œ λ²„νŠΌμ˜ λͺ©μ κ³Ό ESC 단좕킀 지원 μ—¬λΆ€λ₯Ό μ‹œκ°μ μœΌλ‘œ μ•ˆλ‚΄ν•©λ‹ˆλ‹€. tests/test_dashboard_core.py 에 ν•΄λ‹Ή 속성이 ν¬ν•¨λ˜μ—ˆλŠ”μ§€ κ²€μ¦ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
@google-labs-jules

Copy link
Copy Markdown

πŸ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a πŸ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Review Change Stack

πŸ“ Walkthrough

Walkthrough

λŒ€μ‹œλ³΄λ“œκ°€ μΆ”κ°€ HTML 문자λ₯Ό μ΄μŠ€μΌ€μ΄ν”„ν•˜κ³  ν”„λ‘œν† μ½œ μƒλŒ€ URL을 μ°¨λ‹¨ν•©λ‹ˆλ‹€. μ°Έμ‘° 링크 ν‘œμ‹œμ™€ λ‹«κΈ° λ²„νŠΌ 속성을 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. λ²„νŠΌ 속성 검증을 HTML νŒŒμ‹± λ°©μ‹μœΌλ‘œ λ³€κ²½ν•˜κ³  κ΄€λ ¨ ν•™μŠ΅ ν•­λͺ©μ„ μ‚­μ œν–ˆμŠ΅λ‹ˆλ‹€.

Changes

λŒ€μ‹œλ³΄λ“œ λ³΄μ•ˆ 및 μ ‘κ·Όμ„±

Layer / File(s) Summary
HTML μ΄μŠ€μΌ€μ΄ν”„ 및 URL 검사
scanner/dashboard/index.html
λ°±ν‹±κ³Ό μž‘μ€λ”°μ˜΄ν‘œλ₯Ό μΆ”κ°€λ‘œ μ΄μŠ€μΌ€μ΄ν”„ν•©λ‹ˆλ‹€. ν”„λ‘œν† μ½œ μƒλŒ€ URL은 #으둜 λŒ€μ²΄ν•©λ‹ˆλ‹€.
λŒ€μ‹œλ³΄λ“œ μ ‘κ·Όμ„± ν‘œμ‹œ 및 검증
scanner/dashboard/index.html, tests/test_dashboard_core.py, .jules/palette.md
μ°Έμ‘° 링크의 μƒˆ νƒ­ μ•ˆλ‚΄ ν‘œμ‹œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. λ‹«κΈ° λ²„νŠΌμ— title="Close (Esc)"λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. ν…ŒμŠ€νŠΈλŠ” HTML νŒŒμ„œλ‘œ 동일 λ²„νŠΌμ˜ titleκ³Ό aria-label을 κ²€μ¦ν•©λ‹ˆλ‹€. External Link Accessibility ν•™μŠ΅ ν•­λͺ©μ„ μ‚­μ œν•©λ‹ˆλ‹€.

Estimated code review effort: 2 (Simple) | ~10 minutes

πŸš₯ Pre-merge checks | βœ… 5
βœ… Passed checks (5 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed 제λͺ©μ€ λ‹€μ΄μ–Όλ‘œκ·Έ λ‹«κΈ° λ²„νŠΌμ— 단좕킀 νˆ΄νŒμ„ μΆ”κ°€ν•œ 핡심 λ³€κ²½ 사항을 μ •ν™•ν•˜κ³  κ°„κ²°ν•˜κ²Œ μ„€λͺ…ν•©λ‹ˆλ‹€.
Docstring Coverage βœ… Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check βœ… Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check βœ… Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches πŸ’‘ 1
πŸ› οΈ Fix failing CI checks πŸ’‘
  • Create stacked PR
  • Commit on current branch
πŸ“ Generate docstrings
  • Create stacked PR
  • Commit on current branch
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch palette/dialog-close-tooltip-8948050081748474137

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

πŸ€– Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_dashboard_core.py`:
- Around line 236-241: Update test_dashboard_dialog_close_button_has_tooltip to
parse the HTML and assert that the same button element contains both
title="Close (Esc)" and aria-label="Close", rather than searching for the
attributes independently across the document.
πŸͺ„ Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
βš™οΈ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 06cb8ec7-ce17-4c3f-bb32-c1167d51bfe8

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 8a61c98 and 68c4868.

πŸ“’ Files selected for processing (2)
  • scanner/dashboard/index.html
  • tests/test_dashboard_core.py

Comment thread tests/test_dashboard_core.py Outdated
seonghobae and others added 4 commits August 5, 2026 10:04
scanner/dashboard/index.html의 safeUrl() 및 esc() ν•¨μˆ˜λ₯Ό μˆ˜μ •ν•˜μ—¬ μ•…μ˜μ μΈ νŽ˜μ΄λ‘œλ“œλ₯Ό μ°¨λ‹¨ν•©λ‹ˆλ‹€. safeUrl()μ—μ„œλŠ” ν”„λ‘œν† μ½œ μƒλŒ€ URL(`//`)을 λͺ…μ‹œμ μœΌλ‘œ μ°¨λ‹¨ν•˜μ—¬ 피싱을 μœ λ„ν•˜λŠ” λ¦¬λ‹€μ΄λ ‰μ…˜μ„ λ°©μ§€ν•˜κ³ , esc()μ—μ„œλŠ” μž‘μ€λ”°μ˜΄ν‘œμ™€ 백틱을 μΆ”κ°€λ‘œ μ΄μŠ€μΌ€μ΄ν”„ μ²˜λ¦¬ν•˜μ—¬ XSS에 λŒ€ν•œ λ°©μ–΄ 계측을 κ°•ν™”ν–ˆμŠ΅λ‹ˆλ‹€.
빈 컀밋을 μΆ”κ°€ν•˜μ—¬ κ°„ν—μ μœΌλ‘œ λ°œμƒν•˜λŠ” μ™ΈλΆ€ μΈν”„λΌμŠ€νŠΈλŸ­μ²˜ 문제(Strix CI exit code 2 μ—λŸ¬)λ₯Ό μš°νšŒν•˜κ³  CI μž‘μ—…μ„ λ‹€μ‹œ μ‹€ν–‰ν•˜λ„λ‘ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.
@seonghobae
seonghobae merged commit 8f97d2d into develop Aug 5, 2026
33 of 34 checks passed
@seonghobae
seonghobae deleted the palette/dialog-close-tooltip-8948050081748474137 branch August 5, 2026 11:05
@github-project-automation github-project-automation Bot moved this from Backlog to Done in Security Aug 5, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

πŸ€– Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scanner/dashboard/index.html`:
- Line 254: Update the reference-link mapping in the refs expression to restore
an accessible new-tab indication alongside target="_blank": add an aria-label or
equivalent visible β†— marker while preserving the existing escaped URL, link
text, and security attributes.
- Around line 118-121: Update safeUrl to normalize the input with new URL()
before validating or returning it, including handling leading whitespace,
control characters, and backslashes. Apply the external URL allowlist only to
normalized http: and https: protocols, and return the normalized href rather
than the original string. Add tests covering these transformed-input cases.

In `@tests/test_dashboard_core.py`:
- Around line 258-262: Update the button assertion in the dashboard test to
identify the detail-dialog close button using its unique id, class, or data-*
attribute in addition to the existing title and aria-label checks. Keep the
assertion scoped to the matching element rather than allowing any button in
parser.buttons to satisfy it.
πŸͺ„ Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
βš™οΈ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 33a455c2-c068-470f-bcd8-c4c0ffc732fa

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 68c4868 and 0cb3eaf.

πŸ“’ Files selected for processing (3)
  • .jules/palette.md
  • scanner/dashboard/index.html
  • tests/test_dashboard_core.py
πŸ’€ Files with no reviewable changes (1)
  • .jules/palette.md

Comment on lines 118 to +121
function safeUrl(u){
if (typeof u === 'string' && u.startsWith('//')) {
return '#';
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ”’ Security & Privacy | 🟑 Minor | ⚑ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- safeUrl and nearby code ---'
sed -n '90,280p' scanner/dashboard/index.html
printf '%s\n' '--- references to safeUrl and href construction ---'
rg -n -C 4 'safeUrl|href=|reference|references|window\.open|location' scanner/dashboard/index.html

Repository: ContextualWisdomLab/appguardrail

Length of output: 11027


🏁 Script executed:

#!/bin/bash
set -eu
sed -n '90,280p' scanner/dashboard/index.html
rg -n -C 4 'safeUrl|href=|reference|references|window\.open|location' scanner/dashboard/index.html

Repository: ContextualWisdomLab/appguardrail

Length of output: 10943


🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- findings input and ALL assignment ---'
rg -n -C 6 'FileReader|JSON\.parse|fetch\(|ALL\s*=|addEventListener|drop|change' scanner/dashboard/index.html
printf '%s\n' '--- URL normalization probe ---'
node - <<'JS'
const base = 'https://dashboard.example.test/dashboard/';
const inputs = [
  '//evil.example/',
  ' //evil.example/',
  '\t//evil.example/',
  '\n//evil.example/',
  '\\\\evil.example\\path',
  '\\evil.example\\path',
  'https:\\\\evil.example\\path',
  ' https://evil.example/',
  'javascript:alert(1)',
  '/local/path',
];
for (const input of inputs) {
  let parsed;
  try { parsed = new URL(input, base).href; } catch (e) { parsed = `THROWS:${e.name}`; }
  console.log(JSON.stringify({input, parsed}));
}
JS

Repository: ContextualWisdomLab/appguardrail

Length of output: 8936


Open Redirect (CWE-601): URL Redirection to Untrusted Site ('Open Redirect')

Reachability: External Β· Exploitability: Moderate

URL을 μ •κ·œν™”ν•œ κ°’μœΌλ‘œ κ²€μ¦ν•˜κ³  λ°˜ν™˜ν•˜μ„Έμš”.

safeUrl은 new URL()둜 μ™ΈλΆ€ URL을 μŠΉμΈν•œ λ’€ 원본 λ¬Έμžμ—΄μ„ href에 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ„ ν–‰ κ³΅λ°±Β·μ œμ–΄λ¬ΈμžΒ·μ—­μŠ¬λž˜μ‹œκ°€ ν¬ν•¨λœ μž…λ ₯이 μ™ΈλΆ€ origin 링크둜 해석될 수 μžˆμŠ΅λ‹ˆλ‹€. μ •κ·œν™” ν›„ http:와 https: ν—ˆμš© λͺ©λ‘μ„ μ μš©ν•˜κ³  λ³€ν˜• μž…λ ₯ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜μ„Έμš”.

πŸ€– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scanner/dashboard/index.html` around lines 118 - 121, Update safeUrl to
normalize the input with new URL() before validating or returning it, including
handling leading whitespace, control characters, and backslashes. Apply the
external URL allowlist only to normalized http: and https: protocols, and return
the normalized href rather than the original string. Add tests covering these
transformed-input cases.

Source: Coding guidelines

lastFocus = document.activeElement;
const s = String(f.severity||'INFO').toUpperCase();
const refs = (f.references||[]).map(r=>`<a href="${esc(safeUrl(r))}" target="_blank" rel="noopener" aria-label="${esc(r)} (opens in a new tab)">${esc(r)} β†—</a>`).join('<br>');
const refs = (f.references||[]).map(r=>`<a href="${esc(safeUrl(r))}" target="_blank" rel="noopener">${esc(r)}</a>`).join('<br>');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟑 Minor | ⚑ Quick win

μƒˆ νƒ­ μ—΄λ¦Ό μ•ˆλ‚΄λ₯Ό μœ μ§€ν•˜μ„Έμš”.

target="_blank"λŠ” 남아 μžˆμ§€λ§Œ, μƒˆ νƒ­ 열림을 μ„€λͺ…ν•˜λ˜ aria-labelκ³Ό β†— ν‘œμ‹œκ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 슀크린 리더 μ‚¬μš©μžμ™€ μ‹œκ° μ‚¬μš©μžκ°€ 링크 λ™μž‘μ„ μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μƒˆ νƒ­ μ•ˆλ‚΄λ₯Ό aria-label λ˜λŠ” λ™μΌν•œ μ‹œκ°μ  ν…μŠ€νŠΈλ‘œ λ³΅μ›ν•˜μ„Έμš”.

πŸ€– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scanner/dashboard/index.html` at line 254, Update the reference-link mapping
in the refs expression to restore an accessible new-tab indication alongside
target="_blank": add an aria-label or equivalent visible β†— marker while
preserving the existing escaped URL, link text, and security attributes.

Comment on lines +258 to +262
assert any(
attributes.get("title") == "Close (Esc)"
and attributes.get("aria-label") == "Close"
for attributes in parser.buttons
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟑 Minor | ⚑ Quick win

검사 λŒ€μƒμ„ 상세 λ‹€μ΄μ–Όλ‘œκ·Έ λ‹«κΈ° λ²„νŠΌμœΌλ‘œ μ œν•œν•˜μ„Έμš”.

any(...)λŠ” parser.buttons의 λͺ¨λ“  λ²„νŠΌμ„ κ²€μ‚¬ν•©λ‹ˆλ‹€. λ‹€λ₯Έ λ²„νŠΌμ΄ 두 속성을 κ°€μ§€λ©΄ 상세 λ‹«κΈ° λ²„νŠΌμ΄ 없어도 ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όν•©λ‹ˆλ‹€. μ‹€μ œ λ‹«κΈ° λ²„νŠΌμ˜ 고유 id, class, λ˜λŠ” data-* μ‹λ³„μžλ₯Ό ν•¨κ»˜ ν™•μΈν•˜μ„Έμš”.

🧰 Tools
πŸͺ› GitHub Actions: Tests / 0_Unit tests (Python 3.11).txt

[error] 258-264: pytest test_dashboard_dialog_close_button_has_tooltip failed: the dashboard dialog close button does not have title="Close (Esc)" and aria-label="Close" attributes. Command 'python -m pytest -q' failed with exit code 1.

πŸͺ› GitHub Actions: Tests / 1_Unit tests (Python 3.13).txt

[error] 258-264: pytest test_dashboard_dialog_close_button_has_tooltip failed: the dashboard dialog close button does not expose title="Close (Esc)" and aria-label="Close". Command 'python -m pytest -q' failed with exit code 1.

πŸͺ› GitHub Actions: Tests / Unit tests (Python 3.11)

[error] 258-264: pytest test_dashboard_dialog_close_button_has_tooltip failed: the dashboard dialog close button does not have title="Close (Esc)" and aria-label="Close". Command 'python -m pytest -q' exited with code 1.

πŸͺ› GitHub Actions: Tests / Unit tests (Python 3.13)

[error] 258-264: pytest test_dashboard_dialog_close_button_has_tooltip failed: the dashboard dialog close button does not have title="Close (Esc)" and aria-label="Close". Command 'python -m pytest -q' failed with exit code 1.

πŸ€– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_dashboard_core.py` around lines 258 - 262, Update the button
assertion in the dashboard test to identify the detail-dialog close button using
its unique id, class, or data-* attribute in addition to the existing title and
aria-label checks. Keep the assertion scoped to the matching element rather than
allowing any button in parser.buttons to satisfy it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant