<!DOCTYPE html>

<!--
  Copyright 2018 The Chromium Authors. All rights reserved.
  Use of this source code is governed by a BSD-style license that can be
  found in the LICENSE file.
-->

<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <!-- Note: This tag is replaced when served through DDS! -->
  <base href="/">

  <title></title>
  <link href="favicon.png" rel="icon" sizes="64x64">

  <!-- Global site tag (gtag.js) - Google Analytics -->
  <script>
    // The value of DEVTOOLS_GOOGLE_TAG_ID here must match the value of the '?id='
    // query parameter below in the 'https://www.googletagmanager.com' script.
    // This is the value of the "Dart DevTools - GA4" Google Tag, which is linked
    // to the DevTools GA4 analytics property.
    const DEVTOOLS_GOOGLE_TAG_ID = 'G-69MPZE94D5'; // 

    function getDevToolsPropertyID() {
      return DEVTOOLS_GOOGLE_TAG_ID;
    }
  </script>
  <!-- The below URI ?id= must match the DEVTOOLS_GOOGLE_TAG_ID above. -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=G-69MPZE94D5"></script>
  <script src="devtools_analytics.js"></script>
  <!-- End of DevTools Google Analytics -->

  <!-- DO NOT REMOVE: -->
  <!-- OBSERVER SCRIPT PLACEHOLDER -->

  <script>
    function supportsES6Classes() {
      "use strict";
      try { eval("class Foo {}"); }
      catch (e) { return false; }
      return true;
    }

    if (!supportsES6Classes()) {
      window.location.href = '/unsupported-browser.html';
    }
  </script>

  <script>
    // The value below is injected by flutter build, do not touch.
    var serviceWorkerVersion = null;
  </script>
  <!-- This script adds the flutter initialization JS code -->
  <script src="flutter.js" defer></script> 

  <!-- TODO(elliette): Remove once https://github.com/flutter/flutter/issues/122541 is fixed. -->
  <link rel="stylesheet" href="styles.css">

</head>

<body>

  <script>
    // Unregister the old custom DevTools service worker (if it exists). It was
    // removed in: https://github.com/flutter/devtools/pull/5331
    function unregisterDevToolsServiceWorker() {
      if ('serviceWorker' in navigator) {
        const DEVTOOLS_SW = 'service_worker.js';
        const FLUTTER_SW = 'flutter_service_worker.js';
        navigator.serviceWorker.getRegistrations().then(function(registrations) {
            for (let registration of registrations) {
                const activeWorker = registration.active;
                if (activeWorker != null) {
                    const url = activeWorker.scriptURL;
                    if (url.includes(DEVTOOLS_SW) && !url.includes(FLUTTER_SW)) {
                        registration.unregister();
                    }
                }
            }
        });
      }
    }

    // Bootstrap app for 3P environments:
    function bootstrapAppFor3P() {
      window.addEventListener('load', function(ev) {
        // Download main.dart.js
        _flutter.loader.loadEntrypoint({
          serviceWorker: {
            serviceWorkerVersion: serviceWorkerVersion,
          },
          onEntrypointLoaded: function(engineInitializer) {
            engineInitializer.initializeEngine({
              renderer: 'canvaskit',
              canvasKitBaseUrl: 'canvaskit/'
            })
            .then(function(appRunner) {
              appRunner.runApp();
            });
          }
        });
      });
    }

    // Bootstrap app for 1P environments:
    function bootstrapAppFor1P() {
      window.addEventListener('load', function(ev) {
        // Download main.dart.js
        _flutter.loader.loadEntrypoint({
          entrypointUrl: 'main.dart.js',
          onEntrypointLoaded: function(engineInitializer) {
            engineInitializer.initializeEngine({
              renderer: 'canvaskit',
            })
            .then(function(appRunner) {
              appRunner.runApp();
            });
          }
        });
      });
    }

    unregisterDevToolsServiceWorker();
    bootstrapAppFor3P();
  </script>
</body>

</html>
