<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     https://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.    
-->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<!-- An SVG of a warning icon -->
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="1em" version="1.1" y="0px" x="0px" viewBox="0 0 980.02045 886.1"><g fill="red"><path d="m972.9158,794.5l-426.1,-761.1c-10.5,-20 -31.1,-32.7 -53.7,-33.4l-1.7,0c-22,0 -42.4,11.5 -53.7,30.5l-428.9,761c-11.5,19.4 -11.8,43.3 -0.6,62.9c11.1,19.6 31.9,31.7 54.4,31.7l854.9,0c21.9,0 42.2,-11.5 53.5,-30.2s12,-42 1.9,-61.4zm-910.4,29.2l428.9,-761.1l426,761.1l-854.9,0z"/><path d="m490.3158,626.7c-36.5,0 -62.1,25.6 -62.1,62.8c0,35.8 24.9,62.8 60.7,62.8l1.4,0c37.3,0 61.5,-27 61.5,-62.8c-0.7,-37.3 -24.9,-62.8 -61.5,-62.8z"/><path d="m451.0158,592.1l78.7,0l15.2,-312.6l-109,0l15.1,312.6z"/></g></svg>