<!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>
    const GA_DEVTOOLS_PROPERTY = 'UA-26406144-34'; // Dart DevTools GA Property UA.

    function getDevToolsPropertyID() {
      return GA_DEVTOOLS_PROPERTY;
    }
  </script>
  <!-- The below URI ?id= must match the GA_DEVTOOLS_PROPERTY above. -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-26406144-34"></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> 

</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({
          onEntrypointLoaded: function(engineInitializer) {
            engineInitializer.initializeEngine({
              renderer: 'canvaskit',
            })
            .then(function(appRunner) {
              appRunner.runApp();
            });
          }
        });
      });
    }

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

</html>
