.elementor-901 .elementor-element.elementor-element-cb10524{--display:flex;--min-height:35px;--flex-direction:row;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--align-items:center;--gap:0px 0px;--row-gap:0px;--column-gap:0px;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:01%;--padding-right:1%;--z-index:96;}.elementor-901 .elementor-element.elementor-element-cb10524:not(.elementor-motion-effects-element-type-background), .elementor-901 .elementor-element.elementor-element-cb10524 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:var( --e-global-color-primary );}.elementor-901 .elementor-element.elementor-element-b833dcd{--display:flex;--min-height:30px;--flex-direction:column;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;--justify-content:center;--align-items:flex-start;--gap:20px 20px;--row-gap:20px;--column-gap:20px;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:0%;}.elementor-901 .elementor-element.elementor-element-a56ff9b{margin:0px 0px calc(var(--kit-widget-spacing, 0px) + 0px) 0px;padding:0px 0px 0px 0px;}.elementor-901 .elementor-element.elementor-element-af3877b{--display:flex;--min-height:30px;--flex-direction:column;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;--justify-content:center;--align-items:flex-end;--gap:20px 20px;--row-gap:20px;--column-gap:20px;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:0%;}.elementor-901 .elementor-element.elementor-element-3e7682a{--display:flex;--min-height:80px;--flex-direction:row;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--justify-content:center;--align-items:stretch;--gap:0px 0px;--row-gap:0px;--column-gap:0px;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:1%;--z-index:94;}.elementor-901 .elementor-element.elementor-element-3e7682a:not(.elementor-motion-effects-element-type-background), .elementor-901 .elementor-element.elementor-element-3e7682a > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:var( --e-global-color-accent );}.elementor-901 .elementor-element.elementor-element-c715f98{--display:flex;--gap:0px 0px;--row-gap:0px;--column-gap:0px;--margin-top:0px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-901 .elementor-element.elementor-element-c715f98:not(.elementor-motion-effects-element-type-background), .elementor-901 .elementor-element.elementor-element-c715f98 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:#02010100;}.elementor-901 .elementor-element.elementor-element-c715f98.e-con{--flex-grow:0;--flex-shrink:0;}.elementor-901 .elementor-element.elementor-element-3b33bf7{margin:0px 0px calc(var(--kit-widget-spacing, 0px) + 0px) 0px;padding:0px 0px 0px 0px;text-align:start;}.elementor-901 .elementor-element.elementor-element-3b33bf7 img{width:100%;border-radius:0px 0px 0px 0px;}.elementor-901 .elementor-element.elementor-element-3c4aac7{--display:flex;--flex-direction:row;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--justify-content:flex-end;--align-items:center;--gap:20px 20px;--row-gap:20px;--column-gap:20px;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:0%;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-menu-toggle{margin:0 auto;background-color:var( --e-global-color-accent );}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu .elementor-item{font-family:"Inter", Sans-serif;font-size:1em;font-weight:700;text-transform:uppercase;line-height:1.05em;letter-spacing:0.02em;word-spacing:0.2em;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main .elementor-item{color:var( --e-global-color-911ba1e );fill:var( --e-global-color-911ba1e );padding-left:15px;padding-right:15px;padding-top:10px;padding-bottom:10px;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main .elementor-item:hover,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main .elementor-item.elementor-item-active,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main .elementor-item.highlighted,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main .elementor-item:focus{color:#E4E4E4;fill:#E4E4E4;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main .elementor-item.elementor-item-active{color:var( --e-global-color-911ba1e );}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-menu-toggle{color:var( --e-global-color-911ba1e );fill:var( --e-global-color-911ba1e );}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown{background-color:var( --e-global-color-primary );}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a:hover,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a:focus,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a.elementor-item-active,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a.highlighted,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-menu-toggle:hover,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-menu-toggle:focus{color:#F5F5F5;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a:hover,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a:focus,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a.elementor-item-active,
					.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a.highlighted{background-color:var( --e-global-color-secondary );}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown .elementor-item, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown  .elementor-sub-item{font-family:"Inter", Sans-serif;font-size:1em;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;word-spacing:1px;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main .elementor-nav-menu--dropdown, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu__container.elementor-nav-menu--dropdown{box-shadow:0px 3px 4px 0px rgba(0, 0, 0, 0.25);}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main > .elementor-nav-menu > li > .elementor-nav-menu--dropdown, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu__container.elementor-nav-menu--dropdown{margin-top:15px !important;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 div.elementor-menu-toggle{color:var( --e-global-color-911ba1e );}.elementor-901 .elementor-element.elementor-element-c4ba3f3 div.elementor-menu-toggle svg{fill:var( --e-global-color-911ba1e );}.elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button{background-color:var( --e-global-color-primary );font-family:var( --e-global-typography-2403797-font-family ), Sans-serif;font-size:var( --e-global-typography-2403797-font-size );font-weight:var( --e-global-typography-2403797-font-weight );line-height:var( --e-global-typography-2403797-line-height );letter-spacing:var( --e-global-typography-2403797-letter-spacing );word-spacing:var( --e-global-typography-2403797-word-spacing );fill:var( --e-global-color-911ba1e );color:var( --e-global-color-911ba1e );border-style:none;border-radius:3px 3px 3px 3px;padding:1.4em 1.5em 1.4em 1.5em;}.elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button:hover, .elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button:focus{background-color:var( --e-global-color-911ba1e );color:var( --e-global-color-primary );}.elementor-901 .elementor-element.elementor-element-c5c724f{margin:0px 0px calc(var(--kit-widget-spacing, 0px) + 0px) 0px;padding:0px 0px 0px 0px;}.elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button-content-wrapper{flex-direction:row;}.elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button .elementor-button-content-wrapper{gap:10px;}.elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button:hover svg, .elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button:focus svg{fill:var( --e-global-color-primary );}.elementor-theme-builder-content-area{height:400px;}.elementor-location-header:before, .elementor-location-footer:before{content:"";display:table;clear:both;}@media(min-width:768px){.elementor-901 .elementor-element.elementor-element-b833dcd{--width:34%;}.elementor-901 .elementor-element.elementor-element-c715f98{--width:28.571%;}}@media(max-width:1200px) and (min-width:768px){.elementor-901 .elementor-element.elementor-element-b833dcd{--width:49%;}}@media(max-width:1150px) and (min-width:768px){.elementor-901 .elementor-element.elementor-element-b833dcd{--width:65%;}.elementor-901 .elementor-element.elementor-element-af3877b{--width:100%;}.elementor-901 .elementor-element.elementor-element-c715f98{--width:50%;}.elementor-901 .elementor-element.elementor-element-3c4aac7{--width:85%;}}@media(max-width:1150px){.elementor-901 .elementor-element.elementor-element-cb10524{--min-height:35px;--flex-direction:column;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;--align-items:center;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:2%;--padding-right:2%;}.elementor-901 .elementor-element.elementor-element-b833dcd{--align-items:center;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );}.elementor-901 .elementor-element.elementor-element-af3877b{--align-items:center;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );}.elementor-901 .elementor-element.elementor-element-3e7682a{--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:5%;}.elementor-901 .elementor-element.elementor-element-3b33bf7 img{width:100%;}.elementor-901 .elementor-element.elementor-element-c4ba3f3{margin:0px 0px calc(var(--kit-widget-spacing, 0px) + 0px) 0px;padding:0px 0px 0px 0px;--nav-menu-icon-size:35px;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu .elementor-item{line-height:1.05em;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown .elementor-item, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown  .elementor-sub-item{font-size:0.875em;word-spacing:0.02em;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown a{padding-left:5%;padding-right:5%;padding-top:15px;padding-bottom:15px;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main > .elementor-nav-menu > li > .elementor-nav-menu--dropdown, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu__container.elementor-nav-menu--dropdown{margin-top:30px !important;}.elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button{font-size:var( --e-global-typography-2403797-font-size );line-height:var( --e-global-typography-2403797-line-height );letter-spacing:var( --e-global-typography-2403797-letter-spacing );word-spacing:var( --e-global-typography-2403797-word-spacing );border-radius:10px 10px 10px 10px;}}@media(max-width:767px){.elementor-901 .elementor-element.elementor-element-cb10524{--min-height:35px;--flex-direction:row;--container-widget-width:initial;--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--justify-content:center;--gap:0px 0px;--row-gap:0px;--column-gap:0px;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0;--padding-bottom:0;--padding-left:0;--padding-right:0;}.elementor-901 .elementor-element.elementor-element-b833dcd{--width:100%;--justify-content:center;--align-items:center;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:0%;}.elementor-901 .elementor-element.elementor-element-af3877b{--width:20%;--justify-content:center;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:0%;}.elementor-901 .elementor-element.elementor-element-3e7682a{--min-height:0px;--flex-direction:row;--container-widget-width:initial;--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--gap:0px 0px;--row-gap:0px;--column-gap:0px;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0;--padding-bottom:0;--padding-left:0;--padding-right:0;}.elementor-901 .elementor-element.elementor-element-c715f98{--width:80%;--flex-direction:row;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--justify-content:flex-start;--align-items:center;--margin-top:0px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-901 .elementor-element.elementor-element-3b33bf7{margin:0px 0px calc(var(--kit-widget-spacing, 0px) + 0px) 0px;padding:0px 0px 0px 0px;text-align:start;}.elementor-901 .elementor-element.elementor-element-3b33bf7 img{width:90%;}.elementor-901 .elementor-element.elementor-element-3c4aac7{--width:20%;--justify-content:center;--margin-top:0%;--margin-bottom:0%;--margin-left:0%;--margin-right:0%;--padding-top:0%;--padding-bottom:0%;--padding-left:0%;--padding-right:0%;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu .elementor-item{line-height:1.05em;word-spacing:0em;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown .elementor-item, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--dropdown  .elementor-sub-item{font-size:0.875em;letter-spacing:0.06em;word-spacing:0.02em;}.elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu--main > .elementor-nav-menu > li > .elementor-nav-menu--dropdown, .elementor-901 .elementor-element.elementor-element-c4ba3f3 .elementor-nav-menu__container.elementor-nav-menu--dropdown{margin-top:23px !important;}.elementor-901 .elementor-element.elementor-element-c4ba3f3{--nav-menu-icon-size:35px;}.elementor-901 .elementor-element.elementor-element-c5c724f .elementor-button{font-size:var( --e-global-typography-2403797-font-size );line-height:var( --e-global-typography-2403797-line-height );letter-spacing:var( --e-global-typography-2403797-letter-spacing );word-spacing:var( --e-global-typography-2403797-word-spacing );border-radius:10px 10px 10px 10px;}}/* Start custom CSS for html, class: .elementor-element-a56ff9b */<div id="rmfpd-burn-status-widget"
     class="rmfpd-burn-status"
     role="status"
     aria-live="polite"
     aria-label="Checking outdoor burning status">

    <span class="rmfpd-status-label">
        Outdoor Burning:
    </span>

    <span class="rmfpd-status-value">

        <span class="rmfpd-status-dot"
              aria-hidden="true"></span>

        <strong class="rmfpd-status-word">
            CHECKING...
        </strong>

        <a class="rmfpd-status-call"
           href="tel:+14176242715">
            Call to Confirm
        </a>

    </span>

</div>


<style>

/* =========================================
   RMFPD BURN STATUS ENGINE
   VERSION 3.0
   ========================================= */

.rmfpd-burn-status {
    display: inline-flex;
    align-items: center;
    height: 35px;
    margin: 0;
    padding: 0;
    font-family: "Inter", sans-serif;
    font-size: 1em;
    font-weight: 400;
    line-height: 1;
    color: #FFFFFF;
    white-space: nowrap;
}

.rmfpd-status-label {
    color: #FFFFFF;
}

.rmfpd-status-value {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-left: 4px;
}

.rmfpd-status-dot {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex: 0 0 10px;
    background-color: #A0A0A0;
}

.rmfpd-status-word {
    color: #FFFFFF;
    font-weight: 700;
}

.rmfpd-status-call {
    display: none;
    color: #FFFFFF;
    font-weight: 400;
    text-decoration: underline;
    text-underline-offset: 2px;
}

.rmfpd-status-call:hover,
.rmfpd-status-call:focus {
    color: #FFFFFF;
    text-decoration-thickness: 2px;
}


/* ALLOWED */

.rmfpd-burn-status.is-allowed .rmfpd-status-dot {
    background-color: #2E8B57;
}


/* CAUTION */

.rmfpd-burn-status.is-caution .rmfpd-status-dot {
    background-color: #F4C430;
}

.rmfpd-burn-status.is-caution .rmfpd-status-call {
    display: inline;
}


/* PROHIBITED */

.rmfpd-burn-status.is-prohibited .rmfpd-status-dot {
    background-color: #E23238;
}

.rmfpd-burn-status.is-prohibited .rmfpd-status-call {
    display: inline;
}


/* UNAVAILABLE */

.rmfpd-burn-status.is-unavailable .rmfpd-status-dot {
    background-color: #A0A0A0;
}

.rmfpd-burn-status.is-unavailable .rmfpd-status-call {
    display: inline;
}


/* MOBILE */

@media (max-width: 767px) {

    .rmfpd-burn-status {
        font-size: 14px;
    }

}

<\/style>


<script>

(async function () {

    'use strict';


    /* =========================================
       WIDGET
       ========================================= */

    const widget =
        document.getElementById(
            'rmfpd-burn-status-widget'
        );

    if (!widget) {
        return;
    }


    const statusWord =
        widget.querySelector(
            '.rmfpd-status-word'
        );


    /* =========================================
       ENGINE SETTINGS
       ========================================= */

    const ENGINE_VERSION =
        '3.0';


    /*
     * Keeps CHECKING visible for at least
     * 1.5 seconds when APIs respond quickly.
     *
     * Slow API responses are NOT delayed
     * an additional 1.5 seconds.
     */

    const MIN_CHECKING_TIME =
        1500;


    /*
     * Individual external request timeout.
     */

    const FETCH_TIMEOUT =
        7000;


    /*
     * Overall engine failsafe.
     *
     * The widget cannot remain CHECKING
     * indefinitely.
     */

    const ENGINE_TIMEOUT =
        12000;


    /*
     * NWS point-to-grid mappings rarely change.
     *
     * Cache them in the visitor's browser
     * for seven days to reduce NWS requests.
     */

    const POINT_CACHE_TTL =
        7 *
        24 *
        60 *
        60 *
        1000;


    const startedAt =
        Date.now();


    /* =========================================
       EMERGENCY MANUAL OVERRIDE
       =========================================

       Options:

       automatic
       caution
       prohibited

       NEVER add "allowed" here.

       Manual control may increase a restriction,
       but should never override an automatic
       hazardous condition with green.

       Future RMFPD staff control panel will
       replace this configuration value.
       ========================================= */

    const MANUAL_OVERRIDE =
        'automatic';


    /* =========================================
       RMFPD MONITORING LOCATIONS
       ========================================= */

    const locations = [

        {
            name: 'Station 1',
            lat: 37.018,
            lon: -94.517
        },

        {
            name: 'Station 2',
            lat: 36.993,
            lon: -94.476
        },

        {
            name: 'Station 3',
            lat: 37.001,
            lon: -94.442
        },

        {
            name: 'Station 4',
            lat: 36.942,
            lon: -94.485
        },

        {
            name: 'Station 5',
            lat: 37.014,
            lon: -94.437
        },

        {
            name: 'Station 6',
            lat: 36.927,
            lon: -94.469
        }

    ];


    /* =========================================
       US DROUGHT MONITOR
       ========================================= */

    const droughtNames = {

        0: 'D0 — Abnormally Dry',
        1: 'D1 — Moderate Drought',
        2: 'D2 — Severe Drought',
        3: 'D3 — Extreme Drought',
        4: 'D4 — Exceptional Drought'

    };


    const droughtBaseURL =
        'https://gis.fema.gov/arcgis/rest/services/' +
        'Partner/Drought_Current/MapServer/0/query';


    /* =========================================
       STATUS DISPLAY
       ========================================= */

    function setBurnStatus(
        status,
        reason
    ) {

        widget.classList.remove(
            'is-allowed',
            'is-caution',
            'is-prohibited',
            'is-unavailable'
        );


        switch (status) {

            case 'prohibited':

                widget.classList.add(
                    'is-prohibited'
                );

                statusWord.textContent =
                    'PROHIBITED —';

                widget.setAttribute(
                    'aria-label',
                    'Outdoor burning prohibited. Call station to confirm.'
                );

                break;


            case 'caution':

                widget.classList.add(
                    'is-caution'
                );

                statusWord.textContent =
                    'CAUTION —';

                widget.setAttribute(
                    'aria-label',
                    'Outdoor burning caution. Call station to confirm.'
                );

                break;


            case 'unavailable':

                widget.classList.add(
                    'is-unavailable'
                );

                statusWord.textContent =
                    'STATUS UNAVAILABLE —';

                widget.setAttribute(
                    'aria-label',
                    'Outdoor burning status unavailable. Call station to confirm.'
                );

                break;


            default:

                widget.classList.add(
                    'is-allowed'
                );

                statusWord.textContent =
                    'ALLOWED';

                widget.setAttribute(
                    'aria-label',
                    'Outdoor burning status allowed.'
                );

        }


        window.rmfpdBurnStatus = {

            status: status,

            reason: reason,

            updated: new Date(),

            engineVersion:
                ENGINE_VERSION

        };

    }


    /* =========================================
       MINIMUM CHECKING DISPLAY
       ========================================= */

    function displayResult(
        result
    ) {

        const elapsed =
            Date.now() -
            startedAt;


        const delay =
            Math.max(
                0,
                MIN_CHECKING_TIME -
                elapsed
            );


        setTimeout(
            function () {

                setBurnStatus(
                    result.status,
                    result.reason
                );


                window.rmfpdFireData =
                    result;


                console.log(
                    'RMFPD Burn Status Engine:',
                    result
                );

            },
            delay
        );

    }


    /* =========================================
       FETCH WITH TIMEOUT
       ========================================= */

    async function fetchJSON(
        url,
        options
    ) {

        const controller =
            new AbortController();


        const timeout =
            setTimeout(
                function () {

                    controller.abort();

                },
                FETCH_TIMEOUT
            );


        try {

            const response =
                await fetch(

                    url,

                    Object.assign(
                        {},
                        options || {},
                        {
                            signal:
                                controller.signal
                        }
                    )

                );


            if (!response.ok) {

                throw new Error(
                    'HTTP ' +
                    response.status
                );

            }


            return (
                await response.json()
            );

        }

        catch (error) {

            if (
                error &&
                error.name ===
                'AbortError'
            ) {

                throw new Error(
                    'Request timed out'
                );

            }


            throw error;

        }

        finally {

            clearTimeout(
                timeout
            );

        }

    }


    /* =========================================
       ISO DURATION PARSER
       ========================================= */

    function parseDurationMilliseconds(
        duration
    ) {

        if (!duration) {

            return (
                60 *
                60 *
                1000
            );

        }


        const match =
            duration.match(
                /^P(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/
            );


        if (!match) {

            return (
                60 *
                60 *
                1000
            );

        }


        const days =
            Number(
                match[1] || 0
            );


        const hours =
            Number(
                match[2] || 0
            );


        const minutes =
            Number(
                match[3] || 0
            );


        const seconds =
            Number(
                match[4] || 0
            );


        return (

            (
                days *
                24 *
                60 *
                60
            )

            +

            (
                hours *
                60 *
                60
            )

            +

            (
                minutes *
                60
            )

            +

            seconds

        ) * 1000;

    }


    /* =========================================
       CURRENT NWS GRID VALUE
       ========================================= */

    function getCurrentValue(
        property
    ) {

        if (
            !property ||
            !Array.isArray(
                property.values
            )
        ) {

            return null;

        }


        const now =
            new Date();


        for (
            const item
            of property.values
        ) {

            if (
                !item ||
                !item.validTime
            ) {

                continue;

            }


            const parts =
                item.validTime.split(
                    '/'
                );


            const start =
                new Date(
                    parts[0]
                );


            if (
                isNaN(
                    start.getTime()
                )
            ) {

                continue;

            }


            const duration =
                parseDurationMilliseconds(
                    parts[1]
                );


            const end =
                new Date(

                    start.getTime() +
                    duration

                );


            if (
                now >= start &&
                now < end
            ) {

                return (
                    item.value !== undefined
                        ?
                        item.value
                        :
                        null
                );

            }

        }


        return null;

    }


    /* =========================================
       WIND UNIT CONVERSION
       ========================================= */

    function speedToMph(
        value,
        unit
    ) {

        if (
            value === null ||
            value === undefined
        ) {

            return null;

        }


        const uom =
            String(
                unit || ''
            ).toLowerCase();


        /* Kilometers per hour */

        if (
            uom.includes(
                'km_h-1'
            )
        ) {

            return (
                value *
                0.621371
            );

        }


        /* Meters per second */

        if (
            uom.includes(
                'm_s-1'
            )
        ) {

            return (
                value *
                2.23694
            );

        }


        /* Knots */

        if (
            uom.includes('kt') ||
            uom.includes('knot')
        ) {

            return (
                value *
                1.15078
            );

        }


        /* Miles per hour */

        if (
            uom.includes('mph') ||
            uom.includes('mi_h-1')
        ) {

            return value;

        }


        throw new Error(
            'Unsupported NWS wind unit: ' +
            unit
        );

    }


    function mphToKnots(
        mph
    ) {

        return (
            mph *
            0.868976
        );

    }


    /* =========================================
       LOCAL STORAGE HELPERS
       ========================================= */

    const pointCacheKey =
        'rmfpd-nws-point-cache-v3';


    function readPointCache() {

        try {

            const value =
                localStorage.getItem(
                    pointCacheKey
                );


            if (!value) {

                return {};

            }


            const parsed =
                JSON.parse(
                    value
                );


            return (
                parsed &&
                typeof parsed ===
                'object'
                    ?
                    parsed
                    :
                    {}
            );

        }

        catch (error) {

            return {};

        }

    }


    function writePointCache(
        cache
    ) {

        try {

            localStorage.setItem(
                pointCacheKey,
                JSON.stringify(
                    cache
                )
            );

        }

        catch (error) {

            /*
             * Storage is optional.
             * Engine continues without it.
             */

        }

    }


    /* =========================================
       NWS POINT → GRID LOOKUP
       ========================================= */

    async function getForecastGridURL(
        location
    ) {

        const cache =
            readPointCache();


        const key =
            location.lat +
            ',' +
            location.lon;


        const cached =
            cache[key];


        if (
            cached &&
            cached.url &&
            cached.saved &&
            (
                Date.now() -
                cached.saved
            ) <
            POINT_CACHE_TTL
        ) {

            return cached.url;

        }


        const data =
            await fetchJSON(

                'https://api.weather.gov/points/' +
                location.lat +
                ',' +
                location.lon,

                {
                    headers: {

                        'Accept':
                            'application/geo+json'

                    }
                }

            );


        const url =
            data &&
            data.properties
                ?
                data.properties
                    .forecastGridData
                :
                null;


        if (!url) {

            throw new Error(
                location.name +
                ' forecast grid unavailable'
            );

        }


        cache[key] = {

            url: url,

            saved:
                Date.now()

        };


        writePointCache(
            cache
        );


        return url;

    }


    /* =========================================
       DE-DUPLICATE GRID REQUESTS
       ========================================= */

    const gridRequests =
        new Map();


    function getGridData(
        url
    ) {

        if (
            gridRequests.has(
                url
            )
        ) {

            return (
                gridRequests.get(
                    url
                )
            );

        }


        const request =
            fetchJSON(

                url,

                {
                    headers: {

                        'Accept':
                            'application/geo+json'

                    }
                }

            );


        gridRequests.set(
            url,
            request
        );


        return request;

    }


    /* =========================================
       NWS WEATHER
       ========================================= */

    async function getWeatherData(
        location
    ) {

        const gridURL =
            await getForecastGridURL(
                location
            );


        const grid =
            await getGridData(
                gridURL
            );


        if (
            !grid ||
            !grid.properties
        ) {

            throw new Error(
                location.name +
                ' weather data unavailable'
            );

        }


        const properties =
            grid.properties;


        const humidity =
            getCurrentValue(
                properties.relativeHumidity
            );


        const rawWind =
            getCurrentValue(
                properties.windSpeed
            );


        const rawGust =
            getCurrentValue(
                properties.windGust
            );


        if (
            humidity === null ||
            rawWind === null
        ) {

            throw new Error(
                location.name +
                ' required weather data unavailable'
            );

        }


        const wind =
            speedToMph(

                rawWind,

                properties.windSpeed
                    ?
                    properties.windSpeed.uom
                    :
                    ''

            );


        const gust =

            rawGust === null

                ?

            null

                :

            speedToMph(

                rawGust,

                properties.windGust
                    ?
                    properties.windGust.uom
                    :
                    ''

            );


        return {

            name:
                location.name,

            humidity:
                Math.round(
                    humidity
                ),

            wind:
                Math.round(
                    wind
                ),

            gust:

                gust === null

                    ?

                null

                    :

                Math.round(
                    gust
                )

        };

    }


    /* =========================================
       NWS ACTIVE FIRE ALERTS
       ========================================= */

    async function getAlertData(
        location
    ) {

        const data =
            await fetchJSON(

                'https://api.weather.gov/alerts/active?point=' +
                location.lat +
                ',' +
                location.lon,

                {
                    headers: {

                        'Accept':
                            'application/geo+json'

                    }
                }

            );


        if (
            !data ||
            !Array.isArray(
                data.features
            )
        ) {

            throw new Error(
                location.name +
                ' alert data unavailable'
            );

        }


        let redFlag =
            false;


        let fireWeatherWatch =
            false;


        data.features.forEach(
            function (
                alert
            ) {

                const event =

                    String(

                        alert &&
                        alert.properties
                            ?
                            alert.properties
                                .event || ''
                            :
                            ''

                    )

                    .toLowerCase();


                if (
                    event.includes(
                        'red flag warning'
                    )
                ) {

                    redFlag =
                        true;

                }


                if (
                    event.includes(
                        'fire weather watch'
                    )
                ) {

                    fireWeatherWatch =
                        true;

                }

            }
        );


        return {

            name:
                location.name,

            redFlag:
                redFlag,

            fireWeatherWatch:
                fireWeatherWatch

        };

    }


    /* =========================================
       DROUGHT DATASET DATE
       ========================================= */

    function validateDroughtDate(
        date
    ) {

        if (
            !date ||
            isNaN(
                date.getTime()
            )
        ) {

            throw new Error(
                'USDM update date unavailable'
            );

        }


        const ageDays =

            (
                Date.now() -
                date.getTime()
            )

            /

            (
                1000 *
                60 *
                60 *
                24
            );


        /*
         * USDM normally updates weekly.
         *
         * Greater than 10 days old means
         * the source cannot be used to
         * establish an all-clear.
         */

        if (
            ageDays > 10
        ) {

            throw new Error(
                'USDM drought data is stale'
            );

        }


        return date;

    }


    async function getDroughtDatasetDate() {

        const params =
            new URLSearchParams({

                f:
                    'json',

                where:
                    '1=1',

                outFields:
                    'update_dat',

                returnGeometry:
                    'false',

                orderByFields:
                    'update_dat DESC',

                resultRecordCount:
                    '1'

            });


        const data =
            await fetchJSON(

                droughtBaseURL +
                '?' +
                params.toString()

            );


        if (
            data.error
        ) {

            throw new Error(
                data.error.message ||
                'USDM dataset error'
            );

        }


        const rawDate =

            data.features &&
            data.features[0] &&
            data.features[0].attributes

                ?

            data.features[0]
                .attributes
                .update_dat

                :

            null;


        return (
            validateDroughtDate(
                new Date(
                    rawDate
                )
            )
        );

    }


    /* =========================================
       DROUGHT AT ONE MONITORING POINT
       ========================================= */

    async function getDroughtData(
        location
    ) {

        const params =
            new URLSearchParams({

                f:
                    'json',

                where:
                    '1=1',

                geometry:
                    location.lon +
                    ',' +
                    location.lat,

                geometryType:
                    'esriGeometryPoint',

                inSR:
                    '4326',

                spatialRel:
                    'esriSpatialRelIntersects',

                outFields:
                    'dm,update_dat',

                returnGeometry:
                    'false'

            });


        const data =
            await fetchJSON(

                droughtBaseURL +
                '?' +
                params.toString()

            );


        if (
            data.error
        ) {

            throw new Error(

                location.name +
                ' drought error: ' +
                (
                    data.error.message ||
                    'unknown'
                )

            );

        }


        /*
         * No polygon means NONE.
         *
         * Dataset freshness is independently
         * verified before ALLOWED can occur.
         */

        if (
            !Array.isArray(
                data.features
            ) ||
            data.features.length === 0
        ) {

            return {

                name:
                    location.name,

                level:
                    -1,

                label:
                    'NONE — No USDM Drought Category'

            };

        }


        let highestLevel =
            -1;


        data.features.forEach(
            function (
                feature
            ) {

                const level =
                    Number(

                        feature &&
                        feature.attributes
                            ?
                            feature.attributes.dm
                            :
                            NaN

                    );


                if (
                    Number.isFinite(
                        level
                    ) &&
                    level >= 0 &&
                    level <= 4 &&
                    level >
                    highestLevel
                ) {

                    highestLevel =
                        level;

                }

            }
        );


        if (
            highestLevel < 0
        ) {

            throw new Error(
                location.name +
                ' drought category unavailable'
            );

        }


        return {

            name:
                location.name,

            level:
                highestLevel,

            label:
                droughtNames[
                    highestLevel
                ]

        };

    }


    /* =========================================
       WEATHER SAFETY SCREEN
       =========================================

       Conservative RMFPD website screening.

       This uses the Missouri fire-weather
       RH/wind framework as a caution screen.

       It does NOT independently declare an
       NWS Red Flag Warning because official
       criteria also include fuel moisture
       and professional coordination.
       ========================================= */

    function getWeatherConcern(
        station
    ) {

        const rh =
            station.humidity;


        const windMph =
            station.wind;


        const gustMph =
            station.gust;


        const windKnots =
            mphToKnots(
                windMph
            );


        /*
         * RH below 20%
         * + sustained wind >= 5 knots
         */

        if (
            rh < 20 &&
            windKnots >= 5
        ) {

            return {

                concern:
                    true,

                reason:

                    'Very low humidity and elevated wind at ' +
                    station.name

            };

        }


        /*
         * RH 20–24%
         * + sustained wind >= 10 knots
         */

        if (
            rh >= 20 &&
            rh <= 24 &&
            windKnots >= 10
        ) {

            return {

                concern:
                    true,

                reason:

                    'Low humidity and elevated wind at ' +
                    station.name

            };

        }


        /*
         * Conservative screen for RH 25–34%
         * with elevated sustained wind.
         */

        if (
            rh >= 25 &&
            rh <= 34 &&
            windKnots >= 10
        ) {

            return {

                concern:
                    true,

                reason:

                    'Dry and windy conditions at ' +
                    station.name

            };

        }


        /*
         * Borderline high-wind safeguard.
         */

        if (
            rh <= 35 &&
            (
                windMph >= 30 ||
                (
                    gustMph !== null &&
                    gustMph >= 30
                )
            )
        ) {

            return {

                concern:
                    true,

                reason:

                    'High wind and dry conditions at ' +
                    station.name

            };

        }


        return {

            concern:
                false,

            reason:
                null

        };

    }


    /* =========================================
       SETTLED RESULT HELPERS
       ========================================= */

    function fulfilledValues(
        results
    ) {

        return (
            results

                .filter(
                    function (
                        result
                    ) {

                        return (
                            result.status ===
                            'fulfilled'
                        );

                    }
                )

                .map(
                    function (
                        result
                    ) {

                        return (
                            result.value
                        );

                    }
                )
        );

    }


    function hasFailures(
        results
    ) {

        return (
            results.some(
                function (
                    result
                ) {

                    return (
                        result.status ===
                        'rejected'
                    );

                }
            )
        );

    }


    function errorMessages(
        results,
        type
    ) {

        const errors =
            [];


        results.forEach(
            function (
                result,
                index
            ) {

                if (
                    result.status ===
                    'rejected'
                ) {

                    errors.push(

                        locations[index].name +
                        ' ' +
                        type +
                        ': ' +
                        (
                            result.reason &&
                            result.reason.message
                                ?
                                result.reason.message
                                :
                                String(
                                    result.reason
                                )
                        )

                    );

                }

            }
        );


        return errors;

    }


    /* =========================================
       AUTOMATIC DECISION ENGINE
       ========================================= */

    async function runAutomaticEngine() {


        const droughtDatePromise =
            getDroughtDatasetDate();


        const alertResultsPromise =
            Promise.allSettled(

                locations.map(
                    getAlertData
                )

            );


        const weatherResultsPromise =
            Promise.allSettled(

                locations.map(
                    getWeatherData
                )

            );


        const droughtResultsPromise =
            Promise.allSettled(

                locations.map(
                    getDroughtData
                )

            );


        const [

            droughtDateResult,
            alertResults,
            weatherResults,
            droughtResults

        ] = await Promise.all([


            Promise.allSettled([
                droughtDatePromise
            ]),


            alertResultsPromise,


            weatherResultsPromise,


            droughtResultsPromise


        ]);


        const alerts =
            fulfilledValues(
                alertResults
            );


        const weatherStations =
            fulfilledValues(
                weatherResults
            );


        const droughtStations =
            fulfilledValues(
                droughtResults
            );


        const droughtDateValues =
            fulfilledValues(
                droughtDateResult
            );


        const droughtDataDate =

            droughtDateValues.length

                ?

            droughtDateValues[0]

                :

            null;


        /* =====================================
           MOST RESTRICTIVE DROUGHT POINT
           ===================================== */

        let districtDroughtLevel =
            -1;


        let districtDroughtStation =
            null;


        droughtStations.forEach(
            function (
                station
            ) {

                if (
                    station.level >
                    districtDroughtLevel
                ) {

                    districtDroughtLevel =
                        station.level;

                    districtDroughtStation =
                        station.name;

                }

            }
        );


        const districtDroughtLabel =

            districtDroughtLevel >= 0

                ?

            droughtNames[
                districtDroughtLevel
            ]

                :

            'NONE — No USDM Drought Category';


        /* =====================================
           DATA COMPLETENESS
           ===================================== */

        const requiredDataMissing =

            hasFailures(
                alertResults
            )

            ||

            hasFailures(
                weatherResults
            )

            ||

            hasFailures(
                droughtResults
            )

            ||

            hasFailures(
                droughtDateResult
            );


        const errors = [

            ...errorMessages(
                alertResults,
                'alerts'
            ),

            ...errorMessages(
                weatherResults,
                'weather'
            ),

            ...errorMessages(
                droughtResults,
                'drought'
            )

        ];


        if (
            hasFailures(
                droughtDateResult
            )
        ) {

            errors.push(
                'USDM dataset date unavailable'
            );

        }


        /* =====================================
           PROHIBITED SIGNALS
           ===================================== */


        /*
         * 1. NWS RED FLAG WARNING
         */

        const redFlagStation =
            alerts.find(
                function (
                    station
                ) {

                    return (
                        station.redFlag ===
                        true
                    );

                }
            );


        if (
            redFlagStation
        ) {

            return {

                status:
                    'prohibited',

                reason:

                    'Active NWS Red Flag Warning at ' +
                    redFlagStation.name,

                source:
                    'National Weather Service',

                requiredDataMissing:
                    requiredDataMissing,

                droughtLevel:
                    districtDroughtLevel,

                droughtLabel:
                    districtDroughtLabel,

                droughtStation:
                    districtDroughtStation,

                droughtDataDate:
                    droughtDataDate,

                droughtStations:
                    droughtStations,

                alerts:
                    alerts,

                weatherStations:
                    weatherStations,

                errors:
                    errors,

                updated:
                    new Date(),

                engineVersion:
                    ENGINE_VERSION

            };

        }


        /*
         * 2. RMFPD DROUGHT POLICY
         *
         * ANY D3 OR D4 AT ANY MONITORED
         * POINT = PROHIBITED.
         *
         * This is an RMFPD website rule,
         * not a USDM-issued burn ban.
         */

        if (
            districtDroughtLevel >= 3
        ) {

            return {

                status:
                    'prohibited',

                reason:

                    districtDroughtLabel +
                    ' detected at ' +
                    districtDroughtStation,

                source:
                    'U.S. Drought Monitor / FEMA GIS',

                requiredDataMissing:
                    requiredDataMissing,

                droughtLevel:
                    districtDroughtLevel,

                droughtLabel:
                    districtDroughtLabel,

                droughtStation:
                    districtDroughtStation,

                droughtDataDate:
                    droughtDataDate,

                droughtStations:
                    droughtStations,

                alerts:
                    alerts,

                weatherStations:
                    weatherStations,

                errors:
                    errors,

                updated:
                    new Date(),

                engineVersion:
                    ENGINE_VERSION

            };

        }


        /* =====================================
           CAUTION SIGNALS
           =====================================

           IMPORTANT:

           A VERIFIED CAUTION signal outranks
           UNAVAILABLE.

           Example:
           One station fails to load but another
           clearly reports a Fire Weather Watch.

           Result = CAUTION, not UNAVAILABLE.
           ===================================== */


        /*
         * 3. FIRE WEATHER WATCH
         */

        const fireWeatherWatchStation =
            alerts.find(
                function (
                    station
                ) {

                    return (
                        station.fireWeatherWatch ===
                        true
                    );

                }
            );


        if (
            fireWeatherWatchStation
        ) {

            return {

                status:
                    'caution',

                reason:

                    'Active NWS Fire Weather Watch at ' +
                    fireWeatherWatchStation.name,

                source:
                    'National Weather Service',

                requiredDataMissing:
                    requiredDataMissing,

                droughtLevel:
                    districtDroughtLevel,

                droughtLabel:
                    districtDroughtLabel,

                droughtStation:
                    districtDroughtStation,

                droughtDataDate:
                    droughtDataDate,

                droughtStations:
                    droughtStations,

                alerts:
                    alerts,

                weatherStations:
                    weatherStations,

                errors:
                    errors,

                updated:
                    new Date(),

                engineVersion:
                    ENGINE_VERSION

            };

        }


        /*
         * 4. D0 / D1 / D2
         */

        if (
            districtDroughtLevel >= 0
        ) {

            return {

                status:
                    'caution',

                reason:

                    districtDroughtLabel +
                    ' detected at ' +
                    districtDroughtStation,

                source:
                    'U.S. Drought Monitor / FEMA GIS',

                requiredDataMissing:
                    requiredDataMissing,

                droughtLevel:
                    districtDroughtLevel,

                droughtLabel:
                    districtDroughtLabel,

                droughtStation:
                    districtDroughtStation,

                droughtDataDate:
                    droughtDataDate,

                droughtStations:
                    droughtStations,

                alerts:
                    alerts,

                weatherStations:
                    weatherStations,

                errors:
                    errors,

                updated:
                    new Date(),

                engineVersion:
                    ENGINE_VERSION

            };

        }


        /*
         * 5. RH / WIND / GUST
         */

        for (
            const station
            of weatherStations
        ) {

            const screening =
                getWeatherConcern(
                    station
                );


            if (
                screening.concern
            ) {

                return {

                    status:
                        'caution',

                    reason:
                        screening.reason,

                    source:
                        'NWS forecast grid / RMFPD safety screening',

                    requiredDataMissing:
                        requiredDataMissing,

                    droughtLevel:
                        districtDroughtLevel,

                    droughtLabel:
                        districtDroughtLabel,

                    droughtStation:
                        districtDroughtStation,

                    droughtDataDate:
                        droughtDataDate,

                    droughtStations:
                        droughtStations,

                    alerts:
                        alerts,

                    weatherStations:
                        weatherStations,

                    errors:
                        errors,

                    updated:
                        new Date(),

                    engineVersion:
                        ENGINE_VERSION

                };

            }

        }


        /* =====================================
           REQUIRED DATA MISSING
           =====================================

           Only reached when no known
           PROHIBITED or CAUTION signal exists.
           ===================================== */

        if (
            requiredDataMissing
        ) {

            return {

                status:
                    'unavailable',

                reason:
                    'One or more required fire-weather data sources are unavailable',

                source:
                    'RMFPD Burn Status Engine',

                requiredDataMissing:
                    true,

                droughtLevel:
                    districtDroughtLevel,

                droughtLabel:
                    districtDroughtLabel,

                droughtStation:
                    districtDroughtStation,

                droughtDataDate:
                    droughtDataDate,

                droughtStations:
                    droughtStations,

                alerts:
                    alerts,

                weatherStations:
                    weatherStations,

                errors:
                    errors,

                updated:
                    new Date(),

                engineVersion:
                    ENGINE_VERSION

            };

        }


        /* =====================================
           ALLOWED

           THIS IS THE ONLY PATH TO GREEN.

           All required requests succeeded.
           No Red Flag Warning.
           No Fire Weather Watch.
           No D0-D4 drought.
           No RH/wind/gust concern.
           ===================================== */

        return {

            status:
                'allowed',

            reason:
                'All required monitored conditions are clear',

            source:
                'RMFPD Burn Status Engine',

            requiredDataMissing:
                false,

            droughtLevel:
                -1,

            droughtLabel:
                'NONE — No USDM Drought Category',

            droughtStation:
                null,

            droughtDataDate:
                droughtDataDate,

            droughtStations:
                droughtStations,

            alerts:
                alerts,

            weatherStations:
                weatherStations,

            errors:
                [],

            updated:
                new Date(),

            engineVersion:
                ENGINE_VERSION

        };

    }


    /* =========================================
       OVERALL ENGINE TIMEOUT
       ========================================= */

    function engineTimeoutResult() {

        return new Promise(
            function (
                resolve
            ) {

                setTimeout(
                    function () {

                        resolve({

                            status:
                                'unavailable',

                            reason:
                                'Fire-weather data request timed out',

                            source:
                                'RMFPD Burn Status Engine',

                            requiredDataMissing:
                                true,

                            errors: [
                                'Overall engine timeout'
                            ],

                            updated:
                                new Date(),

                            engineVersion:
                                ENGINE_VERSION

                        });

                    },
                    ENGINE_TIMEOUT
                );

            }
        );

    }


    /* =========================================
       RUN ENGINE
       ========================================= */

    try {


        /*
         * Emergency manual PROHIBITED
         * immediately outranks automation.
         */

        if (
            MANUAL_OVERRIDE ===
            'prohibited'
        ) {

            displayResult({

                status:
                    'prohibited',

                reason:
                    'RMFPD manual prohibition',

                source:
                    'RMFPD Manual Override',

                manualOverride:
                    true,

                updated:
                    new Date(),

                engineVersion:
                    ENGINE_VERSION

            });


            return;

        }


        let result =
            await Promise.race([

                runAutomaticEngine(),

                engineTimeoutResult()

            ]);


        /*
         * Manual CAUTION establishes a
         * minimum status of CAUTION.
         *
         * It does NOT downgrade PROHIBITED.
         */

        if (
            MANUAL_OVERRIDE ===
            'caution' &&
            result.status !==
            'prohibited'
        ) {

            result.status =
                'caution';


            result.reason =
                'RMFPD manual caution';


            result.source =
                'RMFPD Manual Override';


            result.manualOverride =
                true;

        }


        displayResult(
            result
        );

    }


    catch (
        error
    ) {

        displayResult({

            status:
                'unavailable',

            reason:
                'Fire-weather status system unavailable',

            source:
                'RMFPD Burn Status Engine',

            requiredDataMissing:
                true,

            errors: [

                error &&
                error.message
                    ?
                    error.message
                    :
                    String(
                        error
                    )

            ],

            updated:
                new Date(),

            engineVersion:
                ENGINE_VERSION

        });

    }

})();

</script>/* End custom CSS */
/* Start custom CSS for container, class: .elementor-element-cb10524 */.elementor-901 .elementor-element.elementor-element-cb10524 {
    position: relative;
}

.elementor-901 .elementor-element.elementor-element-cb10524::after {
    content: "";
    position: absolute;
    inset: 0;
    box-shadow: inset 0 -2px 4px rgba(0, 0, 0, 0.15);
    pointer-events: none;
    z-index: 999;
}/* End custom CSS */
/* Start custom CSS for container, class: .elementor-element-3e7682a */.elementor-901 .elementor-element.elementor-element-3e7682a::after {
    content: "";
    position: absolute;
    inset: 0;
    box-shadow: inset 0 -2px 4px rgba(0, 0, 0, 0.15);
    pointer-events: none;
    z-index: 999;
}/* End custom CSS */