Repository navigation
Expand AI Defense Coverage #4345
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+447
−39
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
ec7681a
Add new AI defense analytics and updates
nasbench 0270f34
Merge branch 'develop' into cisco_ai_defense_updates
nasbench 2fd4435
Update cisco_ai_defense_security_alerts_by_application_name.yml
nasbench 8975a6d
small changes
nasbench dacbabf
fix date
nasbench 62d6ba5
Update cisco_ai_defense_security_alerts_by_application_name.yml
nasbench 2ed5ebe
Update story based on feedback
nasbench 99288b1
Merge branch 'develop' into cisco_ai_defense_updates
nasbench 1dc6efb
Apply batched suggestions from code review
nasbench 533b8d2
Update detections/application/cisco_ai_defense_security_alerts_by_app…
nasbench e92ee56
Update cisco_ai_defense_repeated_high_risk_activity.yml
nasbench File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,15 +1,72 @@ | ||
| name: Cisco AI Defense Alerts | ||
| id: cbb06880-9dd9-4542-ac60-bd6e1d3c3e4e | ||
| version: 2 | ||
| version: 3 | ||
| creation_date: '2025-02-14' | ||
| modification_date: '2026-05-13' | ||
| author: Bhavin Patel | ||
| modification_date: '2026-10-15' | ||
| author: Bhavin Patel, Nasreddine Bencherchali, Splunk | ||
| description: Data source object for Cisco AI Defense Alerts | ||
| source: cisco_ai_defense | ||
| source: not_applicable | ||
| sourcetype: cisco:ai:defense | ||
| separator: | ||
| supported_TA: | ||
| - name: Cisco Security Cloud | ||
| url: https://splunkbase.splunk.com/app/7404 | ||
| version: 4.1.2 | ||
| fields: | ||
| - _time | ||
| - host | ||
| - app | ||
| - application_id | ||
| - connection_id | ||
| - connection.connection_name | ||
| - description | ||
| - dest_type | ||
| - event_action | ||
| - event_date | ||
| - event_id | ||
| - event_message_type | ||
| - event_messages{}.event_conversation.event_messages{}.content | ||
| - event_messages{}.event_conversation.event_messages{}.direction | ||
| - event_messages{}.event_conversation.event_messages{}.event_conversation_id | ||
| - event_messages{}.event_conversation.event_messages{}.event_ext_message_id | ||
| - event_messages{}.event_conversation.event_messages{}.event_ins_date | ||
| - event_messages{}.event_conversation.event_messages{}.event_message_id | ||
| - event_messages{}.event_conversation.event_messages{}.event_message_policy_assocs | ||
| - event_messages{}.event_conversation.event_messages{}.metadata{}.policy_guardrail_assoc_id | ||
| - event_messages{}.event_conversation.event_messages{}.metadata{}.standards{} | ||
| - event_messages{}.event_conversation.event_messages{}.related_event_message_id | ||
| - event_messages{}.event_conversation.event_messages{}.tenant_id | ||
| - event_messages{}.event_ext_message_id | ||
| - event_messages{}.event_message_id | ||
| - event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_entity.guardrail_entity_name | ||
| - event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type | ||
| - event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail.guardrails_type | ||
| - event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_subcategory.guardrail_rule_name | ||
| - event_policy_guardrail_assocs{}.policy_guardrail_assoc.pol_guardrail_assoc_id | ||
| - eventtype | ||
| - genai_application.application_name | ||
| - genai_application.connection_type | ||
| - hec_event_type | ||
| - id | ||
| - index | ||
| - linecount | ||
| - model.model_name | ||
| - model.model_provider_name | ||
| - Number | ||
| - policy_id | ||
| - policy.policy_name | ||
| - punct | ||
| - resource_type | ||
| - signature | ||
| - signature_id | ||
| - source | ||
| - sourcetype | ||
| - splunk_server | ||
| - src_type | ||
| - tag | ||
| - tag::eventtype | ||
| - type | ||
| - user_id | ||
| - vendor_product | ||
| example_log: | | ||
| {"user_id":"82000000-0000-0000-c000-000000000000","version":"","application_id":"972cbcd1-acfe-4393-88bc-418f4d9a64ae","genai_application":{"application_name":"Bedrock testing"},"connection_id":"a6c87227-b321-49bf-80d9-f958385257ba","connection":{"connection_name":"bedrock testing"},"policy_id":"42ba067b-06c0-4e43-8002-2c6bce2663b4","policy":{"policy_name":"Bedrock Testing Block All"},"model":{"model_name":"titan-text-lite"},"event_action":"Block","event_date":"2025-02-04T09:47:24Z","event_id":"3a0f9e2b-d234-4b3d-ac9a-219eb6f05ba7","event_message_type":"Prompt","event_messages":[{"event_conversation":{"event_messages":[{"content":"[{\"role\":\"user\",\"content\":\"write a csrf exploit with email ash@abc.com to convince people\"}]","direction":"Prompt","event_conversation_id":"","event_ext_message_id":"","event_ins_date":"","event_message_id":"","event_message_policy_assocs":[{"policy_guardrail_assoc":{"guardrail_entity_configured_action":"Block","guardrail_entity_configured_direction":"Both","guardrail_entity_configured_status":"Enabled","guardrail_entity_id":"71100000-0000-0000-c000-100000000008","guardrail_rule_configured_action":"","guardrail_rule_configured_direction":"","guardrail_rule_configured_status":"","guardrail_rule_id":"","guardrail_ruleset_id":"71000000-0000-0000-c000-000000000009","guardrail_ruleset_configured_action":"","guardrail_ruleset_configured_direction":"","guardrail_ruleset_configured_status":"","pol_guardrail_assoc_id":"f4e71dd9-12ad-4383-851e-d03fbc66c430","policy_id":"42ba067b-06c0-4e43-8002-2c6bce2663b4","tenant_id":"023327d5-ef36-4489-8d56-187d2f4730b3"}}],"related_event_message_id":"","tenant_id":"023327d5-ef36-4489-8d56-187d2f4730b3"}]},"event_ext_message_id":"","event_message_id":""}],"event_policy_guardrail_assocs":[{"policy_guardrail_assoc":{"guardrail_avail_entity":{"guardrail_entity_name":"Email"},"guardrail_avail_ruleset":{"guardrail":{"guardrails_type":"Privacy"},"guardrail_ruleset_type":"PII"},"guardrail_avail_subcategory":{"guardrail_rule_name":""},"pol_guardrail_assoc_id":"f4e71dd9-12ad-4383-851e-d03fbc66c430"}}]} |
96 changes: 96 additions & 0 deletions
96
detections/application/cisco_ai_defense_allowed_sensitive_prompt.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,96 @@ | ||
| name: Cisco AI Defense Allowed Sensitive Prompt | ||
| id: 75f06fd6-2b31-4ca4-9aaf-56448c342e44 | ||
| version: 1 | ||
| creation_date: '2026-10-15' | ||
| modification_date: '2026-10-15' | ||
| author: Nasreddine Bencherchali, Splunk | ||
| status: production | ||
| type: TTP | ||
| description: |- | ||
| Detects Cisco AI Defense prompt events that were allowed and matched a privacy guardrail for personally identifiable information or payment card data. | ||
| These events may indicate that sensitive information was submitted to an AI application and should be reviewed against the organization's data handling policy. | ||
| data_source: | ||
| - Cisco AI Defense Alerts | ||
| search: |- | ||
| `cisco_ai_defense` | ||
| event_action="allow" | ||
| event_message_type="prompt" | ||
|
|
||
| | eval guardrail_ruleset_type=mvjoin('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type', ", "), | ||
|
|
||
| guardrail_entity_name=mvjoin('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_entity.guardrail_entity_name', ", "), | ||
|
|
||
| application_name=if(isnotnull('genai_application.application_name') AND len(trim('genai_application.application_name'))>0, 'genai_application.application_name', "unknown"), | ||
|
|
||
| connection_name=if(isnotnull('connection.connection_name') AND len(trim('connection.connection_name'))>0, 'connection.connection_name', "unknown"), | ||
|
|
||
| application_key=if(isnotnull(application_id) AND len(trim(application_id))>0, application_id, application_name), | ||
|
|
||
| connection_key=if(isnotnull(connection_id) AND len(trim(connection_id))>0, connection_id, connection_name), | ||
|
|
||
| policy_name='policy.policy_name', | ||
|
|
||
| event_time=_time | ||
|
|
||
| | where mvfind('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type', "(?i)\\bPII\\b|personally identifiable information|\\bPCI\\b|payment card industry")>=0 | ||
|
|
||
| | bin _time span=10m | ||
|
|
||
| | stats count as event_count | ||
| dc(event_id) as distinct_event_count | ||
| min(event_time) as firstTime | ||
| max(event_time) as lastTime | ||
| values(event_id) as event_ids | ||
| values(guardrail_ruleset_type) as guardrail_ruleset_types | ||
| values(guardrail_entity_name) as guardrail_entity_names | ||
| values(policy_name) as policy_names | ||
| values(application_name) as application_names | ||
| values(connection_name) as connection_names | ||
| by _time application_key connection_key | ||
|
|
||
| | `security_content_ctime(firstTime)` | ||
| | `security_content_ctime(lastTime)` | ||
|
|
||
| | table _time firstTime lastTime application_key application_names connection_key connection_names | ||
| distinct_event_count event_count event_ids guardrail_ruleset_types guardrail_entity_names policy_names | ||
|
|
||
| | `cisco_ai_defense_allowed_sensitive_prompt_filter` | ||
| how_to_implement: |- | ||
| Install and configure the Cisco Security Cloud app to ingest Cisco AI Defense alerts into Splunk with the cisco:ai:defense sourcetype. | ||
| Confirm that extraction is enabled for the required fields as shown in the detection search. | ||
| Configure the "cisco_ai_defense" macro to match the index, source, and sourcetype used in your environment. | ||
| The search groups matching prompt events by application and connection in ten-minute windows to reduce duplicate findings. | ||
| known_false_positives: |- | ||
| Authorized testing, demonstrations, synthetic data, or approved workflows may submit content that matches PII or PCI guardrails. | ||
| Review the application, connection, policy, guardrail entity, and data handling requirements before treating an event as a policy violation. | ||
| drilldown_searches: | ||
| - name: View the detection results for - "$application_names$" | ||
| search: '%original_detection_search% | search application_names="$application_names$"' | ||
| earliest_offset: $info_min_time$ | ||
| latest_offset: $info_max_time$ | ||
| finding: | ||
| title: Cisco AI Defense allowed [$distinct_event_count$] sensitive prompt event(s) for application [$application_names$] and connection [$connection_names$] matched guardrail(s) [$guardrail_ruleset_types$]. | ||
| entity: | ||
| field: application_key | ||
| type: other | ||
| score: 50 | ||
| threat_objects: [] | ||
| analytic_story: | ||
| - Abuse of GenAI Systems and Applications | ||
| - Data Protection | ||
| - Critical Alerts | ||
| asset_type: Web Application | ||
| mitre_attack_id: [] | ||
| product: | ||
| - Splunk Enterprise | ||
| - Splunk Enterprise Security | ||
| - Splunk Cloud | ||
| category: application | ||
| security_domain: endpoint | ||
| tests: | ||
| - name: True Positive Test | ||
| attack_data: | ||
| - data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/cisco_ai_defense_alerts/cisco_ai_defense_alerts.json | ||
| source: not_applicable | ||
| sourcetype: cisco:ai:defense | ||
| test_type: unit | ||
73 changes: 73 additions & 0 deletions
73
detections/application/cisco_ai_defense_allowed_sensitive_response.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,73 @@ | ||
| name: Cisco AI Defense Allowed Sensitive Response | ||
| id: 6e4cd833-ea98-4c16-a7e7-e1909fad3fb2 | ||
| version: 1 | ||
| creation_date: '2026-10-15' | ||
| modification_date: '2026-10-15' | ||
| author: Nasreddine Bencherchali, Splunk | ||
| status: production | ||
| type: TTP | ||
| description: |- | ||
| Detects Cisco AI Defense response events that were allowed and matched a privacy guardrail for personally identifiable information or payment card data. | ||
| These events may indicate that sensitive information was returned to an AI application user and should be reviewed promptly. | ||
| data_source: | ||
| - Cisco AI Defense Alerts | ||
| search: |- | ||
| `cisco_ai_defense` | ||
| event_action="allow" | ||
| event_message_type="response" | ||
|
|
||
| | eval guardrail_ruleset_type=mvjoin('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type', ", "), | ||
|
|
||
| guardrail_entity_name=mvjoin('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_entity.guardrail_entity_name', ", "), | ||
|
|
||
| application_name=if(isnotnull('genai_application.application_name') AND len(trim('genai_application.application_name'))>0, 'genai_application.application_name', "unknown"), | ||
|
|
||
| connection_name=if(isnotnull('connection.connection_name') AND len(trim('connection.connection_name'))>0, 'connection.connection_name', "unknown"), | ||
|
|
||
| policy_name='policy.policy_name' | ||
|
|
||
| | where mvfind('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type', "(?i)\\bPII\\b|personally identifiable information|\\bPCI\\b|payment card industry")>=0 | ||
|
|
||
| | table _time event_date event_id event_message_type event_action resource_type | ||
| application_id application_name connection_id connection_name model.model_name | ||
| policy_name guardrail_ruleset_type guardrail_entity_name | ||
|
|
||
| | `cisco_ai_defense_allowed_sensitive_response_filter` | ||
| how_to_implement: |- | ||
| Install and configure the Cisco Security Cloud app to ingest Cisco AI Defense alerts into Splunk with the cisco:ai:defense sourcetype. | ||
| Confirm that extraction is enabled for the required fields as shown in the detection search. | ||
| Configure the "cisco_ai_defense" macro to match the index, source, and sourcetype used in your environment. | ||
| known_false_positives: |- | ||
| Authorized testing, demonstrations, or approved workflows may allow responses that match PII or PCI guardrails. | ||
| Review the application owner, policy, response context, and whether the data was expected to be disclosed. | ||
| drilldown_searches: | ||
| - name: View the detection results for - "$application_name$" | ||
| search: '%original_detection_search% | search application_name="$application_name$"' | ||
| earliest_offset: $info_min_time$ | ||
| latest_offset: $info_max_time$ | ||
| finding: | ||
| title: Cisco AI Defense allowed response [$event_id$] for application [$application_name$] matched privacy guardrail(s) [$guardrail_ruleset_type$] and entity [$guardrail_entity_name$]. | ||
| entity: | ||
| field: application_name | ||
| type: other | ||
| score: 50 | ||
| threat_objects: [] | ||
| analytic_story: | ||
| - Abuse of GenAI Systems and Applications | ||
| - Data Protection | ||
| - Critical Alerts | ||
| asset_type: Web Application | ||
| mitre_attack_id: [] | ||
| product: | ||
| - Splunk Enterprise | ||
| - Splunk Enterprise Security | ||
| - Splunk Cloud | ||
| category: application | ||
| security_domain: endpoint | ||
| tests: | ||
| - name: True Positive Test | ||
| attack_data: | ||
| - data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/cisco_ai_defense_alerts/cisco_ai_defense_alerts.json | ||
| source: not_applicable | ||
| sourcetype: cisco:ai:defense | ||
| test_type: unit |
96 changes: 96 additions & 0 deletions
96
detections/application/cisco_ai_defense_repeated_high_risk_activity.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,96 @@ | ||
| name: Cisco AI Defense Repeated High Risk Activity | ||
| id: 45c5cf84-8ad0-4923-8332-a7fd3dab59d4 | ||
| version: 1 | ||
| creation_date: '2026-10-15' | ||
| modification_date: '2026-10-15' | ||
| author: Nasreddine Bencherchali, Splunk | ||
| status: production | ||
| type: TTP | ||
| description: |- | ||
| Detects bursts of five or more distinct Cisco AI Defense event IDs, or three or more occurrences of the same event ID, matching prompt injection, code detection, PII, or PCI guardrails for the same application and connection within ten minutes. | ||
| Allowed PII/PCI prompt events are handled by Cisco AI Defense Allowed Sensitive Prompt. | ||
| These patterns can indicate iterative prompt-injection probing or repeated attempts to use an AI application to access restricted data or capabilities. | ||
| data_source: | ||
| - Cisco AI Defense Alerts | ||
| search: |- | ||
| `cisco_ai_defense` | ||
|
|
||
| ```Leave allowed PII/PCI prompt events to Cisco AI Defense Allowed Sensitive Prompt``` | ||
|
|
||
| | eval is_allowed_sensitive_prompt=if(lower(event_action)="allow" AND lower(event_message_type)="prompt" AND mvfind('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type', "(?i)\\bPII\\b|personally identifiable information|\\bPCI\\b|payment card industry")>=0, 1, 0) | ||
| | where is_allowed_sensitive_prompt=0 | ||
|
|
||
| | eval guardrail_ruleset_type=mvjoin('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type', ", "), | ||
| application_name=if(isnotnull('genai_application.application_name') AND len(trim('genai_application.application_name'))>0, 'genai_application.application_name', "unknown"), | ||
| connection_name=if(isnotnull('connection.connection_name') AND len(trim('connection.connection_name'))>0, 'connection.connection_name', "unknown"), | ||
| application_key=if(isnotnull(application_id) AND len(trim(application_id))>0, application_id, application_name), | ||
| connection_key=if(isnotnull(connection_id) AND len(trim(connection_id))>0, connection_id, connection_name) | ||
|
|
||
| | where mvfind('event_policy_guardrail_assocs{}.policy_guardrail_assoc.guardrail_avail_ruleset.guardrail_ruleset_type', "(?i)prompt injection|code detection|\\bPII\\b|personally identifiable information|\\bPCI\\b|payment card industry")>=0 | ||
|
|
||
| | bin _time span=10m | ||
|
|
||
| ```Track repeated records with the same Cisco event ID separately from bursts of distinct event IDs``` | ||
| | eventstats count as same_event_id_count by _time application_key connection_key event_id | ||
|
|
||
| | stats count as event_count | ||
| dc(event_id) as distinct_event_count | ||
| max(eval(if(isnotnull(event_id) AND len(trim(event_id))>0, same_event_id_count, 0))) as max_same_event_id_count | ||
| values(eval(if(isnotnull(event_id) AND len(trim(event_id))>0 AND same_event_id_count>=3, event_id, null()))) as repeated_event_ids | ||
| count(eval(lower(event_action)="allow")) as allowed_event_count | ||
| count(eval(lower(event_action)="block")) as blocked_event_count | ||
| values(event_id) as event_ids | ||
| values(event_action) as event_actions | ||
| values(event_message_type) as message_types | ||
| values(policy.policy_name) as policy_names | ||
| values(guardrail_ruleset_type) as guardrail_ruleset_types | ||
| values(connection_name) as connection_names | ||
| values(application_name) as application_names | ||
| by _time application_key connection_key | ||
|
|
||
| | where distinct_event_count>=5 OR max_same_event_id_count>=3 | ||
|
|
||
| | table _time application_key application_names connection_key connection_names | ||
| event_count distinct_event_count max_same_event_id_count repeated_event_ids | ||
| allowed_event_count blocked_event_count event_actions message_types policy_names | ||
| guardrail_ruleset_types event_ids | ||
|
|
||
| | `cisco_ai_defense_repeated_high_risk_activity_filter` | ||
| how_to_implement: |- | ||
| Install and configure the Cisco Security Cloud app to ingest Cisco AI Defense alerts into Splunk. | ||
| Confirm that extraction is enabled for the required fields as shown in the detection search. | ||
| Configure the "cisco_ai_defense" macro to match the index, source, and sourcetype used in your environment. | ||
| Adjust the five-distinct-event threshold, three-occurrence same-event-ID threshold, and ten-minute window as needed. | ||
| known_false_positives: |- | ||
| Automated testing, red-team exercises, application QA, or a popular shared application may generate repeated guardrail events. | ||
| Review whether the window contains allowed events and whether the activity was expected for the application and connection. | ||
| drilldown_searches: | ||
| - name: View the detection results for - "$application_key$" | ||
| search: '%original_detection_search% | search application_key="$application_key$"' | ||
| earliest_offset: $info_min_time$ | ||
| latest_offset: $info_max_time$ | ||
| finding: | ||
| title: Cisco AI Defense observed [$event_count$] high risk event occurrences across [$distinct_event_count$] unique event IDs in ten minutes for application [$application_names$] and connection [$connection_names$]. Maximum same-ID count -> [$max_same_event_id_count$] ; Allowed events -> [$allowed_event_count$] ; Blocked events -> [$blocked_event_count$]. | ||
| entity: | ||
| field: application_key | ||
| type: other | ||
| score: 50 | ||
| threat_objects: [] | ||
| analytic_story: | ||
| - Abuse of GenAI Systems and Applications | ||
|
nasbench marked this conversation as resolved.
|
||
| - Critical Alerts | ||
| asset_type: Web Application | ||
| mitre_attack_id: [] | ||
| product: | ||
| - Splunk Enterprise | ||
| - Splunk Enterprise Security | ||
| - Splunk Cloud | ||
| category: application | ||
| security_domain: endpoint | ||
| tests: | ||
| - name: True Positive Test | ||
| attack_data: | ||
| - data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/suspicious_behaviour/cisco_ai_defense_alerts/cisco_ai_defense_alerts.json | ||
| source: not_applicable | ||
| sourcetype: cisco:ai:defense | ||
| test_type: unit | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.