InfoGrab Docs

GitLab Duo Agent Platform 문제 해결

요약

GitLab Duo Agent Platform으로 작업하는 경우 다음과 같은 문제가 발생할 수 있습니다. 플로우가 생성된 후 AI > 세션으로 이동하여 플로우의 세션을 볼 수 있습니다. Details 탭에는 CI/CD job 로그에 대한 링크가 표시됩니다.

GitLab Duo Agent Platform으로 작업하는 경우 다음과 같은 문제가 발생할 수 있습니다.

로그 보기#

플로우가 생성된 후 AI > 세션으로 이동하여 플로우의 세션을 볼 수 있습니다.

Details 탭에는 CI/CD job 로그에 대한 링크가 표시됩니다. 이러한 로그에는 문제 해결 정보가 포함될 수 있습니다.

UI에 플로우가 표시되지 않음#

플로우를 실행하려고 하지만 GitLab UI에 표시되지 않는 경우:

  1. 프로젝트에서 최소 Developer 권한이 있는지 확인합니다.

  2. GitLab Duo가 켜져 있고 플로우 실행이 허용되어 있는지 확인합니다.

  3. 속한 그룹에 플로우를 사용할 수 있는 권한이 부여되었는지 확인합니다.

  4. 최상위 그룹이 올바르게 구성되었지만 개별 프로젝트에서 플로우가 보이지 않는 경우:

    1. 프로젝트로 이동합니다.
    2. AI > 플로우를 선택합니다.
    3. 오른쪽 상단 모서리에서 Enable flow from group을 선택합니다.
    4. 플로우를 선택한 다음 Enable을 선택합니다.
  5. 여전히 작동하지 않는 경우:

    1. 최상위 그룹에서 영향받은 플로우를 비활성화하고 구성을 저장합니다.
    2. 최상위 그룹에서 영향받은 플로우를 활성화하고 구성을 저장합니다.
    3. 설정이 그룹 전체에 전파되기까지 몇 분간 기다립니다.

가져온 프로젝트에 대한 새 파이프라인 생성 권한 부족#

가져온 프로젝트나 템플릿에서 생성된 프로젝트에서 기본 플로우를 실행하려고 할 때 다음 오류가 발생할 수 있습니다: Error in creating workload: Insufficient permissions to create a new pipeline.

이 문제를 해결하려면:

  1. 최상위 그룹으로 이동합니다.
  2. Settings > General을 선택합니다.
  3. GitLab Duo features를 확장합니다.
  4. Flow execution 아래에서 켜고 싶은 기본 플로우를 식별합니다.
  5. 최상위 그룹에서 플로우를 비활성화하고 구성을 저장합니다.
  6. 최상위 그룹에서 같은 플로우를 활성화하고 구성을 저장합니다.
  7. 설정이 그룹의 프로젝트 전체에 전파되기까지 몇 분간 기다립니다.

오류: 요청은 유효하지만 Workflow가 완료하지 못했습니다#

플로우를 실행하려면 프로젝트 저장소에 최소 하나의 커밋이 있어야 합니다. 커밋이 없는 프로젝트에서 플로우를 실행하면 다음 오류가 발생합니다: Your request was valid but Workflow failed to complete it. Please try again.

이 오류는 커밋이 없는 저장소에서 플로우가 기본 브랜치를 찾을 수 없기 때문에 발생합니다.

이 문제를 해결하려면 플로우를 실행하기 전에 프로젝트에 초기 커밋을 푸시하세요. 예를 들어, README.md 파일을 추가합니다.

세션이 생성된 상태에서 멈춤#

플로우 세션이 시작되지 않는 경우:

  • push 규칙이 구성되어 있는지 확인합니다.

서비스 계정을 허용하도록 push 규칙 구성#

GitLab UI에서 기본 플로우는 다음을 수행하는 서비스 계정을 사용합니다:

전제 조건:

  • 관리자 접근 권한.

프로젝트에 대한 push 규칙을 구성하려면:

  1. 서비스 계정과 관련된 이메일 주소를 찾습니다:

    1. 오른쪽 상단 모서리에서 Admin을 선택합니다.
    2. Overview > Users를 선택하고 플로우와 연관된 계정을 검색합니다. 계정은 duo-[flow-name]-[top-level-group-name] 패턴을 따릅니다.
    3. 서비스 계정 사용자를 찾아 이메일 주소를 복사합니다.
  2. 이메일 주소가 프로젝트에 push할 수 있도록 허용합니다:

    1. 상단 표시줄에서 Search or go to를 선택하고 프로젝트를 찾습니다.
    2. Settings > Repository를 선택합니다.
    3. Push rules를 확장합니다.
    4. Commit author's email에서 방금 복사한 이메일 주소를 허용하는 정규 표현식을 추가합니다.
    5. Save push rules를 선택합니다.
  3. duo/feature/ 브랜치 접두사를 허용합니다:

    1. Push rules 섹션에서 Branch name을 찾습니다.
    2. ^duo/(fix|feature|refactor|docs/).*로 시작하는 브랜치를 허용하는 정규 표현식을 추가합니다. 예: ^(duo/feature)/.*$
    3. Save push rules를 선택합니다.

인스턴스에 대한 push 규칙을 만들려면:

  1. 오른쪽 상단 모서리에서 Admin을 선택합니다.
  2. 왼쪽 사이드바에서 Push rules를 선택합니다.
  3. 이전 단계에 따라 Commit author's emailBranch name을 허용합니다.
  4. Save push rules를 선택합니다.

오류: SSL certificate OpenSSL verify result: unable to get local issuer certificate (20)#

커스텀 또는 자체 서명된 CA 인증서를 사용하는 GitLab Self-Managed 인스턴스에서, 초기 git clone(get_sources 단계) 중에 GitLab Duo Agent Platform 작업이 실패할 때 이 메시지가 표시될 수 있습니다.

이는 GitLab Duo Agent Platform 작업이 에이전트 샌드박스를 강화하기 위해 GIT_CONFIG_GLOBAL=/dev/nullGIT_CONFIG_NOSYSTEM=1을 설정하기 때문입니다. 이러한 변수는 Git이 시스템 및 전역 구성 파일을 읽지 못하게 합니다. 이로 인해 get_sources 중에 CA 인증서 경로를 삽입하는 runner의 메커니즘이 중단됩니다.

플로우를 실행하지 않는 CI/CD 작업은 영향을 받지 않습니다. 이 문제는 GitLab Duo Agent Platform의 워크로드 파이프라인에만 해당됩니다.

이 문제를 해결하려면 config.toml 파일에서 runner 레벨의 GIT_SSL_CAINFO 환경 변수를 설정하고 CA 인증서를 컨테이너에 마운트하세요:

[[runners]]
  environment = ["GIT_SSL_CAINFO=/etc/gitlab-runner/certs/ca.crt"]
  [runners.docker]
    volumes = ["/path/to/your/ca-bundle.crt:/etc/gitlab-runner/certs/ca.crt:ro"]

/path/to/your/ca-bundle.crt를 runner 호스트의 CA 인증서 번들 경로로 교체하세요. 파일은 루트 CA 및 중간 인증서를 포함하는 PEM 형식의 CA 번들이어야 합니다.

CI/CD 변수로 설정하고 싶을 수 있지만, 커스텀 CI/CD 변수는 GitLab Duo Agent Platform 작업에서 사용할 수 없습니다. 대신 runner의 config.toml environment 지시어를 사용해야 합니다.

커스텀 CA를 통해 GitLab Duo CLI를 GitLab 인스턴스에 연결하려면 NODE_EXTRA_CA_CERTS를 동일한 environment 줄에 추가하세요:

[[runners]]
  environment = [
    "GIT_SSL_CAINFO=/etc/gitlab-runner/certs/ca.crt",
    "NODE_EXTRA_CA_CERTS=/etc/gitlab-runner/certs/ca.crt"
  ]
  [runners.docker]
    volumes = ["/path/to/your/ca-bundle.crt:/etc/gitlab-runner/certs/ca.crt:ro"]

GitLab Duo CLI가 Anthropic Sandbox Runtime(SRT)에서 실행되는 경우 runner environment 변수가 도달하지 않을 수 있습니다. 이 변경 후에도 TLS 오류가 지속되면 agent-config.ymlsetup_script에서 대신 NODE_EXTRA_CA_CERTS를 설정하세요. setup_script는 컨테이너 내부에서 실행되며 샌드박스에 의해 필터링되지 않습니다.

GIT_SSL_CAINFO 변수는 GitLab Duo CLI가 시작되기 전에 발생하는 Git 작업을 처리합니다. GitLab Duo CLI 인증서 구성에 대해서는 커스텀 SSL 인증서를 참조하세요.

IDE에서 문제 해결#

IDE에서 GitLab Duo Agent Platform으로 작업하는 중 문제가 발생하면, GitLab Duo가 켜져 있고 올바르게 연결되어 있는지 먼저 확인합니다.

추가 지원은 확장 및 IDE의 문제 해결 페이지를 참조하세요:

구성 진단 스크립트 실행#

관련 기능 문서에서 GitLab Duo Agent Platform 문제의 원인을 파악할 수 없는 경우 진단 스크립트를 실행하여 구성을 확인합니다.

스크립트는 GitLab Duo Agent Platform 기능에 필요한 전체 구성 체인을 확인합니다:

  • 라이선스 유효성 및 플랜.
  • 인스턴스 수준 GitLab Duo 설정.
  • gitlab--duo 태그가 있는 CI/CD runner.
  • 네임스페이스 및 프로젝트 GitLab Duo 설정.
  • 기본 플로우 및 해당 서비스 계정.
  • Code Review Flow 가용성 및 자동 리뷰 설정과 같은 기능 가용성.
Note

이 스크립트는 구성 데이터만 읽으며 설정을 수정하지 않습니다. 출력에 내부 구성 세부 정보가 포함될 수 있습니다. 지원팀에 공유하기 전에 출력을 정리하세요.

전제 조건:

  • GitLab 18.8 이상

GitLab 19.0 이상에서 진단 스크립트를 실행하려면:

  1. 내장된 gitlab:duo:verify_setup Rake 작업을 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    예시:

    sudo gitlab-rake "gitlab:duo:verify_setup[<group/project>]"
    

GitLab 18.8에서 GitLab 18.11까지에서 진단 스크립트를 실행하려면:

  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 GitLab 서버에 복사합니다.

  3. 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    sudo gitlab-rails runner "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    
  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 컨테이너에 복사합니다.

  3. 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    docker cp verify_setup.rb <container-id>:/tmp/verify_setup.rb
    docker exec -it <container-id> gitlab-rails runner \
    "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    
  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 GitLab 서버에 복사합니다.

  3. GitLab 애플리케이션 디렉토리에서 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    sudo -u git bundle exec rails runner \
    "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    
  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 toolbox pod에 복사합니다.

  3. 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    # Find the toolbox pod
    kubectl get pods --namespace <namespace> -lapp=toolbox
    
    kubectl cp verify_setup.rb <namespace>/<toolbox-pod-name>:/tmp/verify_setup.rb
    kubectl exec -it <toolbox-pod-name> -- gitlab-rails runner \
    "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    

관련 주제#

GitLab Duo Agent Platform 문제 해결

원문 보기
요약

GitLab Duo Agent Platform으로 작업하는 경우 다음과 같은 문제가 발생할 수 있습니다. 플로우가 생성된 후 AI > 세션으로 이동하여 플로우의 세션을 볼 수 있습니다. Details 탭에는 CI/CD job 로그에 대한 링크가 표시됩니다.

GitLab Duo Agent Platform으로 작업하는 경우 다음과 같은 문제가 발생할 수 있습니다.

로그 보기#

플로우가 생성된 후 AI > 세션으로 이동하여 플로우의 세션을 볼 수 있습니다.

Details 탭에는 CI/CD job 로그에 대한 링크가 표시됩니다. 이러한 로그에는 문제 해결 정보가 포함될 수 있습니다.

UI에 플로우가 표시되지 않음#

플로우를 실행하려고 하지만 GitLab UI에 표시되지 않는 경우:

  1. 프로젝트에서 최소 Developer 권한이 있는지 확인합니다.

  2. GitLab Duo가 켜져 있고 플로우 실행이 허용되어 있는지 확인합니다.

  3. 속한 그룹에 플로우를 사용할 수 있는 권한이 부여되었는지 확인합니다.

  4. 최상위 그룹이 올바르게 구성되었지만 개별 프로젝트에서 플로우가 보이지 않는 경우:

    1. 프로젝트로 이동합니다.
    2. AI > 플로우를 선택합니다.
    3. 오른쪽 상단 모서리에서 Enable flow from group을 선택합니다.
    4. 플로우를 선택한 다음 Enable을 선택합니다.
  5. 여전히 작동하지 않는 경우:

    1. 최상위 그룹에서 영향받은 플로우를 비활성화하고 구성을 저장합니다.
    2. 최상위 그룹에서 영향받은 플로우를 활성화하고 구성을 저장합니다.
    3. 설정이 그룹 전체에 전파되기까지 몇 분간 기다립니다.

가져온 프로젝트에 대한 새 파이프라인 생성 권한 부족#

가져온 프로젝트나 템플릿에서 생성된 프로젝트에서 기본 플로우를 실행하려고 할 때 다음 오류가 발생할 수 있습니다: Error in creating workload: Insufficient permissions to create a new pipeline.

이 문제를 해결하려면:

  1. 최상위 그룹으로 이동합니다.
  2. Settings > General을 선택합니다.
  3. GitLab Duo features를 확장합니다.
  4. Flow execution 아래에서 켜고 싶은 기본 플로우를 식별합니다.
  5. 최상위 그룹에서 플로우를 비활성화하고 구성을 저장합니다.
  6. 최상위 그룹에서 같은 플로우를 활성화하고 구성을 저장합니다.
  7. 설정이 그룹의 프로젝트 전체에 전파되기까지 몇 분간 기다립니다.

오류: 요청은 유효하지만 Workflow가 완료하지 못했습니다#

플로우를 실행하려면 프로젝트 저장소에 최소 하나의 커밋이 있어야 합니다. 커밋이 없는 프로젝트에서 플로우를 실행하면 다음 오류가 발생합니다: Your request was valid but Workflow failed to complete it. Please try again.

이 오류는 커밋이 없는 저장소에서 플로우가 기본 브랜치를 찾을 수 없기 때문에 발생합니다.

이 문제를 해결하려면 플로우를 실행하기 전에 프로젝트에 초기 커밋을 푸시하세요. 예를 들어, README.md 파일을 추가합니다.

세션이 생성된 상태에서 멈춤#

플로우 세션이 시작되지 않는 경우:

  • push 규칙이 구성되어 있는지 확인합니다.

서비스 계정을 허용하도록 push 규칙 구성#

GitLab UI에서 기본 플로우는 다음을 수행하는 서비스 계정을 사용합니다:

전제 조건:

  • 관리자 접근 권한.

프로젝트에 대한 push 규칙을 구성하려면:

  1. 서비스 계정과 관련된 이메일 주소를 찾습니다:

    1. 오른쪽 상단 모서리에서 Admin을 선택합니다.
    2. Overview > Users를 선택하고 플로우와 연관된 계정을 검색합니다. 계정은 duo-[flow-name]-[top-level-group-name] 패턴을 따릅니다.
    3. 서비스 계정 사용자를 찾아 이메일 주소를 복사합니다.
  2. 이메일 주소가 프로젝트에 push할 수 있도록 허용합니다:

    1. 상단 표시줄에서 Search or go to를 선택하고 프로젝트를 찾습니다.
    2. Settings > Repository를 선택합니다.
    3. Push rules를 확장합니다.
    4. Commit author's email에서 방금 복사한 이메일 주소를 허용하는 정규 표현식을 추가합니다.
    5. Save push rules를 선택합니다.
  3. duo/feature/ 브랜치 접두사를 허용합니다:

    1. Push rules 섹션에서 Branch name을 찾습니다.
    2. ^duo/(fix|feature|refactor|docs/).*로 시작하는 브랜치를 허용하는 정규 표현식을 추가합니다. 예: ^(duo/feature)/.*$
    3. Save push rules를 선택합니다.

인스턴스에 대한 push 규칙을 만들려면:

  1. 오른쪽 상단 모서리에서 Admin을 선택합니다.
  2. 왼쪽 사이드바에서 Push rules를 선택합니다.
  3. 이전 단계에 따라 Commit author's emailBranch name을 허용합니다.
  4. Save push rules를 선택합니다.

오류: SSL certificate OpenSSL verify result: unable to get local issuer certificate (20)#

커스텀 또는 자체 서명된 CA 인증서를 사용하는 GitLab Self-Managed 인스턴스에서, 초기 git clone(get_sources 단계) 중에 GitLab Duo Agent Platform 작업이 실패할 때 이 메시지가 표시될 수 있습니다.

이는 GitLab Duo Agent Platform 작업이 에이전트 샌드박스를 강화하기 위해 GIT_CONFIG_GLOBAL=/dev/nullGIT_CONFIG_NOSYSTEM=1을 설정하기 때문입니다. 이러한 변수는 Git이 시스템 및 전역 구성 파일을 읽지 못하게 합니다. 이로 인해 get_sources 중에 CA 인증서 경로를 삽입하는 runner의 메커니즘이 중단됩니다.

플로우를 실행하지 않는 CI/CD 작업은 영향을 받지 않습니다. 이 문제는 GitLab Duo Agent Platform의 워크로드 파이프라인에만 해당됩니다.

이 문제를 해결하려면 config.toml 파일에서 runner 레벨의 GIT_SSL_CAINFO 환경 변수를 설정하고 CA 인증서를 컨테이너에 마운트하세요:

[[runners]]
  environment = ["GIT_SSL_CAINFO=/etc/gitlab-runner/certs/ca.crt"]
  [runners.docker]
    volumes = ["/path/to/your/ca-bundle.crt:/etc/gitlab-runner/certs/ca.crt:ro"]

/path/to/your/ca-bundle.crt를 runner 호스트의 CA 인증서 번들 경로로 교체하세요. 파일은 루트 CA 및 중간 인증서를 포함하는 PEM 형식의 CA 번들이어야 합니다.

CI/CD 변수로 설정하고 싶을 수 있지만, 커스텀 CI/CD 변수는 GitLab Duo Agent Platform 작업에서 사용할 수 없습니다. 대신 runner의 config.toml environment 지시어를 사용해야 합니다.

커스텀 CA를 통해 GitLab Duo CLI를 GitLab 인스턴스에 연결하려면 NODE_EXTRA_CA_CERTS를 동일한 environment 줄에 추가하세요:

[[runners]]
  environment = [
    "GIT_SSL_CAINFO=/etc/gitlab-runner/certs/ca.crt",
    "NODE_EXTRA_CA_CERTS=/etc/gitlab-runner/certs/ca.crt"
  ]
  [runners.docker]
    volumes = ["/path/to/your/ca-bundle.crt:/etc/gitlab-runner/certs/ca.crt:ro"]

GitLab Duo CLI가 Anthropic Sandbox Runtime(SRT)에서 실행되는 경우 runner environment 변수가 도달하지 않을 수 있습니다. 이 변경 후에도 TLS 오류가 지속되면 agent-config.ymlsetup_script에서 대신 NODE_EXTRA_CA_CERTS를 설정하세요. setup_script는 컨테이너 내부에서 실행되며 샌드박스에 의해 필터링되지 않습니다.

GIT_SSL_CAINFO 변수는 GitLab Duo CLI가 시작되기 전에 발생하는 Git 작업을 처리합니다. GitLab Duo CLI 인증서 구성에 대해서는 커스텀 SSL 인증서를 참조하세요.

IDE에서 문제 해결#

IDE에서 GitLab Duo Agent Platform으로 작업하는 중 문제가 발생하면, GitLab Duo가 켜져 있고 올바르게 연결되어 있는지 먼저 확인합니다.

추가 지원은 확장 및 IDE의 문제 해결 페이지를 참조하세요:

구성 진단 스크립트 실행#

관련 기능 문서에서 GitLab Duo Agent Platform 문제의 원인을 파악할 수 없는 경우 진단 스크립트를 실행하여 구성을 확인합니다.

스크립트는 GitLab Duo Agent Platform 기능에 필요한 전체 구성 체인을 확인합니다:

  • 라이선스 유효성 및 플랜.
  • 인스턴스 수준 GitLab Duo 설정.
  • gitlab--duo 태그가 있는 CI/CD runner.
  • 네임스페이스 및 프로젝트 GitLab Duo 설정.
  • 기본 플로우 및 해당 서비스 계정.
  • Code Review Flow 가용성 및 자동 리뷰 설정과 같은 기능 가용성.
Note

이 스크립트는 구성 데이터만 읽으며 설정을 수정하지 않습니다. 출력에 내부 구성 세부 정보가 포함될 수 있습니다. 지원팀에 공유하기 전에 출력을 정리하세요.

전제 조건:

  • GitLab 18.8 이상

GitLab 19.0 이상에서 진단 스크립트를 실행하려면:

  1. 내장된 gitlab:duo:verify_setup Rake 작업을 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    예시:

    sudo gitlab-rake "gitlab:duo:verify_setup[<group/project>]"
    

GitLab 18.8에서 GitLab 18.11까지에서 진단 스크립트를 실행하려면:

  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 GitLab 서버에 복사합니다.

  3. 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    sudo gitlab-rails runner "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    
  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 컨테이너에 복사합니다.

  3. 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    docker cp verify_setup.rb <container-id>:/tmp/verify_setup.rb
    docker exec -it <container-id> gitlab-rails runner \
    "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    
  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 GitLab 서버에 복사합니다.

  3. GitLab 애플리케이션 디렉토리에서 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    sudo -u git bundle exec rails runner \
    "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    
  1. verify_setup.rb를 다운로드합니다.

  2. verify_setup.rb 파일을 toolbox pod에 복사합니다.

  3. 스크립트를 실행합니다. <group/project>를 프로젝트의 전체 경로로 교체합니다. 예: gitlab-org/gitlab.

    # Find the toolbox pod
    kubectl get pods --namespace <namespace> -lapp=toolbox
    
    kubectl cp verify_setup.rb <namespace>/<toolbox-pod-name>:/tmp/verify_setup.rb
    kubectl exec -it <toolbox-pod-name> -- gitlab-rails runner \
    "load '/tmp/verify_setup.rb'; Gitlab::Duo::Administration::VerifySetup.new('<group/project>').execute"
    

관련 주제#