{"version":3,"sources":["vendor/ember-cli/app-prefix.js","crimeisdown/adapters/application.js","crimeisdown/app.js","crimeisdown/component-managers/glimmer.js","crimeisdown/components/alert.js","crimeisdown/components/app-footer.js","crimeisdown/components/app-header.js","crimeisdown/components/audio-range-export.js","crimeisdown/components/audio-search.js","crimeisdown/components/directives-list.js","crimeisdown/components/ember-flatpickr.js","crimeisdown/components/fa-icon.js","crimeisdown/components/icecast-player.js","crimeisdown/components/incident-map.js","crimeisdown/components/media-player.js","crimeisdown/components/notification-channel-form.js","crimeisdown/components/notification-channel-list.js","crimeisdown/components/notification-settings.js","crimeisdown/components/notification-subscription-form.js","crimeisdown/components/notification-subscription-list.js","crimeisdown/components/pell-editor.js","crimeisdown/components/sandbox.js","crimeisdown/components/search-radioids.js","crimeisdown/components/search-ucrcodes.js","crimeisdown/components/settings.js","crimeisdown/components/stream-player.js","crimeisdown/components/transcript-search.js","crimeisdown/components/virtual-scanner.js","crimeisdown/container-debug-adapter.js","crimeisdown/controllers/audio.js","crimeisdown/data-adapter.js","crimeisdown/helpers/-base.js","crimeisdown/helpers/and.js","crimeisdown/helpers/app-version.js","crimeisdown/helpers/cancel-all.js","crimeisdown/helpers/eq.js","crimeisdown/helpers/gt.js","crimeisdown/helpers/gte.js","crimeisdown/helpers/includes.js","crimeisdown/helpers/is-after.js","crimeisdown/helpers/is-array.js","crimeisdown/helpers/is-before.js","crimeisdown/helpers/is-between.js","crimeisdown/helpers/is-empty.js","crimeisdown/helpers/is-equal.js","crimeisdown/helpers/is-same-or-after.js","crimeisdown/helpers/is-same-or-before.js","crimeisdown/helpers/is-same.js","crimeisdown/helpers/json.js","crimeisdown/helpers/lt.js","crimeisdown/helpers/lte.js","crimeisdown/helpers/moment-add.js","crimeisdown/helpers/moment-calendar.js","crimeisdown/helpers/moment-diff.js","crimeisdown/helpers/moment-duration.js","crimeisdown/helpers/moment-format.js","crimeisdown/helpers/moment-from-now.js","crimeisdown/helpers/moment-from.js","crimeisdown/helpers/moment-subtract.js","crimeisdown/helpers/moment-to-date.js","crimeisdown/helpers/moment-to-now.js","crimeisdown/helpers/moment-to.js","crimeisdown/helpers/moment.js","crimeisdown/helpers/not-eq.js","crimeisdown/helpers/not.js","crimeisdown/helpers/now.js","crimeisdown/helpers/or.js","crimeisdown/helpers/page-title.js","crimeisdown/helpers/perform.js","crimeisdown/helpers/pluralize.js","crimeisdown/helpers/route-idle.js","crimeisdown/helpers/task.js","crimeisdown/helpers/unix.js","crimeisdown/helpers/utc.js","crimeisdown/helpers/xor.js","crimeisdown/initializers/app-version.js","crimeisdown/initializers/ember-data.js","crimeisdown/instance-initializers/ember-router-scroll.js","crimeisdown/instance-initializers/sentry-performance.js","crimeisdown/metrics-adapters/base.js","crimeisdown/metrics-adapters/google-analytics-four.js","crimeisdown/metrics-adapters/google-analytics.js","crimeisdown/models/notification-channel.js","crimeisdown/models/saved-search.js","crimeisdown/models/search-talkgroup.js","crimeisdown/models/transcript-subscription.js","crimeisdown/modifiers/did-insert.js","crimeisdown/modifiers/did-update.js","crimeisdown/modifiers/react.js","crimeisdown/modifiers/will-destroy.js","crimeisdown/router.js","crimeisdown/routes/airshow.js","crimeisdown/routes/application.js","crimeisdown/routes/archiveplayer.js","crimeisdown/routes/audio-live.js","crimeisdown/routes/audio.js","crimeisdown/routes/directives.js","crimeisdown/routes/guide.js","crimeisdown/routes/index.js","crimeisdown/routes/map-transcripts.js","crimeisdown/routes/map.js","crimeisdown/routes/not-found.js","crimeisdown/routes/notifications.js","crimeisdown/routes/sandbox.js","crimeisdown/routes/search-transcripts.js","crimeisdown/routes/settings.js","crimeisdown/routes/sirens.js","crimeisdown/serializers/application.js","crimeisdown/services/address-lookup.js","crimeisdown/services/config.js","crimeisdown/services/metrics.js","crimeisdown/services/moment.js","crimeisdown/services/page-title.js","crimeisdown/services/router-scroll.js","crimeisdown/services/session.js","crimeisdown/services/store.js","crimeisdown/templates/airshow.js","crimeisdown/templates/application.js","crimeisdown/templates/archiveplayer.js","crimeisdown/templates/audio-live.js","crimeisdown/templates/audio.js","crimeisdown/templates/components/alert.js","crimeisdown/templates/components/app-footer.js","crimeisdown/templates/components/app-header.js","crimeisdown/templates/components/audio-range-export.js","crimeisdown/templates/components/audio-search.js","crimeisdown/templates/components/directives-list.js","crimeisdown/templates/components/incident-map.js","crimeisdown/templates/components/map-tools.js","crimeisdown/templates/components/media-player.js","crimeisdown/templates/components/notification-channel-form.js","crimeisdown/templates/components/notification-channel-list.js","crimeisdown/templates/components/notification-settings.js","crimeisdown/templates/components/notification-subscription-form.js","crimeisdown/templates/components/notification-subscription-list.js","crimeisdown/templates/components/search-radioids.js","crimeisdown/templates/components/search-ucrcodes.js","crimeisdown/templates/components/settings.js","crimeisdown/templates/components/stream-player.js","crimeisdown/templates/components/transcript-search.js","crimeisdown/templates/components/virtual-scanner.js","crimeisdown/templates/directives.js","crimeisdown/templates/guide.js","crimeisdown/templates/index.js","crimeisdown/templates/map-transcripts.js","crimeisdown/templates/map.js","crimeisdown/templates/not-found.js","crimeisdown/templates/notifications.js","crimeisdown/templates/sandbox.js","crimeisdown/templates/search-transcripts.js","crimeisdown/templates/settings.js","crimeisdown/templates/sirens.js","crimeisdown/transforms/boolean.js","crimeisdown/transforms/date.js","crimeisdown/transforms/number.js","crimeisdown/transforms/string.js","crimeisdown/utils/audio-feed-config.js","vendor/ember-cli/app-suffix.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["'use strict';\n\n\n","define(\"crimeisdown/adapters/application\", [\"exports\", \"@ember-data/adapter/rest\", \"@ember/service\"], function (_exports, _rest, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/adapter/rest\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let ApplicationAdapter = _exports.default = (_class = class ApplicationAdapter extends _rest.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"config\", _descriptor, this);\n      _defineProperty(this, \"namespace\", 'api');\n    }\n    get host() {\n      return this.config.get('API_BASE_URL');\n    }\n    get headers() {\n      return {\n        Accept: 'application/json',\n        'X-XSRF-TOKEN': decodeURIComponent(document.cookie.split('; ').find(row => row.startsWith('XSRF-TOKEN='))?.split('=')[1])\n      };\n    }\n    ajaxOptions() {\n      const options = super.ajaxOptions(...arguments);\n      options.credentials = 'include';\n      return options;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/app\", [\"exports\", \"@ember/application\", \"ember-resolver\", \"ember-load-initializers\", \"crimeisdown/config/environment\", \"@sentry/ember\"], function (_exports, _application, _emberResolver, _emberLoadInitializers, _environment, Sentry) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/application\",0,\"ember-resolver\",0,\"ember-load-initializers\",0,\"crimeisdown/config/environment\",0,\"@sentry/ember\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); } /*eslint-disable no-console*/\n  Sentry.init({\n    dsn: 'https://fc1365bf53c34718b4674383752e1080@o71971.ingest.sentry.io/154438',\n    enabled: _environment.default.environment === 'production',\n    environment: _environment.default.environment,\n    denyUrls: ['platform.twitter.com'],\n    release: _environment.default.APP.version,\n    tracesSampleRate: 0.1,\n    browserTracingOptions: {\n      tracePropagationTargets: ['localhost', 'crimeisdown.com', 'api.crimeisdown.com', /^\\//]\n    },\n    replaysSessionSampleRate: 0.1,\n    replaysOnErrorSampleRate: 1.0,\n    integrations: [new Sentry.Replay({\n      maskAllText: false,\n      maskAllInputs: false,\n      blockAllMedia: false\n    })],\n    beforeSend(event, hint) {\n      const error = hint.originalException;\n      if (error && error.message && error.message.match(/The play\\(\\) request was interrupted by a call to pause\\(\\)/i)) {\n        return null;\n      }\n      return event;\n    }\n  });\n  class App extends _application.default {\n    constructor(...args) {\n      super(...args);\n      _defineProperty(this, \"modulePrefix\", _environment.default.modulePrefix);\n      _defineProperty(this, \"podModulePrefix\", _environment.default.podModulePrefix);\n      _defineProperty(this, \"Resolver\", _emberResolver.default);\n    }\n  }\n  _exports.default = App;\n  (0, _emberLoadInitializers.default)(App, _environment.default.modulePrefix);\n});","define(\"crimeisdown/component-managers/glimmer\", [\"exports\", \"@glimmer/component/-private/ember-component-manager\"], function (_exports, _emberComponentManager) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberComponentManager.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component/-private/ember-component-manager\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/components/alert\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\"], function (_exports, _component, _tracking, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/object\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let Alert = _exports.default = (_class = class Alert extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"hasSeenAlert\", _descriptor, this);\n      try {\n        this.hasSeenAlert = localStorage.getItem(`alert-${this.args.key}`) ? true : false;\n      } catch {\n        // No localStorage\n      }\n    }\n    dismiss() {\n      try {\n        localStorage.setItem(`alert-${this.args.key}`, true);\n      } catch (e) {\n        return false;\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"hasSeenAlert\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"dismiss\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"dismiss\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/app-footer\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\"], function (_exports, _component, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let AppFooter = _exports.default = (_class = class AppFooter extends _component.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"currentYear\", _descriptor, this);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"currentYear\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return new Date().getFullYear();\n    }\n  }), _class);\n});","define(\"crimeisdown/components/app-header\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/service\"], function (_exports, _component, _tracking, _object, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/object\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let AppHeader = _exports.default = (_class = class AppHeader extends _component.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"config\", _descriptor, this);\n      _initializerDefineProperty(this, \"session\", _descriptor2, this);\n      _initializerDefineProperty(this, \"playmusic\", _descriptor3, this);\n    }\n    togglemusic() {\n      (0, _object.set)(this, 'playmusic', !this.playmusic);\n      let audioElem = document.getElementById('copstheme');\n      if (this.playmusic) {\n        audioElem.volume = 0.3;\n        audioElem.play();\n      } else {\n        audioElem.pause();\n      }\n    }\n\n    /*!\n     * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)\n     * Copyright 2011-2022 The Bootstrap Authors\n     * Licensed under the Creative Commons Attribution 3.0 Unported License.\n     */\n    initThemeToggle() {\n      let storedTheme = null;\n      try {\n        storedTheme = localStorage.getItem('theme');\n        // eslint-disable-next-line no-empty\n      } catch {}\n      const getPreferredTheme = () => {\n        if (storedTheme) {\n          return storedTheme;\n        }\n        return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n      };\n      const setTheme = function (theme) {\n        if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n          document.documentElement.setAttribute('data-bs-theme', 'dark');\n        } else {\n          document.documentElement.setAttribute('data-bs-theme', theme);\n        }\n      };\n      setTheme(getPreferredTheme());\n      const showActiveTheme = theme => {\n        const activeThemeIcon = document.querySelector('.theme-icon-active use');\n        const btnToActive = document.querySelector(`[data-bs-theme-value=\"${theme}\"]`);\n        const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href');\n        document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n          element.classList.remove('active');\n        });\n        btnToActive.classList.add('active');\n        activeThemeIcon.setAttribute('href', svgOfActiveBtn);\n      };\n      window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n        if (storedTheme !== 'light' || storedTheme !== 'dark') {\n          setTheme(getPreferredTheme());\n        }\n      });\n      showActiveTheme(getPreferredTheme());\n      document.querySelectorAll('[data-bs-theme-value]').forEach(toggle => {\n        toggle.addEventListener('click', () => {\n          const theme = toggle.getAttribute('data-bs-theme-value');\n          localStorage.setItem('theme', theme);\n          setTheme(theme);\n          showActiveTheme(theme);\n        });\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"session\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"playmusic\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"togglemusic\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"togglemusic\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"initThemeToggle\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initThemeToggle\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/audio-range-export\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/service\", \"@ember/object\", \"moment-timezone\", \"crimeisdown/utils/audio-feed-config\"], function (_exports, _component, _tracking, _service, _object, _momentTimezone, _audioFeedConfig) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor0, _descriptor1, _descriptor10, _descriptor11, _descriptor12, _descriptor13;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/service\",0,\"@ember/object\",0,\"moment-timezone\",0,\"crimeisdown/utils/audio-feed-config\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const LOCAL_TZ = 'America/Chicago';\n  const DATE_INPUT_FORMAT = 'M/D/YYYY h:mm A';\n  const DATE_API_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n  const COMMANDER_CHECKOUT_URL = 'https://www.patreon.com/checkout/EricTendian/1260099';\n  let AudioRangeExportComponent = _exports.default = (_class = class AudioRangeExportComponent extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"config\", _descriptor, this);\n      _initializerDefineProperty(this, \"session\", _descriptor2, this);\n      _initializerDefineProperty(this, \"authReady\", _descriptor3, this);\n      _initializerDefineProperty(this, \"selectedFeed\", _descriptor4, this);\n      _initializerDefineProperty(this, \"startDate\", _descriptor5, this);\n      _initializerDefineProperty(this, \"endDate\", _descriptor6, this);\n      _initializerDefineProperty(this, \"isSubmitting\", _descriptor7, this);\n      _initializerDefineProperty(this, \"createError\", _descriptor8, this);\n      _initializerDefineProperty(this, \"jobId\", _descriptor9, this);\n      _initializerDefineProperty(this, \"status\", _descriptor0, this);\n      _initializerDefineProperty(this, \"requestedHours\", _descriptor1, this);\n      _initializerDefineProperty(this, \"processedHours\", _descriptor10, this);\n      _initializerDefineProperty(this, \"missingHours\", _descriptor11, this);\n      _initializerDefineProperty(this, \"downloadUrl\", _descriptor12, this);\n      _initializerDefineProperty(this, \"jobError\", _descriptor13, this);\n      _defineProperty(this, \"pollHandle\", null);\n      _defineProperty(this, \"feeds\", _audioFeedConfig.feeds);\n      _defineProperty(this, \"encryptedZones\", _audioFeedConfig.encryptedZones);\n      _defineProperty(this, \"startPickerOptions\", {\n        enableTime: true,\n        minuteIncrement: 60,\n        dateFormat: 'n/j/Y h:i K'\n      });\n      _defineProperty(this, \"endPickerOptions\", {\n        enableTime: true,\n        minuteIncrement: 60,\n        dateFormat: 'n/j/Y h:i K'\n      });\n      this.startDate = _momentTimezone.default.tz(LOCAL_TZ).subtract(2, 'hours').startOf('hour').toDate();\n      this.endDate = _momentTimezone.default.tz(LOCAL_TZ).subtract(1, 'hours').startOf('hour').toDate();\n    }\n    willDestroy(...args) {\n      this.stopPolling();\n      super.willDestroy(...args);\n    }\n    get canUseRangeExport() {\n      const user = this.session.user;\n      return Boolean(this.session.isAuthenticated && user && (user.is_admin || (user.patreon_tier?.rate ?? 0) >= 50));\n    }\n    get loginUrl() {\n      return `${this.config.get('API_BASE_URL')}/auth/redirect`;\n    }\n    get commanderCheckoutUrl() {\n      return COMMANDER_CHECKOUT_URL;\n    }\n    get submitDisabled() {\n      return this.isSubmitting || !this.canUseRangeExport;\n    }\n    get hasJobResult() {\n      return Boolean(this.jobId);\n    }\n    get statusBadgeClass() {\n      switch (this.status) {\n        case 'succeeded':\n          return 'text-bg-success';\n        case 'failed':\n          return 'text-bg-danger';\n        case 'processing':\n          return 'text-bg-warning';\n        default:\n          return 'text-bg-secondary';\n      }\n    }\n    async initialize() {\n      if (this.authReady) {\n        return;\n      }\n      await this.session.authenticated;\n      this.authReady = true;\n    }\n    async submit(event) {\n      event.preventDefault();\n      this.resetMessages();\n      await this.initialize();\n      if (!this.canUseRangeExport) {\n        this.createError = 'Only Commander tier and above can request merged range exports.';\n        return;\n      }\n      const {\n        payload,\n        error\n      } = this.buildPayload(event.target);\n      if (error) {\n        this.createError = error;\n        return;\n      }\n      this.isSubmitting = true;\n      this.stopPolling();\n      this.resetJobState();\n      try {\n        const xsrfToken = await this.ensureXsrfToken();\n        const response = await window.fetch(`${this.config.get('API_BASE_URL')}/api/audio-range-exports`, {\n          ...this.session.fetchOptions,\n          method: 'POST',\n          headers: {\n            ...this.session.fetchOptions.headers,\n            ...(xsrfToken ? {\n              'X-XSRF-TOKEN': xsrfToken\n            } : {}),\n            'Content-Type': 'application/json'\n          },\n          body: JSON.stringify(payload)\n        });\n        if (response.status !== 202) {\n          this.createError = await this.readErrorMessage(response);\n          return;\n        }\n        const data = await response.json();\n        this.jobId = data.id;\n        this.status = data.status;\n        this.requestedHours = data.requested_hours;\n        this.processedHours = 0;\n        this.startPolling(data.status_url);\n      } catch (e) {\n        this.createError = e.message || 'Could not create range export.';\n      } finally {\n        this.isSubmitting = false;\n      }\n    }\n    buildPayload(form) {\n      const rawFeed = form.elements.feed?.value?.trim();\n      const rawStart = form.elements.start_datetime?.value?.trim();\n      const rawEnd = form.elements.end_datetime?.value?.trim();\n      if (!rawFeed || !rawStart || !rawEnd) {\n        return {\n          error: 'Feed, start time, and end time are required.'\n        };\n      }\n      const start = _momentTimezone.default.tz(rawStart, DATE_INPUT_FORMAT, true, LOCAL_TZ);\n      const end = _momentTimezone.default.tz(rawEnd, DATE_INPUT_FORMAT, true, LOCAL_TZ);\n      if (!start.isValid() || !end.isValid()) {\n        return {\n          error: `Datetime must match format ${DATE_INPUT_FORMAT}.`\n        };\n      }\n      if (!end.isAfter(start)) {\n        return {\n          error: 'End time must be after start time.'\n        };\n      }\n      if (start.minutes() !== 0 || start.seconds() !== 0 || end.minutes() !== 0 || end.seconds() !== 0) {\n        return {\n          error: 'Start and end times must be hour-aligned (mm:ss = 00:00).'\n        };\n      }\n      if (end.diff(start, 'hours', true) > 24) {\n        return {\n          error: 'Time range must be 24 hours or less.'\n        };\n      }\n      const cutoff = this.encryptedZones[rawFeed];\n      let broadcastify = false;\n      if (cutoff) {\n        const cutoffMoment = _momentTimezone.default.tz(cutoff, DATE_API_FORMAT, true, LOCAL_TZ);\n        if (start.isBefore(cutoffMoment) && end.isAfter(cutoffMoment)) {\n          return {\n            error: 'This range crosses the encrypted cutover time. Please split it into two separate exports.'\n          };\n        }\n        broadcastify = start.isSameOrAfter(cutoffMoment);\n      }\n      return {\n        payload: {\n          feed: rawFeed,\n          start_datetime: start.format(DATE_API_FORMAT),\n          end_datetime: end.format(DATE_API_FORMAT),\n          broadcastify\n        }\n      };\n    }\n    startPolling(statusUrl) {\n      const endpoint = this.normalizeStatusUrl(statusUrl);\n      this.stopPolling();\n      const poll = async () => {\n        try {\n          const response = await window.fetch(endpoint, this.session.fetchOptions);\n          if (response.status !== 200) {\n            this.status = 'failed';\n            this.jobError = await this.readErrorMessage(response);\n            this.stopPolling();\n            return;\n          }\n          const data = await response.json();\n          this.status = data.status;\n          this.requestedHours = data.requested_hours;\n          this.processedHours = data.processed_hours;\n          this.missingHours = data.missing_hours || [];\n          this.downloadUrl = data.download_url || null;\n          this.jobError = data.error || '';\n          if (this.status === 'succeeded' || this.status === 'failed') {\n            this.stopPolling();\n          }\n        } catch (e) {\n          this.status = 'failed';\n          this.jobError = e.message || 'Could not fetch export status.';\n          this.stopPolling();\n        }\n      };\n      poll();\n      this.pollHandle = window.setInterval(poll, 5000);\n    }\n    stopPolling() {\n      if (!this.pollHandle) {\n        return;\n      }\n      window.clearInterval(this.pollHandle);\n      this.pollHandle = null;\n    }\n    normalizeStatusUrl(statusUrl) {\n      const baseUrl = this.config.get('API_BASE_URL');\n      if (!statusUrl) {\n        return `${baseUrl}/api/audio-range-exports/${this.jobId}`;\n      }\n      if (statusUrl.startsWith('http://') || statusUrl.startsWith('https://')) {\n        return statusUrl;\n      }\n      return `${baseUrl}${statusUrl}`;\n    }\n    getXsrfToken() {\n      const token = document.cookie.split('; ').find(row => row.startsWith('XSRF-TOKEN='))?.split('=')[1];\n      if (!token) {\n        return null;\n      }\n      return decodeURIComponent(token);\n    }\n    async ensureXsrfToken() {\n      let token = this.getXsrfToken();\n      if (token) {\n        return token;\n      }\n      try {\n        await window.fetch(`${this.config.get('API_BASE_URL')}/sanctum/csrf-cookie`, {\n          headers: {\n            Accept: 'application/json'\n          },\n          credentials: 'include'\n        });\n      } catch {\n        // Fall through and try existing cookie value again.\n      }\n      token = this.getXsrfToken();\n      return token;\n    }\n    async readErrorMessage(response) {\n      try {\n        const contentType = response.headers.get('content-type') || '';\n        if (contentType.includes('application/json')) {\n          const data = await response.json();\n          if (data.message) {\n            return data.message;\n          }\n          if (data.error) {\n            return data.error;\n          }\n          if (data.errors) {\n            return Object.values(data.errors).flat().join('\\n');\n          }\n        }\n        const text = await response.text();\n        if (text) {\n          return text;\n        }\n      } catch {\n        // fall through to generic error below\n      }\n      return `Request failed with status ${response.status}.`;\n    }\n    resetMessages() {\n      this.createError = '';\n      this.jobError = '';\n    }\n    resetJobState() {\n      this.jobId = null;\n      this.status = null;\n      this.requestedHours = null;\n      this.processedHours = 0;\n      this.missingHours = [];\n      this.downloadUrl = null;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"session\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"authReady\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"selectedFeed\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return '';\n    }\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"startDate\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _descriptor6 = _applyDecoratedDescriptor(_class.prototype, \"endDate\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _descriptor7 = _applyDecoratedDescriptor(_class.prototype, \"isSubmitting\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor8 = _applyDecoratedDescriptor(_class.prototype, \"createError\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return '';\n    }\n  }), _descriptor9 = _applyDecoratedDescriptor(_class.prototype, \"jobId\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _descriptor0 = _applyDecoratedDescriptor(_class.prototype, \"status\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _descriptor1 = _applyDecoratedDescriptor(_class.prototype, \"requestedHours\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _descriptor10 = _applyDecoratedDescriptor(_class.prototype, \"processedHours\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _descriptor11 = _applyDecoratedDescriptor(_class.prototype, \"missingHours\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor12 = _applyDecoratedDescriptor(_class.prototype, \"downloadUrl\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _descriptor13 = _applyDecoratedDescriptor(_class.prototype, \"jobError\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return '';\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"initialize\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initialize\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"submit\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"submit\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/audio-search\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"moment-timezone\", \"crimeisdown/utils/audio-feed-config\"], function (_exports, _component, _service, _object, _momentTimezone, _audioFeedConfig) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"moment-timezone\",0,\"crimeisdown/utils/audio-feed-config\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let AudioSearch = _exports.default = (_class = class AudioSearch extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"config\", _descriptor, this);\n      let options = {\n        enableTime: true,\n        minuteIncrement: 60,\n        dateFormat: 'n/j/Y h:i K'\n      };\n      options.defaultDate = _momentTimezone.default.tz('America/Chicago').subtract(1, 'hours').startOf('hour').toDate();\n      this.options = options;\n      this.encryptedZones = _audioFeedConfig.encryptedZones;\n      this.feeds = _audioFeedConfig.feeds;\n    }\n    submit(event) {\n      event.preventDefault();\n      let downloadUrl = this.config.get('API_BASE_URL') + '/recordings/download-audio';\n      const inputs = {};\n      for (const element of event.target.elements) {\n        if (element.name) {\n          inputs[element.name] = element.value;\n        }\n      }\n      let datetime = _momentTimezone.default.tz(inputs.datetime, 'M/D/YYYY h:mm A', 'America/Chicago');\n      if (Object.keys(this.encryptedZones).includes(inputs.feed) && datetime.isAfter(this.encryptedZones[inputs.feed])) {\n        inputs.broadcastify = 1;\n      }\n      inputs.datetime = datetime.utc().toISOString();\n      const queryParams = new URLSearchParams(inputs);\n      window.open(downloadUrl + '?' + queryParams.toString(), '_blank');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"submit\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"submit\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/directives-list\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"fetch\", \"jquery\"], function (_exports, _object, _service, _component, _fetch, _jquery) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"fetch\",0,\"jquery\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DirectivesList = _exports.default = (_class = class DirectivesList extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"metrics\", _descriptor, this);\n      (0, _fetch.default)('https://directives.crimeisdown.com/diff_list.json').then(response => {\n        let dateSorter = (a, b) => {\n          a = new Date(a);\n          b = new Date(b);\n          if (a > b) {\n            return 1;\n          }\n          if (a < b) {\n            return -1;\n          }\n          return 0;\n        };\n        response.json().then(directives => {\n          window.$('#directives').bootstrapTable({\n            columns: [{\n              field: 'link',\n              title: 'Directive Title',\n              sortable: true,\n              width: 40,\n              widthUnit: '%'\n            }, {\n              field: 'issue_date',\n              title: 'Issue Date',\n              sortable: true,\n              sorter: dateSorter,\n              width: 10,\n              widthUnit: '%'\n            }, {\n              field: 'effective_date',\n              title: 'Effective Date',\n              sortable: true,\n              sorter: dateSorter,\n              width: 10,\n              widthUnit: '%'\n            }, {\n              field: 'rescinds',\n              title: 'Rescinds',\n              sortable: true,\n              width: 20,\n              widthUnit: '%'\n            }, {\n              field: 'index_category',\n              title: 'Index Category',\n              sortable: true,\n              width: 20,\n              widthUnit: '%'\n            }],\n            data: directives,\n            sortName: 'issue_date',\n            sortOrder: 'desc',\n            onPostBody: () => {\n              (0, _jquery.default)('#directives').find('td > a').on('click', event => {\n                event.preventDefault();\n                this.openDirective((0, _jquery.default)(event.currentTarget).attr('href'), (0, _jquery.default)(event.currentTarget).text());\n              });\n              (0, _jquery.default)('#directiveViewer').find('#link').on('focus', event => {\n                (0, _jquery.default)(event.currentTarget).trigger('select');\n              });\n              (0, _jquery.default)('#switch-diff-view').on('click', () => {\n                // eslint-disable-next-line ember/jquery-ember-run\n                window.$('#primaryDiffView').toggle();\n                // eslint-disable-next-line ember/jquery-ember-run\n                window.$('#sideBySideView').toggle();\n                // eslint-disable-next-line ember/jquery-ember-run\n                window.$('.modal-dialog').toggleClass('modal-fullwidth');\n              });\n              if (window.location.hash) {\n                let path = window.location.hash.substring(1);\n                // Remove the hash\n                history.pushState('', document.title, window.location.pathname + window.location.search);\n                // Open the directive\n                let title = (0, _jquery.default)('#directives').find('td > a[href=\"https://directives.crimeisdown.com/diff/' + path + '\"]').text();\n                this.openDirective('https://directives.crimeisdown.com/diff/' + path, title);\n              }\n            }\n          });\n        });\n      });\n    }\n    submitFindDirectiveForm(event) {\n      event.preventDefault();\n      let url = new URL(document.getElementById('url').value);\n      let date = document.getElementById('date').value;\n      window.location.assign('https://directives.crimeisdown.com' + url.pathname + '?date=' + date);\n    }\n    openDirective(path, title) {\n      let modal = (0, _jquery.default)('#directiveViewer');\n      modal.find(' h4.modal-title').text(title);\n      modal.find('#directiveFrame').attr('src', path);\n      let url = new URL(path).pathname.replace('/diff/', '');\n      modal.find('#no-highlights-btn').attr('href', 'https://directives.crimeisdown.com/' + url);\n      modal.find('input#link').val(window.location + '#' + url);\n      let commit = url.substring(0, url.indexOf('/'));\n      url = path.replace('diff/' + commit + '/', '') + '?commit=' + commit;\n      modal.find('#oldVersion').attr('src', url + '^');\n      modal.find('#newVersion').attr('src', url);\n      const bsModal = new bootstrap.Modal(document.getElementById('directiveViewer'));\n      bsModal.show();\n      this.metrics.trackEvent({\n        category: 'Directive',\n        action: 'Opens directive',\n        label: title\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"metrics\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"submitFindDirectiveForm\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"submitFindDirectiveForm\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/ember-flatpickr\", [\"exports\", \"ember-flatpickr/components/ember-flatpickr\"], function (_exports, _emberFlatpickr) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberFlatpickr.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-flatpickr/components/ember-flatpickr\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/components/fa-icon\", [\"exports\", \"@fortawesome/ember-fontawesome/components/fa-icon\"], function (_exports, _faIcon) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _faIcon.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@fortawesome/ember-fontawesome/components/fa-icon\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/components/icecast-player\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _component2, _object, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/object\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div {{did-insert (fn this.initializePlayer @stream)}}>\n      <p><small>Please note it might take a few seconds for the audio to load once pressing play.</small></p>\n      <p id=\"icecast-metadata\"></p>\n      <audio id=\"icecast-audio\" controls>\n          Your browser does not support HTML5 audio.\n      </audio>\n      <table id=\"icecast-metadataQueue\"></table>\n  </div>\n  \n  */\n  {\n    \"id\": \"up9lGe6h\",\n    \"block\": \"[[[11,0],[4,[38,1],[[28,[37,2],[[30,0,[\\\"initializePlayer\\\"]],[30,1]],null]],null],[12],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"small\\\"],[12],[1,\\\"Please note it might take a few seconds for the audio to load once pressing play.\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[14,1,\\\"icecast-metadata\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"audio\\\"],[14,1,\\\"icecast-audio\\\"],[14,\\\"controls\\\",\\\"\\\"],[12],[1,\\\"\\\\n        Your browser does not support HTML5 audio.\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"table\\\"],[14,1,\\\"icecast-metadataQueue\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@stream\\\"],false,[\\\"div\\\",\\\"did-insert\\\",\\\"fn\\\",\\\"p\\\",\\\"small\\\",\\\"audio\\\",\\\"table\\\"]]\",\n    \"moduleName\": \"crimeisdown/components/icecast-player.hbs\",\n    \"isStrictMode\": false\n  });\n  let IcecastPlayerComponent = _exports.default = (_class = class IcecastPlayerComponent extends _component2.default {\n    initializePlayer(stream) {\n      const audioElement = document.getElementById('icecast-audio');\n      const metadataEl = document.getElementById('icecast-metadata');\n      const onMetadata = metadata => {\n        metadataEl.innerHTML = `<strong>Now Playing:</strong> ${metadata['StreamTitle']}`;\n      };\n      new IcecastMetadataPlayer(stream, {\n        audioElement,\n        //                  audio element in HTML\n        onMetadata,\n        //                    called when metadata is synced with the audio\n        metadataTypes: ['icy'],\n        //        detect ICY metadata\n        icyDetectionTimeout: 5000,\n        //     attempt to detect ICY metadata for 5 seconds\n        enableLogging: true,\n        //           enable error logs to the console\n        onError: message => {\n          metadataEl.innerHTML = message;\n        }\n      });\n    }\n  }, _applyDecoratedDescriptor(_class.prototype, \"initializePlayer\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initializePlayer\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, IcecastPlayerComponent);\n});","define(\"crimeisdown/components/incident-map\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"ember-lifeline\", \"@ember/service\", \"jquery\"], function (_exports, _component, _tracking, _object, _emberLifeline, _service, _jquery) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor0, _descriptor1;\n  /*eslint-disable no-unused-vars*/\n  /*global GeoSearch*/\n  /*global leafletPip*/\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/object\",0,\"ember-lifeline\",0,\"@ember/service\",0,\"jquery\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let IncidentMap = _exports.default = (_class = class IncidentMap extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"metrics\", _descriptor, this);\n      _initializerDefineProperty(this, \"addressLookup\", _descriptor2, this);\n      _defineProperty(this, \"map\", null);\n      _defineProperty(this, \"geocoder\", null);\n      _defineProperty(this, \"previousGeolocationMarker\", null);\n      _defineProperty(this, \"previousGeolocationCircle\", null);\n      _initializerDefineProperty(this, \"geolocationPending\", _descriptor3, this);\n      _initializerDefineProperty(this, \"baseLayers\", _descriptor4, this);\n      _initializerDefineProperty(this, \"layers\", _descriptor5, this);\n      _initializerDefineProperty(this, \"overlay\", _descriptor6, this);\n      _initializerDefineProperty(this, \"location\", _descriptor7, this);\n      _initializerDefineProperty(this, \"location_approximate\", _descriptor8, this);\n      _initializerDefineProperty(this, \"no_results\", _descriptor9, this);\n      _initializerDefineProperty(this, \"wazeIframeUrl\", _descriptor0, this);\n      _initializerDefineProperty(this, \"crimereportsIframeUrl\", _descriptor1, this);\n      L.Icon.Default.imagePath = '/assets/images/';\n    }\n    removePreviousGeoLocationMarkers() {\n      if (this.previousGeolocationMarker) {\n        this.previousGeolocationMarker.remove();\n      }\n      if (this.previousGeolocationCircle) {\n        this.previousGeolocationCircle.remove();\n      }\n    }\n    setGeoLocationMarkers(marker, circle) {\n      this.previousGeolocationMarker = marker;\n      this.previousGeolocationCircle = circle;\n    }\n    async searchAddress(event = null) {\n      if (event) {\n        event.preventDefault();\n      }\n      const fireStationResults = this.addressLookup.findStation(this.address);\n      if (fireStationResults.length) {\n        this.address = fireStationResults[0].addr + ' ' + fireStationResults[0].zip;\n      }\n      (0, _jquery.default)('.leaflet-control-geosearch form input').val(this.address);\n      (0, _jquery.default)('#address-search').find('input[name=\"address\"]').val(this.address);\n      const query = {\n        query: this.address\n      };\n      this.searchControl.resultList.clear();\n      const results = await this.geosearchProvider.search(query);\n      if (results && results.length > 0) {\n        this.no_results = false;\n        this.searchControl.showResult(results[0], query);\n      } else {\n        this.no_results = true;\n      }\n    }\n    locateMe() {\n      this.geolocationPending = true;\n\n      // Clear any form fields so it doesn't appear we are still using that address\n      (0, _jquery.default)('.leaflet-control-geosearch.bar form input').val('');\n      (0, _jquery.default)('#address-search').find('input[name=\"address\"]').val('');\n      this.map.locate({\n        setView: true,\n        maxZoom: 16\n      });\n      this.map.on('locationfound', e => {\n        this.removePreviousGeoLocationMarkers();\n        if (e.accuracy > 1000) {\n          alert('Warning: We were not able to determine a precise location, so your location results may be incorrect. Try a different device for better results.');\n        }\n        const radius = e.accuracy * 3.28084; // convert radius to feet\n\n        const marker = L.marker(e.latlng).addTo(this.map).bindPopup('You are within ' + radius.toPrecision(5) + ' feet of this point').openPopup();\n        const circle = L.circle(e.latlng, radius, {\n          fill: radius < 1000\n        }).addTo(this.map);\n        this.setGeoLocationMarkers(marker, circle);\n        this.showLocation({\n          location: {\n            raw: {\n              formatted_address: 'N/A - From device location',\n              geometry: {\n                location: {\n                  lat: () => e.latlng.lat,\n                  lng: () => e.latlng.lng\n                }\n              }\n            }\n          }\n        });\n        this.geolocationPending = false;\n      });\n      this.map.on('locationerror', e => {\n        alert(e.message + ' If you are on iOS, make sure to enable Location Services first.');\n        this.geolocationPending = false;\n      });\n    }\n    async initMap() {\n      const defaultCenterLat = 41.85;\n      const defaultCenterLong = -87.63;\n      const defaultZoom = 11;\n      this.map = L.map('leaflet-map', {\n        center: [defaultCenterLat, defaultCenterLong],\n        zoom: defaultZoom\n      });\n\n      // Initilize this first to put it above the layers control\n      this.initInfoBox();\n      L.Control.Layers.include({\n        getActiveOverlays: () => {\n          const active = [];\n          if (this.layersControl._layers) {\n            this.layersControl._layers.forEach(obj => {\n              if (obj.overlay && this.layersControl._map.hasLayer(obj.layer)) {\n                active.push(obj);\n              }\n            });\n          }\n          return active;\n        }\n      });\n      this.layersControl = new L.Control.Layers(undefined, undefined, {\n        collapsed: !window.matchMedia('(min-width: 768px)').matches\n      }).addTo(this.map);\n      L.streetView({\n        position: 'topleft',\n        google: true,\n        bing: false,\n        yandex: false,\n        mapillary: false,\n        openstreetcam: false,\n        mosatlas: false\n      }).addTo(this.map);\n      this.initBaseLayers();\n      this.initGeocoder();\n      this.initEditableMap();\n      await this.initLayers();\n      await this.addressLookup.loadData();\n      if (window.location.hash) {\n        const hash = window.location.hash.substring(1);\n        this.address = decodeURIComponent(hash.substring(hash.indexOf('location_query=')).split('&')[0].split('=')[1].replace(/\\+/g, ' '));\n        this.searchAddress();\n      }\n      const tabs = [document.getElementById('traffic-tab'), document.getElementById('crime-tab')];\n      for (const tabEl of tabs) {\n        tabEl.addEventListener('show.bs.tab', function (event) {\n          const iframe = document.getElementById(event.target.getAttribute('aria-controls')).getElementsByTagName('iframe')[0];\n          if (iframe.src != iframe.parentElement.getAttribute('data-src')) {\n            iframe.src = iframe.parentElement.getAttribute('data-src');\n          }\n        });\n      }\n    }\n    initBaseLayers() {\n      const mapbox = L.tileLayer('https://api.mapbox.com/styles/v1/erictendian/ciqn6pmjh0005bini99og1s6q/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1IjoiZXJpY3RlbmRpYW4iLCJhIjoiY2lvaXpvcDRnMDBkNHU1bTFvb2R1NjZjYiJ9.3vYfk1y5-F5MVQDdgaXwpA', {\n        attribution: '&copy; <a href=\"https://www.mapbox.com/about/maps/\">Mapbox</a> &copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>',\n        minZoom: 0,\n        maxZoom: 20\n      });\n      this.layersControl.addBaseLayer(mapbox, 'MapBox Streets');\n      const mapboxDark = L.tileLayer('https://api.mapbox.com/styles/v1/erictendian/cj9ne99zz3e112rp4pxcpua1z/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1IjoiZXJpY3RlbmRpYW4iLCJhIjoiY2lvaXpvcDRnMDBkNHU1bTFvb2R1NjZjYiJ9.3vYfk1y5-F5MVQDdgaXwpA', {\n        attribution: '&copy; <a href=\"https://www.mapbox.com/about/maps/\">Mapbox</a> &copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>',\n        minZoom: 0,\n        maxZoom: 20\n      });\n      this.layersControl.addBaseLayer(mapboxDark, 'MapBox Streets Dark');\n      if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n        mapboxDark.addTo(this.map);\n      } else {\n        mapbox.addTo(this.map);\n      }\n      this.layersControl.addBaseLayer(L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n        attribution: 'Map data &copy; <a href=\"http://openstreetmap.org\">OpenStreetMap</a> contributors, <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA</a>',\n        maxNativeZoom: 19,\n        minZoom: 0,\n        maxZoom: 20\n      }), 'OpenStreetMap');\n      this.layersControl.addBaseLayer(new L.gridLayer.googleMutant({\n        type: 'hybrid',\n        minZoom: 0,\n        maxZoom: 20\n      }), 'Google Hybrid');\n    }\n    buildCrimeMapUrl(address) {\n      return 'https://chicagopd.maps.arcgis.com/apps/webappviewer/index.html?id=96ca65e89cd54b8c808b136a66778369&find=' + encodeURIComponent(address);\n    }\n    async showLocation(event) {\n      this.no_results = false;\n      const query = this.address;\n      if (query) {\n        // We actually searched an address here, so don't show the geolocation marker anymore\n        this.removePreviousGeoLocationMarkers();\n        (0, _jquery.default)('#address-search').find('input[name=\"address\"]').val(query);\n        window.location.hash = '#location_query=' + encodeURIComponent(query);\n      }\n      this.metrics.trackEvent({\n        category: 'Tools',\n        action: 'Looks up address',\n        label: query || 'Geolocation'\n      });\n      this.location = await this.addressLookup.generateLocationDataForAddress(this.layers, event.location.raw);\n      this.location_approximate = ['RANGE_INTERPOLATED', 'APPROXIMATE'].includes(event.location.raw.geometry.location_type);\n      const randomInt = Math.round(Math.random() * 1000); // Without this, the iframe would not reload when we change locations\n      this.wazeIframeUrl = 'https://embed.waze.com/iframe?zoom=15&lat=' + this.location.meta.latitude + '&lon=' + this.location.meta.longitude + '&pin=1&_=' + randomInt;\n      if (this.location.meta.inChicago) {\n        this.crimereportsIframeUrl = this.buildCrimeMapUrl(this.location.meta.formattedAddress);\n        (0, _emberLifeline.scheduleTask)(this, 'actions', () => {\n          const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'));\n          tooltipTriggerList.map(function (tooltipTriggerEl) {\n            return new bootstrap.Tooltip(tooltipTriggerEl);\n          });\n        });\n      }\n    }\n    initGeocoder() {\n      this.geosearchProvider = new GeoSearch.LegacyGoogleProvider({\n        params: {\n          key: 'AIzaSyDrvC1g6VOozblroTwleGRz9SJDN82F_gE',\n          bounds: '41.6,-87.9|42,-87.5'\n        }\n      });\n      const searchControl = new GeoSearch.SearchControl({\n        provider: this.geosearchProvider,\n        style: 'button'\n      });\n      this.searchControl = searchControl;\n      this.map.addControl(searchControl);\n      this.map.on('geosearch/showlocation', this.showLocation.bind(this));\n    }\n    initLayers() {\n      this.layers = {\n        fireStations: {\n          label: 'Fire Stations',\n          layer: null,\n          url: '/data/city_data/fire_stations.json',\n          showByDefault: true\n        },\n        policeDistricts: {\n          label: 'Police Districts',\n          layer: null,\n          url: '/data/map_data/police_districts.geojson',\n          showByDefault: true,\n          propMappings: {\n            dist_num: 'Police District'\n          },\n          style: {\n            fill: true,\n            fillOpacity: 0.01,\n            color: '#00f',\n            weight: 3\n          }\n        },\n        policeBeats: {\n          label: 'Police Beats',\n          layer: null,\n          url: '/data/map_data/police_beats.geojson',\n          showByDefault: false,\n          propMappings: {\n            district: 'Police District',\n            beat_num: 'Police Beat'\n          },\n          style: {\n            fill: true,\n            fillOpacity: 0.05,\n            color: '#00f',\n            weight: 2\n          }\n        },\n        neighborhoods: {\n          label: 'Neighborhoods',\n          layer: null,\n          url: '/data/map_data/neighborhoods_v2.geojson',\n          showByDefault: false,\n          propMappings: {\n            PRI_NEIGH: 'Neighborhood'\n          },\n          style: {\n            fill: true,\n            fillOpacity: 0.05,\n            color: '#a00',\n            weight: 2\n          }\n        },\n        communityAreas: {\n          label: 'Community Areas',\n          layer: null,\n          url: '/data/map_data/community_areas.geojson',\n          showByDefault: false,\n          propMappings: {\n            community: 'Community Area'\n          },\n          style: {\n            fill: true,\n            fillOpacity: 0.05,\n            color: '#333',\n            weight: 3\n          }\n        },\n        wards: {\n          label: 'Wards',\n          layer: null,\n          url: '/data/map_data/wards_2023.geojson',\n          showByDefault: false,\n          propMappings: {\n            ward_id: 'Ward'\n          },\n          style: {\n            fill: true,\n            fillOpacity: 0.05,\n            color: '#030',\n            weight: 2\n          }\n        },\n        municipalities: {\n          label: 'Municipalities',\n          layer: null,\n          url: '/data/map_data/municipalities.geojson',\n          showByDefault: false,\n          propMappings: {\n            AGENCY_DESC: 'Jurisdiction'\n          },\n          style: {\n            fill: true,\n            fillOpacity: 0.05,\n            color: '#3A0',\n            weight: 2\n          }\n        },\n        gangs: {\n          label: 'Gangs (unofficial)',\n          layer: null,\n          // https://www.google.com/maps/d/kml?forcekml=1&mid=1am7PF0tT25EztnOTAgUEL2E382VjVTc7\n          url: '/data/map_data/gangs.kml',\n          showByDefault: false\n        }\n      };\n      return this.loadLayerData(this.layers);\n    }\n    async loadLayerData(layers) {\n      for (const layerName in layers) {\n        if (Object.prototype.hasOwnProperty.call(layers, layerName)) {\n          const layerObj = layers[layerName];\n          if (layerName === 'fireStations') {\n            const layerGroup = L.markerClusterGroup({\n              showCoverageOnHover: false\n            });\n            if (layerObj.showByDefault) {\n              layerGroup.addTo(this.map);\n            }\n            layerObj.layer = layerGroup;\n            this.layersControl.addOverlay(layerObj.layer, layerObj.label);\n            const data = await (await fetch(layerObj.url)).json();\n            data.forEach(location => {\n              const markerTitle = location.name ? location.name : [location.engine, location.truck, location.ambo, location.squad].filter(Boolean).join('-');\n              const stationMarker = L.marker([location.latitude, location.longitude], {\n                title: markerTitle,\n                icon: L.divIcon({\n                  iconSize: [35, 45],\n                  iconAnchor: [17, 42],\n                  popupAnchor: [1, -32],\n                  shadowAnchor: [10, 12],\n                  shadowSize: [36, 16],\n                  className: 'awesome-marker-icon-red awesome-marker',\n                  html: '<svg class=\"svg-inline--fa fa-fire-extinguisher\" data-prefix=\"fas\" data-icon=\"fire-extinguisher\" aria-hidden=\"true\" focusable=\"false\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\" style=\"color: #fff;font-size: 1rem;margin-top: 10px;\"><path fill=\"currentColor\" d=\"M500.3 7.3C507.7 13.3 512 22.4 512 32v96c0 9.6-4.3 18.7-11.7 24.7s-17.2 8.5-26.6 6.6l-160-32C301.5 124.9 292 115.7 289 104H224v34.8c37.8 18 64 56.5 64 101.2V384H64V240c0-44.7 26.2-83.2 64-101.2V110c-36.2 11.1-66 36.9-82.3 70.5c-5.8 11.9-20.2 16.9-32.1 11.1S-3.3 171.4 2.5 159.5C26.7 109.8 72.7 72.6 128 60.4V32c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32V56h65c3-11.7 12.5-20.9 24.7-23.4l160-32c9.4-1.9 19.1 .6 26.6 6.6zM288 416v32c0 35.3-28.7 64-64 64H128c-35.3 0-64-28.7-64-64V416H288zM176 96c8.8 0 16-7.2 16-16s-7.2-16-16-16s-16 7.2-16 16s7.2 16 16 16z\"></path></svg>'\n                })\n              });\n\n              // Convert address to title case\n              location.addr = location.addr.toLowerCase().replace(/(?:^|\\s|-|\\/)\\S/g, function (m) {\n                return m.toUpperCase();\n              });\n\n              // this is a really hacky way to make a popup, we should stop doing it\n              // @TODO: Use Handlebars template to make Leaflet popup\n              const popupContents = '<h6>' + markerTitle + '</h6>' + '<strong>' + location.addr + '</strong>' + (location.engine ? '<br><strong>Engine:</strong> ' + location.engine : '') + (location.truck ? '<br><strong>Truck/Tower:</strong> ' + location.truck : '') + (location.ambo ? '<br><strong>Ambulance:</strong> ' + location.ambo : '') + (location.squad ? '<br><strong>Squad:</strong> ' + location.squad : '') + (location.special ? '<br><strong>Special (search radio IDs):</strong> ' + location.special : '') + (location.batt ? '<br><strong>Battalion:</strong> ' + location.batt + ' / <strong>District:</strong> ' + location.fireDist : '') + (location.emsDist ? '<br><strong>EMS District:</strong> ' + location.emsDist : '') + (location.radio ? '<br><strong>Radio Channel:</strong> ' + location.radio : '');\n              stationMarker.bindPopup(popupContents).openPopup();\n              layerGroup.addLayer(stationMarker);\n            });\n          } else if (layerName === 'gangs') {\n            const kmlLayer = new L.KML();\n            this.map.attributionControl.addAttribution('Gang map by <a href=\"https://np.reddit.com/r/Chiraqology/wiki/index/gangmaps\" target=\"_blank\">u/ReggieG45</a>');\n            if (layerObj.showByDefault) {\n              kmlLayer.addTo(this.map);\n            }\n            layerObj.layer = kmlLayer;\n            this.layersControl.addOverlay(layerObj.layer, layerObj.label);\n            const response = await fetch(layerObj.url);\n            const kmltext = await response.text();\n            // Create new kml overlay\n            const parser = new DOMParser();\n            const kml = parser.parseFromString(kmltext, 'text/xml');\n            layerObj.layer.addKML(kml);\n          } else {\n            const geoJsonLayer = L.geoJson(null, {\n              onEachFeature: (feature, layer) => {\n                const props = {};\n                for (const key in feature.properties) {\n                  if (Object.prototype.hasOwnProperty.call(layerObj.propMappings, key)) {\n                    props[layerObj.propMappings[key]] = feature.properties[key];\n                  }\n                }\n                feature.properties = props;\n              }\n            });\n            if (layerObj.showByDefault) {\n              geoJsonLayer.addTo(this.map);\n            }\n            layerObj.layer = geoJsonLayer;\n            this.layersControl.addOverlay(layerObj.layer, layerObj.label);\n            const data = await (await fetch(layerObj.url)).json();\n            layerObj.layer.addData(data).setStyle(layerObj.style);\n          }\n        }\n      }\n    }\n    initInfoBox() {\n      this.infobox = L.control();\n      this.infobox.onAdd = function () {\n        this._div = L.DomUtil.create('div', 'info');\n        this.update();\n        return this._div;\n      };\n      this.infobox.update = function (props) {\n        let html = '<h4>Layer Info</h4>';\n        if (props && Object.keys(props).length) {\n          for (const key in props) {\n            html += '<p><em>' + key + '</em>: ' + props[key] + '</p>';\n          }\n        } else {\n          html += '<p>Hover/tap a layer</p>';\n        }\n        this._div.innerHTML = html;\n      };\n      this.infobox.addTo(this.map);\n      const onMouseMove = e => {\n        const allProps = {};\n        if (this.layersControl._layers) {\n          this.layersControl._layers.forEach(obj => {\n            if (obj.layer && typeof obj.layer.eachLayer === 'function') {\n              const result = leafletPip.pointInLayer(e.latlng, obj.layer, true)[0];\n              if (result) {\n                Object.assign(allProps, result.feature.properties);\n              }\n            }\n          });\n        }\n        this.infobox.update(allProps);\n        if (e.type === 'click') {\n          L.popup().setLatLng(e.latlng).setContent(this.infobox._div.innerHTML).openOn(this.map);\n        }\n      };\n      const debounce = {\n        onMouseMove: onMouseMove\n      };\n      this.map.on('mousemove', e => {\n        if (e.originalEvent.buttons === 0) {\n          (0, _emberLifeline.debounceTask)(debounce, 'onMouseMove', e, 2, true);\n        }\n      });\n      this.map.on('click', onMouseMove);\n    }\n    initEditableMap() {\n      this.editableLayer = L.markerClusterGroup().addTo(this.map);\n      this.layersControl.addOverlay(this.editableLayer, 'User Features');\n      this.map.addControl(new L.Control.Draw({\n        edit: {\n          featureGroup: this.editableLayer,\n          poly: {\n            allowIntersection: false\n          }\n        },\n        draw: {\n          polyline: {\n            shapeOptions: {\n              color: '#00ff00',\n              weight: 10\n            }\n          },\n          polygon: {\n            showArea: true,\n            allowIntersection: false,\n            drawError: {\n              color: '#da2600',\n              // Color the shape will turn when intersects\n              message: '<strong>Error:<strong> Polygon cannot intersect with itself' // Message that will show when intersect\n            },\n            shapeOptions: {\n              color: '#00ff00'\n            }\n          }\n        }\n      }));\n      const drawEventCreated = event => {\n        const layer = event.layer;\n        // layer.bindPopup('<button type=\"button\" class=\"btn btn-primary\" data-toggle=\"modal\" data-target=\"#add-incident-modal\">Add Incident</button>').openPopup();\n\n        this.editableLayer.addLayer(layer);\n      };\n      this.map.on(L.Draw.Event.CREATED, drawEventCreated.bind(this));\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"metrics\", [_service.inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"addressLookup\", [_service.inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"geolocationPending\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"baseLayers\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {};\n    }\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"layers\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {};\n    }\n  }), _descriptor6 = _applyDecoratedDescriptor(_class.prototype, \"overlay\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {};\n    }\n  }), _descriptor7 = _applyDecoratedDescriptor(_class.prototype, \"location\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {};\n    }\n  }), _descriptor8 = _applyDecoratedDescriptor(_class.prototype, \"location_approximate\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor9 = _applyDecoratedDescriptor(_class.prototype, \"no_results\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor0 = _applyDecoratedDescriptor(_class.prototype, \"wazeIframeUrl\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 'https://embed.waze.com/iframe?zoom=11&lat=41.85&lon=-87.63&ct=livemap';\n    }\n  }), _descriptor1 = _applyDecoratedDescriptor(_class.prototype, \"crimereportsIframeUrl\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 'https://chicagopd.maps.arcgis.com/apps/webappviewer/index.html?id=96ca65e89cd54b8c808b136a66778369';\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"searchAddress\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"searchAddress\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"locateMe\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"locateMe\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"initMap\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initMap\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/media-player\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\"], function (_exports, _component, _tracking, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/object\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let MediaPlayer = _exports.default = (_class = class MediaPlayer extends _component.default {\n    constructor() {\n      super(...arguments);\n      _defineProperty(this, \"options\", {});\n      _initializerDefineProperty(this, \"minZoom\", _descriptor, this);\n      _initializerDefineProperty(this, \"maxZoom\", _descriptor2, this);\n      _initializerDefineProperty(this, \"currentZoom\", _descriptor3, this);\n      _defineProperty(this, \"idSuffix\", '');\n      this.options = {\n        aspectRatio: '4:1',\n        preload: this.args.preload,\n        controls: true,\n        autoplay: this.args.autoplay ? 'play' : false,\n        techOrder: ['html5']\n      };\n      if (this.args.type.includes('ogg')) {\n        this.options.techOrder = ['ogvjs'];\n        this.options.ogvjs = {\n          base: '/assets/ogv'\n        };\n      }\n      this.plugins = {\n        wavesurfer: {\n          displayMilliseconds: false,\n          interact: true,\n          normalize: true,\n          waveColor: '#0F0',\n          progressColor: '#0A0',\n          cursorColor: '#FFF',\n          plugins: []\n        }\n      };\n      if (!this.args.hideZoom) {\n        this.plugins.wavesurfer.plugins.push(window.WaveSurfer.timeline.create({\n          container: '#timeline' + this.idSuffix\n        }));\n      }\n      this.options.plugins = this.plugins;\n    }\n    initializeMediaPlayer(target) {\n      this.player = window.videojs(target, this.options, () => {\n        const src = {\n          src: this.args.src,\n          type: this.args.type\n        };\n        if (this.args.preload === 'none') {\n          src.peaks = 'data:application/json;charset=utf-8,%7B%22version%22%3A2%2C%22channels%22%3A1%2C%22sample_rate%22%3A8000%2C%22samples_per_pixel%22%3A1%2C%22bits%22%3A8%2C%22length%22%3A108%2C%22data%22%3A%5B0%5D%7D';\n        }\n        this.player.src(src);\n        if (this.args.preload === 'none') {\n          this.player.one('play', async () => {\n            const element = this.player.tech_.el();\n            await this.player.wavesurfer().load(element);\n            await this.player.play();\n            await this.player.wavesurfer().surfer.play();\n          });\n        }\n      });\n    }\n    teardownMediaPlayer() {\n      this.player.dispose();\n    }\n    zoom(e) {\n      let wavesurfer = this.player.wavesurfer().surfer;\n      let playerWidth = wavesurfer.drawer.getWidth();\n      let minPxPerSec = Math.round(playerWidth * wavesurfer.params.pixelRatio / wavesurfer.getDuration());\n      let defaultMinPxPerSec = 20;\n      wavesurfer.zoom(minPxPerSec * (Number(e.target.value) / defaultMinPxPerSec));\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"minZoom\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"maxZoom\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 100;\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"currentZoom\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"initializeMediaPlayer\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initializeMediaPlayer\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"teardownMediaPlayer\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"teardownMediaPlayer\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"zoom\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"zoom\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/notification-channel-form\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"@glimmer/tracking\"], function (_exports, _object, _service, _component, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let NotificationChannelFormComponent = _exports.default = (_class = class NotificationChannelFormComponent extends _component.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"store\", _descriptor, this);\n      _initializerDefineProperty(this, \"service\", _descriptor2, this);\n    }\n    setService(event) {\n      this.service = event.target.value;\n    }\n    async submit(event) {\n      event.preventDefault();\n      const formdata = new FormData(event.target);\n      const data = {\n        service: formdata.get('service'),\n        path: formdata.get('path')\n      };\n      if (this.args.channel) {\n        const channel = this.args.channel;\n        Object.assign(channel, data);\n        channel.save();\n      } else {\n        const channel = this.store.createRecord('notification-channel', data);\n        channel.save();\n      }\n      this.args.onSubmit();\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"store\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"service\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"setService\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setService\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"submit\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"submit\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/notification-channel-list\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"@glimmer/tracking\"], function (_exports, _object, _service, _component, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let NotificationChannelListComponent = _exports.default = (_class = class NotificationChannelListComponent extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"store\", _descriptor, this);\n      _initializerDefineProperty(this, \"channels\", _descriptor2, this);\n      this.channels = this.store.peekAll('notification-channel');\n    }\n    async deleteChannel(channel) {\n      if (!confirm('Are you sure you want to delete this notification channel?')) {\n        return;\n      }\n      await channel.destroyRecord();\n      (0, _object.set)(this, 'channels', await this.store.findAll('notification-channel'));\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"store\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"channels\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"deleteChannel\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"deleteChannel\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/notification-settings\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"@glimmer/tracking\"], function (_exports, _object, _service, _component, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let NotificationSettingsComponent = _exports.default = (_class = class NotificationSettingsComponent extends _component.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"session\", _descriptor, this);\n      _initializerDefineProperty(this, \"config\", _descriptor2, this);\n      _initializerDefineProperty(this, \"currentSubscription\", _descriptor3, this);\n      _initializerDefineProperty(this, \"currentChannel\", _descriptor4, this);\n      _initializerDefineProperty(this, \"notificationsConfig\", _descriptor5, this);\n    }\n    editSubscription(subscription) {\n      this.currentSubscription = subscription;\n      this.scrollTo('subscription-form-heading');\n    }\n    clearCurrentSubscription() {\n      this.currentSubscription = undefined;\n    }\n    async editChannel(channel) {\n      this.currentChannel = channel;\n      this.scrollTo('channel-form-heading');\n    }\n    clearCurrentChannel() {\n      this.currentChannel = undefined;\n    }\n    async getNotificationsConfig() {\n      const response = await fetch(this.config.get('API_BASE_URL') + '/api/config/notifications.json', this.session.fetchOptions);\n      this.notificationsConfig = await response.json();\n    }\n    scrollTo(id) {\n      const elem = document.getElementById(id);\n      if (elem) {\n        const y = elem.getBoundingClientRect().top + window.pageYOffset - 60;\n        window.scrollTo({\n          top: y,\n          behavior: 'smooth'\n        });\n      } else {\n        console.error(`Could not find #${id}`);\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"session\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"currentSubscription\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return undefined;\n    }\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"currentChannel\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return undefined;\n    }\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"notificationsConfig\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return undefined;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"editSubscription\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"editSubscription\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"clearCurrentSubscription\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"clearCurrentSubscription\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"editChannel\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"editChannel\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"clearCurrentChannel\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"clearCurrentChannel\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"getNotificationsConfig\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"getNotificationsConfig\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/notification-subscription-form\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"@glimmer/tracking\"], function (_exports, _object, _service, _component, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let NotificationSubscriptionFormComponent = _exports.default = (_class = class NotificationSubscriptionFormComponent extends _component.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"config\", _descriptor, this);\n      _initializerDefineProperty(this, \"session\", _descriptor2, this);\n      _initializerDefineProperty(this, \"store\", _descriptor3, this);\n      _initializerDefineProperty(this, \"availableTalkgroups\", _descriptor4, this);\n      _initializerDefineProperty(this, \"channels\", _descriptor5, this);\n    }\n    async initData() {\n      this.getTalkgroups();\n      this.getChannels();\n    }\n    async getChannels() {\n      (0, _object.set)(this, 'channels', this.store.peekAll('notification-channel'));\n    }\n    async getTalkgroups() {\n      (0, _object.set)(this, 'availableTalkgroups', this.store.peekAll('search-talkgroup'));\n    }\n    async loadAutocomplete() {\n      if (this.session.user.patreon_tier.features.transcript_geosearch) {\n        const center = {\n          lat: 41.8781,\n          lng: -87.6298\n        }; // downtown Chicago\n        const defaultBounds = {\n          north: center.lat + 1,\n          south: center.lat - 1,\n          east: center.lng + 1,\n          west: center.lng - 1\n        };\n        const input = document.getElementById('addressInput');\n        const options = {\n          bounds: defaultBounds,\n          componentRestrictions: {\n            country: 'us'\n          },\n          fields: ['address_components', 'geometry', 'icon', 'name'],\n          strictBounds: false\n        };\n        const autocomplete = new google.maps.places.Autocomplete(input, options);\n        autocomplete.addListener('place_changed', () => {\n          const place = autocomplete.getPlace();\n          if (!place.geometry) {\n            return;\n          }\n          document.getElementById('latInput').value = place.geometry.location.lat();\n          document.getElementById('lngInput').value = place.geometry.location.lng();\n          document.getElementById('mapAddressButton').href = `https://www.google.com/maps/search/?api=1&query=${place.geometry.location.lat()},${place.geometry.location.lng()}`;\n        });\n      }\n    }\n    async submit(event) {\n      event.preventDefault();\n      const formdata = new FormData(event.target);\n      if (!formdata.getAll('topic').length) {\n        alert('You must select at least one talkgroup to match.');\n        return;\n      }\n      if (!formdata.getAll('notification_channels').length) {\n        alert('You must select at least one notification channel.');\n        return;\n      }\n      let isJustNtfy = true;\n      for (const channel of formdata.getAll('notification_channels')) {\n        if ((await this.store.peekRecord('notification-channel', channel).service) != 'ntfy') {\n          isJustNtfy = false;\n          break;\n        }\n      }\n      if (formdata.get('keywords').length == 0 && !formdata.get('address') && !isJustNtfy) {\n        alert('You must enter at least one keyword or address.');\n        return;\n      }\n      if (formdata.get('address') && (!formdata.get('lat') || !formdata.get('lng'))) {\n        alert('You must select a valid address from the autocomplete.');\n        return;\n      }\n      if (formdata.get('address') && !formdata.get('radius') && !formdata.get('travel_time')) {\n        alert('You must enter a radius or travel time for the address.');\n        return;\n      }\n      let data = {\n        name: formdata.get('name'),\n        enabled: formdata.get('enabled') == 'on',\n        keywords: formdata.get('keywords').split('\\n'),\n        ignore_keywords: formdata.get('ignore_keywords').split('\\n'),\n        topic: formdata.getAll('topic').join('|'),\n        notification_channels: formdata.getAll('notification_channels').map(value => parseInt(value))\n      };\n      if (data.keywords.length == 1 && data.keywords[0] == '') {\n        data.keywords = null;\n      }\n      if (data.ignore_keywords.length == 1 && data.ignore_keywords[0] == '') {\n        data.ignore_keywords = null;\n      }\n      const location = {\n        address: formdata.get('address'),\n        geo: {\n          lat: parseFloat(formdata.get('lat')),\n          lng: parseFloat(formdata.get('lng'))\n        },\n        radius: parseFloat(formdata.get('radius')),\n        travel_time: parseFloat(formdata.get('travel_time'))\n      };\n      if (!isNaN(location.geo.lat) && !isNaN(location.geo.lng)) {\n        data.location = location;\n      }\n      if (this.args.subscription) {\n        const subscription = this.args.subscription;\n        Object.assign(subscription, data);\n        subscription.save();\n      } else {\n        const subscription = this.store.createRecord('transcript-subscription', data);\n        subscription.save();\n        document.getElementById('subscription-form').reset();\n      }\n      this.args.onSubmit();\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"session\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"store\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"availableTalkgroups\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"channels\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"initData\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initData\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"getChannels\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"getChannels\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"getTalkgroups\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"getTalkgroups\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"loadAutocomplete\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"loadAutocomplete\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"submit\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"submit\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/notification-subscription-list\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"@glimmer/tracking\"], function (_exports, _object, _service, _component, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let NotificationSubscriptionListComponent = _exports.default = (_class = class NotificationSubscriptionListComponent extends _component.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"store\", _descriptor, this);\n      _initializerDefineProperty(this, \"subscriptions\", _descriptor2, this);\n      _initializerDefineProperty(this, \"availableTalkgroups\", _descriptor3, this);\n    }\n    async initData() {\n      if (!this.availableTalkgroups.length) {\n        (0, _object.set)(this, 'availableTalkgroups', await this.store.peekAll('search-talkgroup'));\n      }\n      (0, _object.set)(this, 'subscriptions', this.store.peekAll('transcript-subscription'));\n    }\n    async deleteSubscription(subscription) {\n      if (!confirm('Are you sure you want to delete this subscription?')) {\n        return;\n      }\n      await subscription.destroyRecord();\n      await this.initData();\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"store\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"subscriptions\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"availableTalkgroups\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"initData\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initData\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"deleteSubscription\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"deleteSubscription\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/pell-editor\", [\"exports\", \"ember-pell/components/pell-editor\"], function (_exports, _pellEditor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pellEditor.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-pell/components/pell-editor\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/components/sandbox\", [\"exports\", \"@ember/component\", \"react-frontend/src/search/simple-search.tsx\", \"@glimmer/component\", \"@ember/template-factory\"], function (_exports, _component, _simpleSearch, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"react-frontend/src/search/simple-search.tsx\",0,\"@glimmer/component\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div {{react this.theReactComponent}} />\n  \n  */\n  {\n    \"id\": \"sKy5WmeC\",\n    \"block\": \"[[[11,0],[4,[38,1],[[30,0,[\\\"theReactComponent\\\"]]],null],[12],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"div\\\",\\\"react\\\"]]\",\n    \"moduleName\": \"crimeisdown/components/sandbox.hbs\",\n    \"isStrictMode\": false\n  });\n  class SandboxComponent extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _defineProperty(this, \"theReactComponent\", _simpleSearch.SimpleSearchComponent);\n    }\n  }\n  _exports.default = SandboxComponent;\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, SandboxComponent);\n});","define(\"crimeisdown/components/search-radioids\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"@glimmer/tracking\", \"fetch\", \"jquery\", \"react-frontend/src/search/simple-search.tsx\"], function (_exports, _object, _service, _component, _tracking, _fetch, _jquery, _simpleSearch) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"fetch\",0,\"jquery\",0,\"react-frontend/src/search/simple-search.tsx\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let SearchRadioids = _exports.default = (_class = class SearchRadioids extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"metrics\", _descriptor, this);\n      _initializerDefineProperty(this, \"radioIds\", _descriptor2, this);\n      _initializerDefineProperty(this, \"radio\", _descriptor3, this);\n      _defineProperty(this, \"simpleSearchComponent\", _simpleSearch.SimpleSearchComponent);\n      (0, _fetch.default)('/data/city_data/radio_ids.json').then(response => {\n        response.json().then(data => {\n          this.radioIds = data;\n        });\n      }).catch(() => {\n        this.radioIds = {};\n        alert('Could not fetch radio ID list');\n      });\n    }\n    lookupRadioId(radioId) {\n      let input = radioId.toUpperCase();\n      this.metrics.trackEvent({\n        category: 'Tools',\n        action: 'Searches radio ID list',\n        label: input\n      });\n      let matches = [];\n      this.radioIds.forEach(row => {\n        if (input.match('^' + row.ID_Number + '$')) {\n          matches.push(row);\n        }\n      });\n      (0, _jquery.default)('#radioid-results td').empty();\n      if (matches.length > 0) {\n        (0, _object.set)(this, 'radio', {\n          agency: '',\n          level1: '',\n          level2: '',\n          level3: '',\n          level4: ''\n        });\n        matches.forEach(match => {\n          if (match.Agency.length) {\n            this.radio.agency = match.Agency;\n          }\n          if (match.Level_1.length) {\n            this.radio.level1 = match.Level_1;\n          }\n          if (match.Level_2.length) {\n            this.radio.level2 = match.Level_2;\n          }\n          if (match.Level_3.length) {\n            this.radio.level3 = match.Level_3;\n          }\n          if (match.Level_4.length) {\n            // If ends with $1, then replace with the numeric part of the query\n            if (match.Level_4.match(/\\$1$/)) {\n              this.radio.level4 = match.Level_4.replace('$1', input.match(/\\d+/)[0]);\n            } else {\n              this.radio.level4 = match.Level_4;\n            }\n          }\n        });\n      } else {\n        (0, _object.set)(this, 'radio', {\n          agency: 'N/A',\n          level1: 'N/A',\n          level2: 'N/A',\n          level3: 'N/A',\n          level4: 'N/A'\n        });\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"metrics\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"radioIds\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"radio\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {};\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"lookupRadioId\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"lookupRadioId\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/search-ucrcodes\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\", \"@glimmer/tracking\", \"fetch\", \"react-frontend/src/search/simple-search.tsx\"], function (_exports, _object, _service, _component, _tracking, _fetch, _simpleSearch) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"fetch\",0,\"react-frontend/src/search/simple-search.tsx\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let SearchUcrcodes = _exports.default = (_class = class SearchUcrcodes extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"metrics\", _descriptor, this);\n      _initializerDefineProperty(this, \"ucrCodes\", _descriptor2, this);\n      _initializerDefineProperty(this, \"ucr\", _descriptor3, this);\n      _defineProperty(this, \"simpleSearchComponent\", _simpleSearch.SimpleSearchComponent);\n      (0, _fetch.default)('/data/city_data/ucr_codes.json').then(response => {\n        response.json().then(data => {\n          this.ucrCodes = data;\n        });\n      }).catch(() => {\n        this.ucrCodes = {};\n        alert('Could not fetch UCR code list');\n      });\n    }\n    lookupUCR(ucrCode) {\n      let input = ucrCode;\n      this.metrics.trackEvent({\n        category: 'Tools',\n        action: 'Searches UCR list',\n        label: input\n      });\n      (0, _object.set)(this, 'ucr', {\n        primaryDesc: 'Not Found',\n        secondaryDesc: 'Not Found',\n        indexCode: 'N/A'\n      });\n      let code = transformUCR(input);\n      this.ucrCodes.forEach(row => {\n        if (code === transformUCR(row.ucrCode)) {\n          (0, _object.set)(this, 'ucr', row);\n          (0, _object.set)(this, 'ucrCode', code);\n          return;\n        }\n      });\n      function transformUCR(code) {\n        return code.toUpperCase().replace(/-/g, '');\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"metrics\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"ucrCodes\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"ucr\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {};\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"lookupUCR\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"lookupUCR\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/settings\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@glimmer/component\"], function (_exports, _object, _service, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let SettingsComponent = _exports.default = (_class = class SettingsComponent extends _component.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"config\", _descriptor, this);\n    }\n    update(event) {\n      event.preventDefault();\n      const data = new FormData(event.target);\n      for (const [key, value] of data.entries()) {\n        this.config.set(key, value);\n      }\n      alert(`Successfully updated:\\n${JSON.stringify(this.config.ENV, null, 2)}`);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"update\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"update\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/stream-player\", [\"exports\", \"@glimmer/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\"eaimeta@70e063a35619d71f\n  /*global MediaElementPlayer*/\n  class StreamPlayer extends _component.default {\n    initializeMediaPlayer(stream, autoplay) {\n      const isMobileSafari = navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/);\n      const mediaSourceSupported = ('MediaSource' in window || 'WebKitMediaSource' in window) && !isMobileSafari;\n      let options = {\n        pluginPath: 'https://cdn.jsdelivr.net/npm/mediaelement@5.1.0/build/',\n        iconSprite: '/assets/images/mejs-controls.svg',\n        shimScriptAccess: 'always',\n        isVideo: false,\n        pauseOtherPlayers: false,\n        features: ['playpause', 'current', 'volume']\n      };\n      let src;\n      if (stream.broadcastify) {\n        options['renderers'] = ['html5'];\n        src = {\n          src: stream.broadcastify,\n          type: 'audio/mpeg'\n        };\n      } else if (mediaSourceSupported) {\n        options['renderers'] = ['native_dash', 'flash_dash'];\n        options['dash'] = {\n          path: 'https://cdn.dashjs.org/v3.2.0/dash.all.min.js'\n        };\n        src = {\n          src: 'https://audio.crimeisdown.com/streaming/dash/' + stream.slug + '/',\n          type: 'application/dash+xml'\n        };\n      } else {\n        options['renderers'] = ['html5', 'native_hls', 'flash_hls'];\n        options['hls'] = {\n          path: 'https://cdn.jsdelivr.net/npm/hls.js@0.14.17'\n        };\n        src = {\n          src: 'https://audio.crimeisdown.com/streaming/hls/' + stream.slug + '/index.m3u8',\n          type: 'application/x-mpegURL'\n        };\n      }\n      let playerElement = document.getElementById('stream-player-' + stream.slug);\n      let mediaElementPlayer = new MediaElementPlayer(playerElement, options);\n      mediaElementPlayer.setSrc(src);\n      if (autoplay) {\n        mediaElementPlayer.load();\n        mediaElementPlayer.play();\n      }\n    }\n  }\n  _exports.default = StreamPlayer;\n});","define(\"crimeisdown/components/transcript-search\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@ember/string\", \"@ember/array\", \"ember-concurrency\", \"@glimmer/component\", \"@glimmer/tracking\", \"@meilisearch/instant-meilisearch\", \"typesense-instantsearch-adapter\", \"instantsearch.js\", \"instantsearch.js/es/connectors/hits/connectHits\", \"instantsearch.js/es/connectors/range/connectRange\", \"instantsearch.js/es/connectors/geo-search/connectGeoSearch\", \"instantsearch.js/es/lib/routers\", \"instantsearch.js/es/lib/utils\", \"instantsearch.js/es/widgets\", \"instantsearch.js/es/widgets/stats/stats\", \"moment-timezone\"], function (_exports, _object, _service, _string, _array, _emberConcurrency, _component, _tracking, _instantMeilisearch, _typesenseInstantsearchAdapter, _instantsearch, _connectHits, _connectRange, _connectGeoSearch, _routers, _utils, _widgets, _stats, _momentTimezone) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor0, _descriptor1, _descriptor10, _descriptor11, _descriptor12, _descriptor13, _descriptor14, _descriptor15, _descriptor16;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@ember/string\",0,\"@ember/array\",0,\"ember-concurrency\",0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@meilisearch/instant-meilisearch\",0,\"typesense-instantsearch-adapter\",0,\"instantsearch.js\",0,\"instantsearch.js/es/connectors/hits/connectHits\",0,\"instantsearch.js/es/connectors/range/connectRange\",0,\"instantsearch.js/es/connectors/geo-search/connectGeoSearch\",0,\"instantsearch.js/es/lib/routers\",0,\"instantsearch.js/es/lib/utils\",0,\"instantsearch.js/es/widgets\",0,\"instantsearch.js/es/widgets/stats/stats\",0,\"moment-timezone\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let TranscriptSearchComponent = _exports.default = (_class = class TranscriptSearchComponent extends _component.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"config\", _descriptor, this);\n      _initializerDefineProperty(this, \"metrics\", _descriptor2, this);\n      _initializerDefineProperty(this, \"session\", _descriptor3, this);\n      _initializerDefineProperty(this, \"addressLookup\", _descriptor4, this);\n      _initializerDefineProperty(this, \"store\", _descriptor5, this);\n      _initializerDefineProperty(this, \"hasAccess\", _descriptor6, this);\n      _initializerDefineProperty(this, \"onTranscriptMapPage\", _descriptor7, this);\n      _initializerDefineProperty(this, \"apiKeys\", _descriptor8, this);\n      _initializerDefineProperty(this, \"indexName\", _descriptor9, this);\n      _initializerDefineProperty(this, \"latestIndexName\", _descriptor0, this);\n      _initializerDefineProperty(this, \"hits\", _descriptor1, this);\n      _initializerDefineProperty(this, \"selectedHit\", _descriptor10, this);\n      _initializerDefineProperty(this, \"useMediaPlayerComponent\", _descriptor11, this);\n      _initializerDefineProperty(this, \"autoRefreshInterval\", _descriptor12, this);\n      _initializerDefineProperty(this, \"minStartTime\", _descriptor13, this);\n      _initializerDefineProperty(this, \"maxStartTime\", _descriptor14, this);\n      _initializerDefineProperty(this, \"currentSearch\", _descriptor15, this);\n      _initializerDefineProperty(this, \"savedSearches\", _descriptor16, this);\n      _defineProperty(this, \"demoIndexName\", 'calls_demo');\n      _defineProperty(this, \"newestFirstSort\", 'start_time:desc');\n      _defineProperty(this, \"oldestFirstSort\", 'start_time:asc');\n      _defineProperty(this, \"autoRefresh\", undefined);\n      _defineProperty(this, \"scrollTimer\", void 0);\n      _defineProperty(this, \"systemLabels\", {\n        chi_cpd: 'Chicago Police Department',\n        chi_cfd: 'Chicago Fire Department (conventional P25)',\n        chi_oemc: 'Chicago OEMC (trunked P25)',\n        sc21102: 'STARCOM21',\n        chisuburbs: 'Chicago Suburbs',\n        willco_p25: 'Will County (P25)'\n      });\n      this.addressLookup.loadData();\n      const matches = /calls_[0-9]{4}_[0-9]{2}/g.exec(window.location.search);\n      this.latestIndexName = this.getSearchIndexFromConfig() ?? 'calls_' + _momentTimezone.default.utc().format('YYYY_MM');\n      this.paidIndexName = (matches ? matches[0] : undefined) ?? 'calls_' + _momentTimezone.default.utc().format('YYYY_MM');\n      this.minStartTime = (0, _momentTimezone.default)().subtract(12, 'hours').toDate();\n      this.maxStartTime = new Date();\n      this.flatpickrOptions = {\n        enableTime: true,\n        altFormat: 'n/j/Y h:i K',\n        altInput: true,\n        dateFormat: 'U',\n        minDefaultDate: new Date(this.minStartTime.getTime()),\n        maxDefaultDate: new Date(this.maxStartTime.getTime())\n      };\n      if (window.location.hash.startsWith('#hit-')) {\n        this.selectedHit = window.location.hash.split('#hit-')[1];\n      }\n      const params = new URLSearchParams(window.location.search);\n      if (params.get('key')) {\n        this.config.set('MEILISEARCH_KEY', params.get('key'));\n      }\n      this.updateLatestIndex.perform();\n    }\n    getSearchIndexFromConfig() {\n      const newName = this.config.get('SEARCH_INDEX');\n      if (!newName) {\n        const oldName = this.config.get('MEILISEARCH_INDEX');\n        if (oldName) {\n          this.config.set('SEARCH_INDEX', oldName);\n          return oldName;\n        }\n      }\n      return newName;\n    }\n    *updateLatestIndex() {\n      while (true) {\n        this.latestIndexName = this.getSearchIndexFromConfig() ?? 'calls_' + _momentTimezone.default.utc().format('YYYY_MM');\n        yield (0, _emberConcurrency.timeout)(1000);\n      }\n    }\n    setIndexName(indexName) {\n      // Get current URL parts\n      const path = window.location.pathname;\n      const params = new URLSearchParams(window.location.search);\n      const hash = window.location.hash;\n      let paramsAsString = params.toString();\n      paramsAsString = paramsAsString.replaceAll(this.indexName, indexName);\n\n      // Update URL\n      window.location.href = `${path}?${paramsAsString}${hash}`;\n    }\n    setStartTimeRange(selectedDates, dateStr, instance) {\n      (0, _object.set)(this, instance.input.name, selectedDates[0]);\n      let min = this.minStartTime.getTime();\n      min = min === this.flatpickrOptions.minDefaultDate.getTime() ? undefined : Math.floor(min / 1000);\n      let max = this.maxStartTime.getTime();\n      max = max === this.flatpickrOptions.maxDefaultDate.getTime() ? undefined : Math.floor(max / 1000);\n      if (this.hasAccess && !this.getSearchIndexFromConfig()) {\n        // The max date should not be greater than the end of the month that min is in\n        const minUtc = _momentTimezone.default.unix(min).utc();\n        const maxUtc = _momentTimezone.default.unix(max).utc();\n        if (maxUtc.isAfter(minUtc.endOf('month'))) {\n          max = minUtc.endOf('month').unix();\n        }\n      }\n      this.updateStartTimeFilter([min, max]);\n      const indexName = 'calls_' + _momentTimezone.default.unix(min).utc().format('YYYY_MM');\n      if (this.hasAccess && !this.getSearchIndexFromConfig() && indexName !== this.indexName) {\n        // Redirect to the new index\n        setTimeout(() => {\n          this.setIndexName(indexName);\n        }, 500);\n        // We need a timeout as we have to wait for the new filters to be added to the URL\n      }\n    }\n    refresh(event) {\n      event.target.classList.add('spin');\n      this.search.refresh();\n      setTimeout(() => {\n        event.target.classList.remove('spin');\n      }, 1000);\n    }\n    toggleAutoRefresh() {\n      clearInterval(this.autoRefresh);\n      this.autoRefreshInterval = this.autoRefreshInterval ? 0 : 10;\n      if (this.autoRefreshInterval > 0) {\n        this.search.refresh();\n        this.autoRefresh = setInterval(() => {\n          this.search.refresh();\n        }, this.autoRefreshInterval * 1000);\n      }\n    }\n    processHit(hit) {\n      hit.raw_metadata = JSON.parse(hit.raw_metadata);\n      const raw_transcript = hit.raw_transcript;\n      hit.raw_transcript = JSON.parse(raw_transcript);\n      const hitClone = {\n        ...hit\n      };\n      delete hitClone['_highlightResult'];\n      delete hitClone['_snippetResult'];\n      delete hitClone['__position'];\n      delete hitClone['raw_metadata'];\n      hit.json = JSON.stringify(hitClone, null, 2);\n      try {\n        let unescapedRawTranscript = (0, _utils.unescape)(hit._highlightResult.raw_transcript.value);\n        if (hit._rawTypesenseHit) {\n          // Typesense doesn't always return the full raw transcript so we need to get the original and re-insert the highlighted parts\n          unescapedRawTranscript = raw_transcript.replace(unescapedRawTranscript.replaceAll('<mark>', '').replaceAll('</mark>', ''), unescapedRawTranscript);\n        }\n        hit.highlighted_transcript = JSON.parse(unescapedRawTranscript);\n      } catch (e) {\n        console.log(e);\n        hit.highlighted_transcript = hit.raw_transcript;\n      }\n\n      // Apply highlights\n      for (let i = 0; i < hit.raw_transcript.length; i++) {\n        const segment = hit.raw_transcript[i];\n        const highlightedSegment = hit.highlighted_transcript[i];\n        const src = segment[0];\n        if (src) {\n          src.filter_link = this.getSrcFilterLink(src);\n          if (highlightedSegment[0].tag.length > 0) {\n            src.label = highlightedSegment[0].tag;\n            const fireStationResults = this.addressLookup.findStation(src.label);\n            if (fireStationResults.length) {\n              src.address = fireStationResults[0].addr + ' ' + fireStationResults[0].zip;\n            }\n          } else {\n            src.label = String(src.src);\n          }\n        }\n        // Show newlines properly\n        segment[1] = highlightedSegment[1].replaceAll('\\n', '<br>');\n      }\n      if (hit.audio_type == 'digital tdma') {\n        hit.audio_type = 'digital';\n      }\n      hit.audio_type = (0, _string.capitalize)(hit.audio_type);\n      switch (hit.talkgroup_group_tag) {\n        case 'Law Dispatch':\n        case 'Law Tac':\n        case 'Law Talk':\n        case 'Security':\n          hit.talkgroup_group_tag_color = 'primary';\n          break;\n        case 'Fire Dispatch':\n        case 'Fire-Tac':\n        case 'Fire-Talk':\n        case 'EMS Dispatch':\n        case 'EMS-Tac':\n        case 'EMS-Talk':\n          hit.talkgroup_group_tag_color = 'danger';\n          break;\n        case 'Public Works':\n        case 'Utilities':\n          hit.talkgroup_group_tag_color = 'success';\n          break;\n        case 'Multi-Tac':\n        case 'Emergency Ops':\n          hit.talkgroup_group_tag_color = 'warning';\n          break;\n        default:\n          hit.talkgroup_group_tag_color = 'secondary';\n      }\n      let start_time = _momentTimezone.default.unix(hit.start_time);\n      if (hit.short_name == 'chi_cpd') {\n        if (hit.raw_metadata['encrypted'] == 1) {\n          hit.time_warning = ` - delayed until ${start_time.toDate().toLocaleTimeString()}`;\n          start_time = start_time.subtract(30, 'minutes');\n          hit.encrypted = true;\n        }\n      }\n      hit.start_time_ms = hit.start_time * 1000 + 1; // Add 1 since OpenMHz shows calls older than the specified time, and we want to include the current one\n      hit.start_time_string = start_time.toDate().toLocaleString();\n      hit.relative_time = start_time.fromNow();\n      hit.permalink = this.search.createURL({\n        [this.indexName]: {\n          refinementList: {\n            talkgroup_tag: [hit.talkgroup_tag]\n          },\n          range: {\n            start_time: `${hit.start_time}:${hit.start_time}`\n          }\n        }\n      });\n      hit.contextUrl = this.search.createURL(this.buildContextState(hit)).split('#')[0] + '#hit-' + hit.id;\n      if (this.hits) {\n        const existingHit = this.hits.filter(existingHit => existingHit.id === hit.id)[0];\n        if (existingHit) {\n          hit.showPlayer = existingHit.showPlayer || false;\n        }\n      }\n      return hit;\n    }\n    buildContextState(hit) {\n      let sortBy = this.defaultSort;\n      if (this.search.getUiState()[this.indexName] && this.search.getUiState()[this.indexName]['sortBy']) {\n        sortBy = this.search.getUiState()[this.indexName]['sortBy'];\n      }\n      return {\n        [this.indexName]: {\n          sortBy,\n          hitsPerPage: 60,\n          refinementList: {\n            talkgroup_tag: [hit.talkgroup_tag]\n          },\n          range: {\n            start_time: [hit.start_time - 60 * 20, hit.start_time + 60 * 10].join(':')\n          }\n        }\n      };\n    }\n    getContext(hit, event) {\n      event.preventDefault();\n      const state = this.buildContextState(hit);\n      this.selectedHit = hit.id;\n      this.search.setUiState(state);\n    }\n    async initSavedSearches() {\n      const savedSearches = localStorage.getItem('savedSearches');\n      if (savedSearches) {\n        let savedSearchesArray = JSON.parse(savedSearches);\n        if (Array.isArray(savedSearchesArray)) {\n          for (const savedSearch of savedSearchesArray) {\n            const search = this.store.createRecord('saved-search', savedSearch);\n            await search.save();\n          }\n        }\n        localStorage.removeItem('savedSearches');\n      }\n      const searches = await this.store.findAll('saved-search');\n      (0, _object.set)(this, 'savedSearches', searches);\n    }\n    getSearchFilters() {\n      const filters = [];\n      const refinementItems = document.querySelectorAll('.ais-CurrentRefinements-item');\n      for (const item of refinementItems) {\n        const label = item.querySelector('.ais-CurrentRefinements-label').innerText;\n        if (label.startsWith('Call Time')) {\n          continue;\n        }\n        const values = [];\n        for (const value of item.querySelectorAll('.ais-CurrentRefinements-category .ais-CurrentRefinements-categoryLabel')) {\n          values.push(value.innerText);\n        }\n        filters.push(`${label} ${values.join(', ')}`);\n      }\n      return filters;\n    }\n    createSavedSearchUrl() {\n      let state = this.search.getUiState();\n      delete state[this.indexName]['range'];\n      state[this.indexName]['sortBy'] = `${this.indexName}:start_time:desc`;\n      return this.search.createURL(state);\n    }\n    saveSearch() {\n      const searchName = prompt('Enter a name for this search');\n      if (!searchName) {\n        return;\n      }\n      const data = {\n        name: searchName,\n        url: this.createSavedSearchUrl()\n      };\n      const search = this.store.createRecord('saved-search', data);\n      search.save();\n    }\n    async updateSavedSearch(search) {\n      const filters = this.getSearchFilters();\n      if (!filters) {\n        alert('No filters to save, make sure to open the saved search and then choose new filters before updating.');\n      }\n      const shouldUpdate = confirm('New filters:\\n' + filters.join('\\n') + '\\n\\nAre you sure you want to update this search?');\n      if (shouldUpdate) {\n        search.url = this.createSavedSearchUrl();\n        search.save();\n      }\n    }\n    async deleteSavedSearch(search) {\n      await search.destroyRecord();\n      await this.initSavedSearches();\n    }\n    didInsertHit(elem) {\n      const tooltipTriggerList = [].slice.call(elem.querySelectorAll('[data-bs-toggle=\"tooltip\"]'));\n      tooltipTriggerList.map(function (tooltipTriggerEl) {\n        return new bootstrap.Tooltip(tooltipTriggerEl);\n      });\n      if (this.selectedHit) {\n        clearTimeout(this.scrollTimer);\n        this.scrollTimer = setTimeout(() => {\n          const elementId = `hit-${this.selectedHit}`;\n          const hitElement = document.getElementById(elementId);\n          if (hitElement) {\n            const y = hitElement.getBoundingClientRect().top + window.pageYOffset - 60;\n            window.scrollTo({\n              top: y,\n              behavior: 'smooth'\n            });\n            const oldhash = window.location.hash;\n            const newhash = '#' + elementId;\n            if (oldhash != newhash) {\n              window.history.pushState(window.history.state, '', newhash);\n            }\n          }\n        }, 100);\n      }\n    }\n    playAudio(hit) {\n      (0, _object.set)(hit, 'showPlayer', true);\n    }\n    buildSrcFilter(src) {\n      let sortBy = this.defaultSort;\n      let hitsPerPage = 20;\n      if (this.search.getUiState()[this.indexName] && this.search.getUiState()[this.indexName]['sortBy']) {\n        sortBy = this.search.getUiState()[this.indexName]['sortBy'];\n      }\n      if (this.search.getUiState()[this.indexName] && this.search.getUiState()[this.indexName]['hitsPerPage']) {\n        hitsPerPage = this.search.getUiState()[this.indexName]['hitsPerPage'];\n      }\n      const uiState = {\n        [this.indexName]: {\n          sortBy,\n          hitsPerPage,\n          refinementList: {}\n        }\n      };\n      if (src.tag) {\n        uiState[this.indexName].refinementList['units'] = [src.tag];\n      } else {\n        uiState[this.indexName].refinementList['radios'] = [src.src];\n      }\n      return uiState;\n    }\n    getSrcFilterLink(src) {\n      return this.search.createURL(this.buildSrcFilter(src));\n    }\n    filterSrc(src, hit, event) {\n      event.preventDefault();\n      const state = this.buildSrcFilter(src);\n      this.selectedHit = hit.id;\n      this.search.setUiState(state);\n    }\n    async login() {\n      const loggedIn = await this.session.authenticated;\n      try {\n        if (!this.onTranscriptMapPage || this.onTranscriptMapPage && this.session.user.patreon_tier.features.transcript_geosearch) {\n          this.apiKeys = await this.session.getSearchAPIKeys();\n          this.indexName = this.getSearchIndexFromConfig() || this.paidIndexName;\n        }\n        this.hasAccess = true;\n      } catch (e) {\n        if (loggedIn) {\n          console.error(e);\n          alert(`Could not load search, please try again or check that you are at the right Patreon tier.\\nGot error: ${e.message || e}`);\n        }\n        this.hasAccess = false;\n        const generateWatermark = name => {\n          return `<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='200px' width='200px'><text transform='translate(20, 100) rotate(-30)' fill='rgba(45,45,45,0.08)' font-size='32' font-family='Arial, Helvetica, sans-serif'>${name}</text></svg>`;\n        };\n        const base64Mark = btoa(generateWatermark('DEMO'));\n        document.querySelector('#hits').style.background = `url(\"data:image/svg+xml;base64,${base64Mark}\") repeat`;\n      }\n      await new Promise(r => setTimeout(r, 1)); // Wait for run loop to complete\n    }\n    async setupSearch() {\n      await this.login();\n      try {\n        await this.initSavedSearches();\n      } catch (e) {\n        console.error(e);\n      }\n      const meilisearchUrl = this.config.get('MEILISEARCH_URL');\n      let im = null;\n      if (meilisearchUrl) {\n        im = new _instantMeilisearch.instantMeiliSearch(meilisearchUrl, this.apiKeys.meilisearch, {\n          finitePagination: true,\n          keepZeroFacets: true\n        });\n      }\n      let typesenseInstantsearchAdapter = null;\n      if (this.config.get('TYPESENSE_URL') && !this.config.get('MEILISEARCH_KEY')) {\n        const typesenseUrl = new URL(this.config.get('TYPESENSE_URL'));\n        typesenseInstantsearchAdapter = new _typesenseInstantsearchAdapter.default({\n          server: {\n            apiKey: this.apiKeys.typesense,\n            // Be sure to use an API key that only allows search operations\n            nodes: [{\n              host: typesenseUrl.hostname,\n              path: typesenseUrl.pathname === '/' ? '' : typesenseUrl.pathname,\n              port: typesenseUrl.port,\n              protocol: typesenseUrl.protocol.replace(':', '')\n            }],\n            cacheSearchResultsForSeconds: 60,\n            // Cache search requests for 60 seconds\n            useServerSideSearchCache: true // Enable the server-side search cache\n          },\n          // The following parameters are directly passed to Typesense's search API endpoint.\n          //  So you can pass any parameters supported by the search endpoint below.\n          //  query_by is required.\n          additionalSearchParameters: {\n            query_by: 'transcript_plaintext',\n            highlight_fields: 'raw_transcript',\n            exclude_fields: 'embedding'\n          }\n        });\n      }\n      const shouldUseTypesense = typesenseInstantsearchAdapter !== null;\n      this.defaultSort = this._buildSortString(this.newestFirstSort, this.indexName, shouldUseTypesense);\n      this.defaultRouteState = {\n        [this.indexName]: {\n          sortBy: this.defaultSort\n        }\n      };\n      if (this.indexName !== this.demoIndexName) {\n        this.defaultRouteState[this.indexName].range = {\n          start_time: Math.floor(this.flatpickrOptions.minDefaultDate.getTime() / 1000) + ':'\n        };\n      }\n      if (this.onTranscriptMapPage) {\n        this.defaultRouteState[this.indexName].geoSearch = {\n          boundingBox: '42,-87.5,41.6,-87.9'\n        };\n        this.defaultRouteState[this.indexName].hitsPerPage = 60;\n      }\n      this.search = (0, _instantsearch.default)({\n        searchClient: (shouldUseTypesense ? typesenseInstantsearchAdapter : im).searchClient,\n        indexName: this.indexName,\n        routing: {\n          router: this.getSearchRouter(shouldUseTypesense)\n        },\n        future: {\n          preserveSharedStateOnUnmount: true\n        }\n      });\n      this.search.on('render', () => {\n        const body = document.querySelector('body.ember-application');\n        const container = document.querySelector('body > div.container, body > div.container-fluid');\n        if (this.search.status === 'loading' || this.search.status === 'stalled') {\n          body.classList.add('show-loading');\n          if (container) {\n            container.classList.add('opacity-75');\n          }\n        } else {\n          if (container) {\n            container.classList.remove('opacity-75');\n          }\n          body.classList.remove('show-loading');\n          this.metrics.trackEvent({\n            category: 'Transcript',\n            action: 'Performed search',\n            label: JSON.stringify(this.search.getUiState())\n          });\n        }\n        const uiState = {\n          ...this.search.getUiState()[this.indexName]\n        };\n        delete uiState['range'];\n        delete uiState['sortBy'];\n        this.currentSearch = uiState;\n      });\n      this.search.on('error', ({\n        error\n      }) => {\n        console.error(error);\n        alert(`Could not load search, please try again or logout and log back in.\\nGot error: ${error.message || error}`);\n      });\n      const systemMenuTransformItems = items => {\n        const result = items.map(item => ({\n          ...item,\n          label: this.systemLabels[item.value] ?? item.label,\n          highlighted: this.systemLabels[item.value] ?? item.highlighted\n        }));\n        return result;\n      };\n      const sidebarWidgets = [this.getClearRefinementsWidget(), this.getHierarchicalMenuWidget('#tg-h-menu', ['talkgroup_hierarchy.lvl0', 'talkgroup_hierarchy.lvl1', 'talkgroup_hierarchy.lvl2'], systemMenuTransformItems), this.getRefinementListWidget('#system-menu', 'short_name', systemMenuTransformItems), this.getRefinementListWidget('#dept-menu', 'talkgroup_group'), this.getRefinementListWidget('#tg-menu', 'talkgroup_tag'), this.getRefinementListWidget('#tg-type-menu', 'talkgroup_group_tag'), this.getRefinementListWidget('#units-menu', 'units'), this.getRefinementListWidget('#radios-menu', 'radios'),\n      // this.getRefinementListWidget('#srclist-menu', 'srcList'),\n      this.getStartTimeRangeWidget()];\n      const mainWidgets = [this.getSearchBoxWidget(), this.getSortByWidget(shouldUseTypesense), this.getCurrentRefinementsWidget(), this.getStatsWidget(), this.getHitsWidget(), this.getPaginationWidget(), this.getHitsPerPageWidget()];\n      if (this.onTranscriptMapPage) {\n        if (this.indexName == this.paidIndexName) {\n          mainWidgets.push(this.getGeoSearchWidgetGoogle());\n        } else {\n          mainWidgets.push(this.getGeoSearchWidgetLeaflet());\n        }\n      }\n      this.search.addWidgets(mainWidgets.concat(sidebarWidgets));\n      this.search.start();\n      return this.search;\n    }\n    resetFilters() {\n      this.search.setUiState(this.defaultRouteState);\n    }\n    setChicagoFilters() {\n      // Deep copy the default state\n      const uiState = JSON.parse(JSON.stringify(this.defaultRouteState));\n      uiState[this.indexName]['refinementList'] = {\n        short_name: ['chi_cpd', 'chi_cfd', 'chi_oemc']\n      };\n      this.search.setUiState(uiState);\n    }\n    getSearchRouter(isUsingTypesense) {\n      const windowTitle = routeState => {\n        const indexState = routeState[this.indexName] || {};\n        if (!indexState.query) {\n          return 'Search Scanner Transcripts | CrimeIsDown.com';\n        }\n        return `${indexState.query} - Search Scanner Transcripts | CrimeIsDown.com`;\n      };\n      const parseURL = ({\n        qsModule,\n        location\n      }) => {\n        const routeState = qsModule.parse(location.search.slice(1), {\n          arrayLimit: 99\n        });\n        if (!Object.keys(routeState).length) {\n          return this.defaultRouteState;\n        }\n        const indexName = Object.keys(routeState)[0];\n        if (routeState[indexName].sortBy && isUsingTypesense) {\n          routeState[indexName].sortBy = routeState[indexName].sortBy.replace(`${indexName}:`, `${indexName}/sort/`);\n        }\n        if (routeState[this.demoIndexName] && this.hasAccess) {\n          delete Object.assign(routeState, {\n            [this.indexName]: routeState[this.demoIndexName]\n          })[this.demoIndexName];\n        }\n        return routeState;\n      };\n      const createURL = ({\n        qsModule,\n        routeState,\n        location\n      }) => {\n        if (Object.keys(routeState).length) {\n          const indexName = Object.keys(routeState)[0];\n          if (routeState[indexName].sortBy && isUsingTypesense) {\n            routeState[indexName].sortBy = routeState[indexName].sortBy.replace(`${indexName}/sort/`, `${indexName}:`);\n          }\n        }\n        const {\n          protocol,\n          hostname,\n          port = '',\n          pathname,\n          hash\n        } = location;\n        const queryString = qsModule.stringify(routeState);\n        const portWithPrefix = port === '' ? '' : `:${port}`;\n\n        // IE <= 11 has no proper `location.origin` so we cannot rely on it.\n        if (!queryString) {\n          return `${protocol}//${hostname}${portWithPrefix}${pathname}${hash}`;\n        }\n        return `${protocol}//${hostname}${portWithPrefix}${pathname}?${queryString}${hash}`;\n      };\n      return (0, _routers.history)({\n        windowTitle,\n        createURL,\n        parseURL,\n        cleanUrlOnDispose: true\n      });\n    }\n    getSearchBoxWidget() {\n      let timerId;\n      return (0, _widgets.searchBox)({\n        container: '#searchbox',\n        cssClasses: {\n          input: 'form-control'\n        },\n        queryHook(query, refine) {\n          clearTimeout(timerId);\n          timerId = setTimeout(() => refine(query), 500);\n        }\n      });\n    }\n    getSortByWidget(isUsingTypesense) {\n      return (0, _widgets.sortBy)({\n        container: '#sort-by',\n        cssClasses: {\n          select: 'form-select'\n        },\n        items: [{\n          label: 'Newest First',\n          value: this._buildSortString(this.newestFirstSort, this.indexName, isUsingTypesense)\n        }, {\n          label: 'Oldest First',\n          value: this._buildSortString(this.oldestFirstSort, this.indexName, isUsingTypesense)\n        }, {\n          label: 'Relevance',\n          value: this._buildSortString(undefined, this.indexName, isUsingTypesense)\n        }]\n      });\n    }\n    _buildSortString(sortBy, indexName, isUsingTypesense) {\n      if (!sortBy) {\n        return indexName;\n      }\n      return isUsingTypesense ? `${indexName}/sort/${sortBy}` : `${indexName}:${sortBy}`;\n    }\n    getHitsPerPageWidget() {\n      return (0, _widgets.hitsPerPage)({\n        container: '#hits-per-page',\n        cssClasses: {\n          select: 'form-select'\n        },\n        items: [{\n          label: '20 per page',\n          value: 20,\n          default: true\n        }, {\n          label: '40 per page',\n          value: 40\n        }, {\n          label: '60 per page',\n          value: 60\n        }]\n      });\n    }\n    getClearRefinementsWidget() {\n      return (0, _widgets.clearRefinements)({\n        container: '#clear-refinements',\n        templates: {\n          resetLabel({\n            hasRefinements\n          }, {\n            html\n          }) {\n            return html`<span\n            >${hasRefinements ? 'Clear filters' : 'No filters'}</span\n          >`;\n          }\n        }\n      });\n    }\n    getCurrentRefinementsWidget() {\n      const transformItems = items => {\n        return items.map(item => {\n          if (item.attribute == 'start_time') {\n            for (const refinement of item.refinements) {\n              refinement.label = refinement.label.replace(refinement.value, new Date(refinement.value * 1000).toLocaleString([], {\n                year: 'numeric',\n                month: 'numeric',\n                day: 'numeric',\n                hour: 'numeric',\n                minute: '2-digit'\n              }));\n            }\n          }\n          if (item.attribute == 'short_name') {\n            for (const refinement of item.refinements) {\n              refinement.label = this.systemLabels[refinement.value];\n            }\n          }\n          if (item.attribute == 'talkgroup_hierarchy.lvl0') {\n            item.label = 'Sys/Dept/TG';\n            for (const refinement of item.refinements) {\n              const levels = refinement.label.split(' > ');\n              refinement.label = refinement.label.replace(levels[0], this.systemLabels[levels[0]]);\n            }\n          }\n          switch (item.attribute) {\n            case 'short_name':\n              item.label = 'System';\n              break;\n            case 'talkgroup_group':\n              item.label = 'Department';\n              break;\n            case 'talkgroup_tag':\n              item.label = 'Talkgroup';\n              break;\n            case 'srcList':\n              item.label = 'Sources';\n              break;\n            case 'start_time':\n              item.label = 'Call Time';\n              break;\n          }\n          return item;\n        });\n      };\n      return (0, _widgets.currentRefinements)({\n        container: '#current-refinements',\n        cssClasses: {\n          list: 'd-block',\n          item: 'me-2'\n        },\n        transformItems\n      });\n    }\n    getStatsWidget() {\n      return (0, _widgets.stats)({\n        container: '#stats',\n        templates: {\n          text: function text(props) {\n            let text = _stats.defaultTemplates.text(props);\n            if (props.hasManyResults && props.nbHits === 1000) {\n              text = `&ge;${text}`;\n            }\n            return text;\n          }\n        }\n      });\n    }\n    getHitsWidget() {\n      const render = renderOptions => {\n        const {\n          hits\n        } = renderOptions;\n        hits.map(this.processHit.bind(this));\n        this.hits = hits;\n      };\n      return (0, _connectHits.default)(render)();\n    }\n    getRefinementListWidget(container, attribute, transformItems = undefined) {\n      return (0, _widgets.refinementList)({\n        container,\n        attribute,\n        operator: 'or',\n        showMore: true,\n        showMoreLimit: 60,\n        searchable: true,\n        cssClasses: {\n          label: ['form-check-label'],\n          checkbox: ['form-check-input'],\n          item: ['form-check'],\n          count: ['ms-1']\n        },\n        transformItems\n      });\n    }\n    getHierarchicalMenuWidget(container, attributes, transformItems = undefined) {\n      return (0, _widgets.hierarchicalMenu)({\n        container,\n        attributes,\n        limit: 60,\n        transformItems\n      });\n    }\n    getStartTimeRangeWidget() {\n      const render = (renderOptions, isFirstRender) => {\n        const {\n          start,\n          refine\n        } = renderOptions;\n        const [min, max] = start;\n        if (isFinite(min)) {\n          this.minStartTime = new Date(min * 1000);\n        } else {\n          this.minStartTime = this.flatpickrOptions.minDefaultDate;\n        }\n        if (isFinite(max)) {\n          this.maxStartTime = new Date(max * 1000);\n        } else {\n          this.maxStartTime = new Date();\n        }\n        if (isFirstRender) {\n          this.updateStartTimeFilter = refine;\n        }\n      };\n      return (0, _connectRange.default)(render.bind(this))({\n        container: '#time-input',\n        attribute: 'start_time'\n      });\n    }\n    getPaginationWidget() {\n      return (0, _widgets.pagination)({\n        container: '#pagination',\n        totalPages: 50\n      });\n    }\n    getGeoSearchWidgetLeaflet() {\n      const globalThis = this;\n      let map = null;\n      let markers = [];\n      const renderGeoSearch = (renderOptions, isFirstRender) => {\n        console.log(renderOptions);\n        const {\n          items,\n          position,\n          widgetParams\n        } = renderOptions;\n        if (isFirstRender) {\n          map = L.map(document.querySelector(widgetParams.container));\n          L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n            attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n          }).addTo(map);\n        }\n        markers.forEach(marker => marker.remove());\n        const layerGroup = L.markerClusterGroup({\n          disableClusteringAtZoom: 12\n        }).addTo(map);\n        markers = items.map(item => {\n          const maxTime = (globalThis.maxStartTime ? globalThis.maxStartTime : new Date()).getTime() / 1000;\n          const minTime = (globalThis.minStartTime ? globalThis.minStartTime : new Date()).getTime() / 1000;\n          const duration = Math.max(1, maxTime - minTime);\n          const marker = L.marker([item._geoloc.lat, item._geoloc.lng], {\n            title: item.geo_formatted_address,\n            opacity: Math.max(0.7, Math.min(1 - (maxTime - item.start_time) / duration, 1))\n          }).addTo(layerGroup);\n          if (typeof item.raw_metadata === 'string') {\n            globalThis.processHit(item);\n          }\n          if (!item.time_warning) {\n            item.time_warning = '';\n          }\n          const popup = `\n          <h4 class=\"fs-5\">\n            <a href=\"${item.contextUrl}\">\n              ${item.talkgroup_description}\n            </a>\n          </h4>\n          <h5 class=\"fs-6\">${item.geo_formatted_address}</h5>\n          <p>\n            <strong>\n              <a href=\"${item.permalink}\">${item.start_time_string}</a> (${item.relative_time})\n            </strong>\n            ${item.time_warning}\n          </p>\n          <audio\n            id=\"call-audio-${item.id}\"\n            class=\"call-audio\"\n            src=\"${item.raw_audio_url}\"\n            controls\n          ></audio>\n          <div style=\"max-height: 200px; overflow: auto\">\n            <p>${item.transcript}</p>\n          </div>\n          `;\n          marker.bindPopup(popup);\n        });\n        if (markers.length) {\n          map.fitBounds(layerGroup.getBounds());\n        } else {\n          map.setView(position || widgetParams.initialPosition, widgetParams.initialZoom);\n        }\n      };\n      const customGeoSearch = (0, _connectGeoSearch.default)(renderGeoSearch);\n      return customGeoSearch({\n        container: '#geo-search',\n        initialPosition: {\n          lat: 41.85,\n          lng: -87.63\n        },\n        initialZoom: 11,\n        enableRefineOnMapMove: false\n      });\n    }\n    getGeoSearchWidgetGoogle() {\n      const globalThis = this;\n      return (0, _widgets.geoSearch)({\n        container: '#geo-search',\n        googleReference: window.google,\n        initialPosition: {\n          lat: 41.85,\n          lng: -87.63\n        },\n        initialZoom: 11,\n        mapOptions: {\n          streetViewControl: true\n        },\n        enableRefineOnMapMove: false,\n        builtInMarker: {\n          createOptions(item) {\n            const maxTime = (globalThis.maxStartTime ? globalThis.maxStartTime : new Date()).getTime() / 1000;\n            const minTime = (globalThis.minStartTime ? globalThis.minStartTime : new Date()).getTime() / 1000;\n            const duration = Math.max(1, maxTime - minTime);\n            return {\n              title: item.geo_formatted_address,\n              opacity: Math.max(0.3, Math.min(1 - (maxTime - item.start_time) / duration, 1))\n            };\n          },\n          events: {\n            click({\n              item,\n              marker,\n              map\n            }) {\n              if (typeof item.raw_metadata === 'string') {\n                globalThis.processHit(item);\n              }\n              if (!item.time_warning) {\n                item.time_warning = '';\n              }\n              const infowindow = new window.google.maps.InfoWindow({\n                content: `\n                <h4 class=\"fs-5\">\n                  <a class=\"btn btn-sm btn-primary\" href=\"${item.contextUrl}\">\n                    Filter to\n                  </a>\n                  ${item.talkgroup_description}\n                </h4>\n                <h5 class=\"fs-6\">${item.geo_formatted_address}</h5>\n                <p>\n                  <strong>\n                    <a href=\"${item.permalink}\">${item.start_time_string}</a> (${item.relative_time})\n                  </strong>\n                  ${item.time_warning}\n                </p>\n                <audio\n                  id=\"call-audio-${item.id}\"\n                  class=\"call-audio\"\n                  src=\"${item.raw_audio_url}\"\n                  controls\n                ></audio>\n                <p>${item.transcript}</p>\n                `\n              });\n              infowindow.open({\n                anchor: marker,\n                map\n              });\n            }\n          }\n        }\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"config\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"metrics\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"session\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"addressLookup\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"store\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor6 = _applyDecoratedDescriptor(_class.prototype, \"hasAccess\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return undefined;\n    }\n  }), _descriptor7 = _applyDecoratedDescriptor(_class.prototype, \"onTranscriptMapPage\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return window.location.pathname == '/transcripts/map';\n    }\n  }), _descriptor8 = _applyDecoratedDescriptor(_class.prototype, \"apiKeys\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {\n        meilisearch: '1a2c3a6df6f35d50d14e258133e34711f4465ecc146bb4ceed61466e231ee698',\n        typesense: '7vUioGzExKzeFR7xMCdW9WnQtYKtHPwj'\n      };\n    }\n  }), _descriptor9 = _applyDecoratedDescriptor(_class.prototype, \"indexName\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return this.demoIndexName;\n    }\n  }), _descriptor0 = _applyDecoratedDescriptor(_class.prototype, \"latestIndexName\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor1 = _applyDecoratedDescriptor(_class.prototype, \"hits\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor10 = _applyDecoratedDescriptor(_class.prototype, \"selectedHit\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _descriptor11 = _applyDecoratedDescriptor(_class.prototype, \"useMediaPlayerComponent\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return (\n        // Check if we are at the lg Bootstrap breakpoint\n        window.matchMedia('(min-width: 992px)').matches\n      );\n    }\n  }), _descriptor12 = _applyDecoratedDescriptor(_class.prototype, \"autoRefreshInterval\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _descriptor13 = _applyDecoratedDescriptor(_class.prototype, \"minStartTime\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor14 = _applyDecoratedDescriptor(_class.prototype, \"maxStartTime\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor15 = _applyDecoratedDescriptor(_class.prototype, \"currentSearch\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor16 = _applyDecoratedDescriptor(_class.prototype, \"savedSearches\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return (0, _array.A)([]);\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"updateLatestIndex\", [_emberConcurrency.task], Object.getOwnPropertyDescriptor(_class.prototype, \"updateLatestIndex\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"setIndexName\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setIndexName\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"setStartTimeRange\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setStartTimeRange\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"refresh\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"refresh\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"toggleAutoRefresh\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"toggleAutoRefresh\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"getContext\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"getContext\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"initSavedSearches\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"initSavedSearches\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"saveSearch\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"saveSearch\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"updateSavedSearch\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"updateSavedSearch\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"deleteSavedSearch\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"deleteSavedSearch\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"didInsertHit\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"didInsertHit\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"playAudio\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"playAudio\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"getSrcFilterLink\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"getSrcFilterLink\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"filterSrc\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"filterSrc\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"setupSearch\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setupSearch\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"resetFilters\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"resetFilters\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"setChicagoFilters\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setChicagoFilters\"), _class.prototype), _class);\n});","define(\"crimeisdown/components/virtual-scanner\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/array\", \"fetch\"], function (_exports, _component, _tracking, _object, _array, _fetch) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  /*global MediaElementPlayer, mejs*/\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/object\",0,\"@ember/array\",0,\"fetch\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let VirtualScanner = _exports.default = (_class = class VirtualScanner extends _component.default {\n    constructor() {\n      super(...arguments);\n      _defineProperty(this, \"dragScale\", 50);\n      _initializerDefineProperty(this, \"streams\", _descriptor, this);\n      _initializerDefineProperty(this, \"enabledStreams\", _descriptor2, this);\n      this.loadStreamsPromise = this.loadStreams();\n    }\n    async loadStreams() {\n      let nodes = [];\n      try {\n        const response = await (0, _fetch.default)('https://audio.crimeisdown.com/streaming/stat');\n        if (response.status == 200) {\n          const parser = new window.DOMParser().parseFromString(await response.text(), 'text/xml');\n          nodes = parser.querySelectorAll('live stream');\n        }\n      } catch (e) {\n        console.error(e);\n      }\n      for (const node of nodes) {\n        if (node.querySelector('active')) {\n          let streamData = {\n            name: node.querySelector('name').textContent,\n            desc: node.querySelector('name').textContent,\n            order: 999\n          };\n          for (const [index, stream] of this.args.streams.entries()) {\n            if (stream.slug === streamData.name) {\n              streamData = {\n                name: streamData.name,\n                desc: stream.shortname ?? stream.name,\n                order: index,\n                openmhz: stream.openmhz\n              };\n              break;\n            }\n          }\n          this.streams.pushObject(streamData);\n        }\n      }\n      for (const [index, stream] of this.args.streams.entries()) {\n        if (stream.broadcastify) {\n          stream.broadcastifyUrl = 'https://www.broadcastify.com/listen/feed/' + stream.broadcastifyId;\n        }\n        if (!this.streams.find(streamObj => streamObj.name == stream.slug) && (stream.broadcastify || stream.name.startsWith('CFD') || stream.name.startsWith('CPD Citywide'))) {\n          this.streams.pushObject({\n            name: stream.slug,\n            desc: stream.shortname ?? stream.name,\n            order: index,\n            broadcastify: stream.broadcastify,\n            broadcastifyUrl: stream.broadcastifyUrl,\n            openmhz: stream.openmhz,\n            disabled: stream.name.startsWith('CFD') || stream.name.startsWith('CPD Citywide')\n          });\n        }\n      }\n      this.streams.sort((a, b) => {\n        if (a.order < b.order) return -1;\n        if (a.order > b.order) return 1;\n        return 0;\n      });\n    }\n    setupDraggable() {\n      const onmove = event => {\n        let target = event.target,\n          // keep the dragged position in the data-x/data-y attributes\n          x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,\n          y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n        x = Math.max(0, x);\n        y = Math.max(0, y);\n        target.style.webkitTransform = target.style.transform = 'translate(' + x + 'px, ' + y + 'px)';\n        target.setAttribute('data-x', x);\n        target.setAttribute('data-y', y);\n      };\n      const onend = event => {\n        let target = event.target,\n          x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,\n          y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n        let streamName = event.target.id.replace('drag-', '');\n        let streamData = this.enabledStreams.findBy('name', streamName);\n        if (streamData) {\n          let roomPos = this.dragPositionToRoomPosition(x, y);\n          if (streamData.soundSource) {\n            streamData.soundSource.setPosition(roomPos.x, roomPos.y, roomPos.z);\n          } else if (streamData.panner) {\n            streamData.panner.pan.setValueAtTime(roomPos.x / 2, this.audioContext.currentTime);\n          }\n        }\n      };\n      window.interact('.draggable').draggable({\n        restrict: {\n          restriction: '.draggable-parent',\n          endOnly: true\n        },\n        autoScroll: true,\n        onmove,\n        onend\n      });\n    }\n    async changeStreams(event) {\n      await this.loadStreamsPromise;\n      if (event.target.checked) {\n        this.setupResonanceScene();\n        this.enabledStreams.pushObject(_object.default.create(this.streams.findBy('name', event.target.value)));\n      } else {\n        this.removeStream(event.target.value);\n      }\n    }\n    seekStream(time) {\n      if (this.mediaSourceSupported) {\n        this.player.seek(time);\n      } else {\n        this.playerElement.fastSeek(time);\n      }\n    }\n    setupResonanceScene() {\n      // Only do this if we haven't run it before\n      if (this.audioContext) return;\n      if (!(window.AudioContext || window.webkitAudioContext)) {\n        alert('Sorry, your browser does not support our own audio streaming. Please check out some of the other streaming links on this page, or switch to a browser like Chrome that is supported.');\n        return;\n      }\n\n      // Instantiate the context on user interaction\n      this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n      this.mediaSourceSupported = ('MediaSource' in window || 'WebKitMediaSource' in window) && !mejs.Features.isiOS;\n      this.sceneDimensions = {\n        width: 4,\n        height: 4,\n        depth: 4\n      };\n      this.sceneMaterials = {\n        left: 'uniform',\n        right: 'uniform',\n        up: 'transparent',\n        down: 'transparent',\n        front: 'uniform',\n        back: 'uniform'\n      };\n      const resonanceAudioSupported = this.mediaSourceSupported;\n      if (resonanceAudioSupported && this.audioContext) {\n        this.resonanceScene = new window.ResonanceAudio(this.audioContext, {\n          ambisonicOrder: 1\n        });\n\n        // Commented out b/c of https://github.com/resonance-audio/resonance-audio-web-sdk/issues/16\n        // this.resonanceScene.setRoomProperties(this.sceneDimensions, this.sceneMaterials);\n        this.resonanceScene.output.connect(this.audioContext.destination);\n      }\n    }\n    async startStream(streamName) {\n      let streamData = this.enabledStreams.findBy('name', streamName);\n      let playerElement = document.getElementById('audio-player-' + streamName);\n\n      // AudioContext must be resumed after the document received a user gesture to enable audio playback.\n      this.audioContext.resume();\n      let player = await this.buildPlayer(streamData, playerElement);\n      await player.load();\n      streamData.set('position', this.randomPosition(this.sceneDimensions.width, this.sceneDimensions.height, this.sceneDimensions.depth));\n      streamData.set('draggableElement', this.addDraggable(streamName, streamData.position));\n      player.media.addEventListener('canplay', this.onCanPlay.bind(this, streamData));\n    }\n    async onCanPlay(streamData, event) {\n      const target = event.detail.target;\n      target.removeEventListener('canplay', this.onCanPlay.bind(this, streamData));\n      // Get the real media element\n      let playerElement = target.renderer;\n      if (!playerElement) {\n        playerElement = target.player.domNode;\n      }\n      if (streamData.audioElementSource) {\n        console.error('Already existing audioElementSource for element ' + playerElement.id);\n        return;\n      }\n      const audioElementSource = this.audioContext.createMediaElementSource(playerElement);\n      streamData.set('audioElementSource', audioElementSource);\n      const analyser = this.audioContext.createAnalyser();\n      analyser.smoothingTimeConstant = 1;\n      analyser.fftSize = 256; // the total samples are half the fft size.\n      streamData.audioElementSource.connect(analyser);\n      streamData.set('analyser', analyser);\n      let volume = this.audioContext.createGain();\n      target.addEventListener('volumechange', () => {\n        volume.gain.setValueAtTime(target.getVolume(), this.audioContext.currentTime);\n      });\n      streamData.analyser.connect(volume);\n      streamData.set('volume', volume);\n      if (this.resonanceScene) {\n        const soundSource = this.resonanceScene.createSource();\n        soundSource.setPosition(streamData.position.x, 0, streamData.position.z);\n        volume.connect(soundSource.input);\n        streamData.set('soundSource', soundSource);\n      } else {\n        const panner = this.audioContext.createStereoPanner();\n        panner.pan.value = streamData.position.x / 2;\n        volume.connect(panner);\n        panner.connect(this.audioContext.destination);\n        streamData.set('panner', panner);\n      }\n      if (analyser) {\n        this.drawVU(analyser, streamData.draggableElement, 0);\n      }\n      try {\n        await target.play();\n      } catch (e) {\n        alert(`Error playing ${streamData.name}: ${e}`);\n      }\n    }\n    async buildPlayer(streamData, playerElement) {\n      let audioPlayer;\n      let mediaElementConfig = {\n        pluginPath: 'https://cdn.jsdelivr.net/npm/mediaelement@5.1.0/build/',\n        iconSprite: '/assets/images/mejs-controls.svg',\n        shimScriptAccess: 'always',\n        isVideo: false,\n        pauseOtherPlayers: false,\n        features: ['playpause', 'current', 'volume']\n      };\n      if (streamData.broadcastify) {\n        audioPlayer = new MediaElementPlayer(playerElement, {\n          renderers: ['html5'],\n          ...mediaElementConfig\n        });\n        audioPlayer.setSrc({\n          src: streamData.broadcastify,\n          type: 'audio/mpeg'\n        });\n      } else if (this.mediaSourceSupported) {\n        audioPlayer = new MediaElementPlayer(playerElement, {\n          renderers: ['native_dash', 'flash_dash'],\n          dash: {\n            path: 'https://cdn.dashjs.org/v3.2.0/dash.all.min.js'\n          },\n          ...mediaElementConfig\n        });\n        audioPlayer.setSrc({\n          src: 'https://audio.crimeisdown.com/streaming/dash/' + streamData.name + '/',\n          type: 'application/dash+xml'\n        });\n      } else {\n        audioPlayer = new MediaElementPlayer(playerElement, {\n          renderers: ['html5', 'native_hls', 'flash_hls'],\n          hls: {\n            path: 'https://cdn.jsdelivr.net/npm/hls.js@0.14.17'\n          },\n          ...mediaElementConfig\n        });\n        audioPlayer.setSrc({\n          src: 'https://audio.crimeisdown.com/streaming/hls/' + streamData.name + '/index.m3u8',\n          type: 'application/x-mpegURL'\n        });\n      }\n      return audioPlayer;\n    }\n    removeStream(streamName) {\n      const streamData = this.enabledStreams.findBy('name', streamName);\n      if (streamData.soundSource) streamData.soundSource.input.disconnect();\n      if (streamData.panner) streamData.panner.disconnect();\n      if (streamData.volume) streamData.volume.disconnect();\n      if (streamData.analyser) streamData.analyser.disconnect();\n      if (streamData.audioElementSource) streamData.audioElementSource.disconnect();\n      this.enabledStreams.removeObject(streamData);\n    }\n    addDraggable(streamName, roomPosition) {\n      const draggableElement = document.getElementById('drag-' + streamName);\n      const dragPos = this.roomPositionToDragPosition(roomPosition);\n      draggableElement.style.transform = 'translate(' + dragPos.dragX + 'px, ' + dragPos.dragY + 'px)';\n      draggableElement.setAttribute('data-x', dragPos.dragX);\n      draggableElement.setAttribute('data-y', dragPos.dragY);\n      return draggableElement;\n    }\n    drawVU(analyser, element, lastVal) {\n      const array = new Uint8Array(analyser.fftSize);\n      analyser.getByteTimeDomainData(array);\n      let max = 0;\n      for (let i = 0; i < array.length; i++) {\n        max = Math.max(max, Math.abs(array[i] - 128));\n      }\n      const val = Math.round(max * 16);\n\n      // optimization to avoid unnecessary repaints\n      if (val !== lastVal) {\n        element.style.color = 'rgb(0,' + val + ',0)';\n      }\n      requestAnimationFrame(() => {\n        this.drawVU(analyser, element, val);\n      });\n    }\n    randomPosition(width, height, depth) {\n      function randomAxisPosition(len) {\n        const max = len / 2;\n        const min = -len / 2;\n        return (Math.random() * (max - min) + min) * 0.9;\n      }\n      return {\n        x: randomAxisPosition(width),\n        y: 0,\n        z: randomAxisPosition(depth)\n      };\n    }\n    roomPositionToDragPosition(position) {\n      return {\n        dragX: (position.x + this.sceneDimensions.width / 2) * this.dragScale,\n        dragY: (position.z + this.sceneDimensions.depth / 2) * this.dragScale\n      };\n    }\n    dragPositionToRoomPosition(x, y) {\n      const maxWidth = this.sceneDimensions.width / 2;\n      const maxDepth = this.sceneDimensions.depth / 2;\n      return {\n        x: Math.min(maxWidth, Math.max(-maxWidth, x / this.dragScale - maxWidth)),\n        y: 0,\n        z: Math.min(maxDepth, Math.max(-maxDepth, y / this.dragScale - maxDepth))\n      };\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"streams\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return (0, _array.A)([]);\n    }\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"enabledStreams\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return (0, _array.A)([]);\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"setupDraggable\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setupDraggable\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"changeStreams\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"changeStreams\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"seekStream\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"seekStream\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"startStream\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"startStream\"), _class.prototype), _class);\n});","define(\"crimeisdown/container-debug-adapter\", [\"exports\", \"ember-resolver/container-debug-adapter\"], function (_exports, _containerDebugAdapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _containerDebugAdapter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-resolver/container-debug-adapter\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/controllers/audio\", [\"exports\", \"@ember/controller\", \"@ember/service\"], function (_exports, _controller, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/controller\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let AudioController = _exports.default = (_class = class AudioController extends _controller.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"session\", _descriptor, this);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"session\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/data-adapter\", [\"exports\", \"@ember-data/debug/data-adapter\"], function (_exports, _dataAdapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _dataAdapter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/debug/data-adapter\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/-base\", [\"exports\", \"ember-moment/helpers/-base\"], function (_exports, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _base.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/-base\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/and\", [\"exports\", \"ember-truth-helpers/helpers/and\"], function (_exports, _and) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _and.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/and\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/app-version\", [\"exports\", \"@ember/component/helper\", \"crimeisdown/config/environment\", \"ember-cli-app-version/utils/regexp\"], function (_exports, _helper, _environment, _regexp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.appVersion = appVersion;\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/helper\",0,\"crimeisdown/config/environment\",0,\"ember-cli-app-version/utils/regexp\"eaimeta@70e063a35619d71f\n  function appVersion(_, hash = {}) {\n    const version = _environment.default.APP.version;\n    // e.g. 1.0.0-alpha.1+4jds75hf\n\n    // Allow use of 'hideSha' and 'hideVersion' For backwards compatibility\n    let versionOnly = hash.versionOnly || hash.hideSha;\n    let shaOnly = hash.shaOnly || hash.hideVersion;\n    let match = null;\n    if (versionOnly) {\n      if (hash.showExtended) {\n        match = version.match(_regexp.versionExtendedRegExp); // 1.0.0-alpha.1\n      }\n      // Fallback to just version\n      if (!match) {\n        match = version.match(_regexp.versionRegExp); // 1.0.0\n      }\n    }\n    if (shaOnly) {\n      match = version.match(_regexp.shaRegExp); // 4jds75hf\n    }\n    return match ? match[0] : version;\n  }\n  var _default = _exports.default = (0, _helper.helper)(appVersion);\n});","define(\"crimeisdown/helpers/cancel-all\", [\"exports\", \"ember-concurrency/helpers/cancel-all\"], function (_exports, _cancelAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _cancelAll.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/helpers/cancel-all\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/eq\", [\"exports\", \"ember-truth-helpers/helpers/eq\"], function (_exports, _eq) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _eq.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/eq\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/gt\", [\"exports\", \"ember-truth-helpers/helpers/gt\"], function (_exports, _gt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _gt.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/gt\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/gte\", [\"exports\", \"ember-truth-helpers/helpers/gte\"], function (_exports, _gte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _gte.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/gte\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/includes\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.includes = includes;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/helper\"eaimeta@70e063a35619d71f\n  function includes(params /*, hash*/) {\n    return params[0].includes(params[1]);\n  }\n  var _default = _exports.default = (0, _helper.helper)(includes);\n});","define(\"crimeisdown/helpers/is-after\", [\"exports\", \"ember-moment/helpers/is-after\"], function (_exports, _isAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isAfter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/is-after\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-array\", [\"exports\", \"ember-truth-helpers/helpers/is-array\"], function (_exports, _isArray) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isArray.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/is-array\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-before\", [\"exports\", \"ember-moment/helpers/is-before\"], function (_exports, _isBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isBefore.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/is-before\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-between\", [\"exports\", \"ember-moment/helpers/is-between\"], function (_exports, _isBetween) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isBetween.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/is-between\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-empty\", [\"exports\", \"ember-truth-helpers/helpers/is-empty\"], function (_exports, _isEmpty) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isEmpty.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/is-empty\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-equal\", [\"exports\", \"ember-truth-helpers/helpers/is-equal\"], function (_exports, _isEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isEqual.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/is-equal\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-same-or-after\", [\"exports\", \"ember-moment/helpers/is-same-or-after\"], function (_exports, _isSameOrAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isSameOrAfter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/is-same-or-after\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-same-or-before\", [\"exports\", \"ember-moment/helpers/is-same-or-before\"], function (_exports, _isSameOrBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isSameOrBefore.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/is-same-or-before\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/is-same\", [\"exports\", \"ember-moment/helpers/is-same\"], function (_exports, _isSame) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isSame.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/is-same\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/json\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.json = json;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/helper\"eaimeta@70e063a35619d71f\n  function json(params /*, hash*/) {\n    return JSON.stringify(params[0], null, 2);\n  }\n  var _default = _exports.default = (0, _helper.helper)(json);\n});","define(\"crimeisdown/helpers/lt\", [\"exports\", \"ember-truth-helpers/helpers/lt\"], function (_exports, _lt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _lt.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/lt\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/lte\", [\"exports\", \"ember-truth-helpers/helpers/lte\"], function (_exports, _lte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _lte.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/lte\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-add\", [\"exports\", \"ember-moment/helpers/moment-add\"], function (_exports, _momentAdd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentAdd.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-add\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-calendar\", [\"exports\", \"ember-moment/helpers/moment-calendar\"], function (_exports, _momentCalendar) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentCalendar.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-calendar\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-diff\", [\"exports\", \"ember-moment/helpers/moment-diff\"], function (_exports, _momentDiff) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentDiff.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-diff\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-duration\", [\"exports\", \"ember-moment/helpers/moment-duration\"], function (_exports, _momentDuration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentDuration.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-duration\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-format\", [\"exports\", \"ember-moment/helpers/moment-format\"], function (_exports, _momentFormat) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentFormat.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-format\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-from-now\", [\"exports\", \"ember-moment/helpers/moment-from-now\"], function (_exports, _momentFromNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentFromNow.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-from-now\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-from\", [\"exports\", \"ember-moment/helpers/moment-from\"], function (_exports, _momentFrom) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentFrom.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-from\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-subtract\", [\"exports\", \"ember-moment/helpers/moment-subtract\"], function (_exports, _momentSubtract) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentSubtract.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-subtract\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-to-date\", [\"exports\", \"ember-moment/helpers/moment-to-date\"], function (_exports, _momentToDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentToDate.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-to-date\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-to-now\", [\"exports\", \"ember-moment/helpers/moment-to-now\"], function (_exports, _momentToNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentToNow.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-to-now\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment-to\", [\"exports\", \"ember-moment/helpers/moment-to\"], function (_exports, _momentTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _momentTo.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment-to\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/moment\", [\"exports\", \"ember-moment/helpers/moment\"], function (_exports, _moment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _moment.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/moment\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/not-eq\", [\"exports\", \"ember-truth-helpers/helpers/not-eq\"], function (_exports, _notEq) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _notEq.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/not-eq\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/not\", [\"exports\", \"ember-truth-helpers/helpers/not\"], function (_exports, _not) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _not.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/not\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/now\", [\"exports\", \"ember-moment/helpers/now\"], function (_exports, _now) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _now.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/now\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/or\", [\"exports\", \"ember-truth-helpers/helpers/or\"], function (_exports, _or) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _or.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/or\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/page-title\", [\"exports\", \"ember-page-title/helpers/page-title\"], function (_exports, _pageTitle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pageTitle.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-page-title/helpers/page-title\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/perform\", [\"exports\", \"ember-concurrency/helpers/perform\"], function (_exports, _perform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _perform.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/helpers/perform\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/pluralize\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = pluralize;\n  0; //eaimeta@70e063a35619d71feaimeta@70e063a35619d71f\n  function pluralize(number, s, p) {\n    const single = s || '';\n    const plural = p || single + 's';\n    return number == 1 ? single : plural;\n  }\n});","define(\"crimeisdown/helpers/route-idle\", [\"exports\", \"ember-app-scheduler/helpers/route-idle\"], function (_exports, _routeIdle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _routeIdle.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-app-scheduler/helpers/route-idle\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/task\", [\"exports\", \"ember-concurrency/helpers/task\"], function (_exports, _task) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _task.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/helpers/task\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _unix.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/unix\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/utc\", [\"exports\", \"ember-moment/helpers/utc\"], function (_exports, _utc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _utc.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/helpers/utc\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/helpers/xor\", [\"exports\", \"ember-truth-helpers/helpers/xor\"], function (_exports, _xor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xor.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/xor\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/initializers/app-version\", [\"exports\", \"ember-cli-app-version/initializer-factory\", \"crimeisdown/config/environment\"], function (_exports, _initializerFactory, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-app-version/initializer-factory\",0,\"crimeisdown/config/environment\"eaimeta@70e063a35619d71f\n  let name, version;\n  if (_environment.default.APP) {\n    name = _environment.default.APP.name;\n    version = _environment.default.APP.version;\n  }\n  var _default = _exports.default = {\n    name: 'App Version',\n    initialize: (0, _initializerFactory.default)(name, version)\n  };\n});","define(\"crimeisdown/initializers/ember-data\", [\"exports\", \"@ember-data/request-utils/deprecation-support\"], function (_exports, _deprecationSupport) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/request-utils/deprecation-support\"eaimeta@70e063a35619d71f\n  /*\n    This code initializes EmberData in an Ember application.\n  */\n  var _default = _exports.default = {\n    name: 'ember-data',\n    initialize(application) {\n      application.registerOptionsForType('serializer', {\n        singleton: false\n      });\n      application.registerOptionsForType('adapter', {\n        singleton: false\n      });\n    }\n  };\n});","define(\"crimeisdown/instance-initializers/ember-router-scroll\", [\"exports\", \"ember-router-scroll/instance-initializers/ember-router-scroll\"], function (_exports, _emberRouterScroll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberRouterScroll.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function () {\n      return _emberRouterScroll.initialize;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-router-scroll/instance-initializers/ember-router-scroll\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/instance-initializers/sentry-performance\", [\"exports\", \"@sentry/ember/instance-initializers/sentry-performance\"], function (_exports, _sentryPerformance) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _sentryPerformance.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function () {\n      return _sentryPerformance.initialize;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@sentry/ember/instance-initializers/sentry-performance\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/metrics-adapters/base\", [\"exports\", \"ember-metrics/metrics-adapters/base\"], function (_exports, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _base.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-metrics/metrics-adapters/base\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/metrics-adapters/google-analytics-four\", [\"exports\", \"ember-metrics/metrics-adapters/google-analytics-four\"], function (_exports, _googleAnalyticsFour) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _googleAnalyticsFour.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-metrics/metrics-adapters/google-analytics-four\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/metrics-adapters/google-analytics\", [\"exports\", \"ember-metrics/metrics-adapters/google-analytics\"], function (_exports, _googleAnalytics) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _googleAnalytics.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-metrics/metrics-adapters/google-analytics\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/models/notification-channel\", [\"exports\", \"@ember-data/model\"], function (_exports, _model) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let NotificationChannelModel = _exports.default = (_class = class NotificationChannelModel extends _model.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"service\", _descriptor, this);\n      _initializerDefineProperty(this, \"path\", _descriptor2, this);\n    }\n    get serviceName() {\n      switch (this.service) {\n        case 'ntfy':\n          return 'ntfy.crimeisdown.com';\n        case 'tgram':\n          return 'Telegram';\n        case 'ses':\n          return 'Email';\n        case 'sns':\n          return 'SMS';\n        default:\n          return this.service;\n      }\n    }\n    get intId() {\n      if (!this.id) {\n        return null;\n      }\n      return parseInt(this.id);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"service\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"path\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/models/saved-search\", [\"exports\", \"@ember-data/model\", \"moment-timezone\"], function (_exports, _model, _momentTimezone) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model\",0,\"moment-timezone\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let SavedSearchModel = _exports.default = (_class = class SavedSearchModel extends _model.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"user_id\", _descriptor, this);\n      _initializerDefineProperty(this, \"name\", _descriptor2, this);\n      _initializerDefineProperty(this, \"url\", _descriptor3, this);\n      _initializerDefineProperty(this, \"is_global\", _descriptor4, this);\n    }\n    get latestUrl() {\n      const currentIndex = this.url.match(/calls_\\d{4}_\\d{2}/)[0];\n      const latestIndex = 'calls_' + _momentTimezone.default.utc().format('YYYY_MM');\n      if (currentIndex != latestIndex) {\n        return this.url.replaceAll(currentIndex, latestIndex);\n      }\n      return this.url;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"user_id\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"name\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"url\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"is_global\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/models/search-talkgroup\", [\"exports\", \"@ember-data/model\"], function (_exports, _model) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let SearchTalkgroupModel = _exports.default = (_class = class SearchTalkgroupModel extends _model.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"group\", _descriptor, this);\n      _initializerDefineProperty(this, \"talkgroups\", _descriptor2, this);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"group\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"talkgroups\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/models/transcript-subscription\", [\"exports\", \"@ember-data/model\"], function (_exports, _model) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let TranscriptSubscriptionModel = _exports.default = (_class = class TranscriptSubscriptionModel extends _model.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"name\", _descriptor, this);\n      _initializerDefineProperty(this, \"enabled\", _descriptor2, this);\n      _initializerDefineProperty(this, \"keywords\", _descriptor3, this);\n      _initializerDefineProperty(this, \"ignore_keywords\", _descriptor4, this);\n      _initializerDefineProperty(this, \"location\", _descriptor5, this);\n      _initializerDefineProperty(this, \"topic\", _descriptor6, this);\n      _initializerDefineProperty(this, \"notification_channels\", _descriptor7, this);\n    }\n    get keywordsString() {\n      let keywords = this.keywords;\n      if (typeof this.keywords === 'string') {\n        try {\n          keywords = JSON.parse(this.keywords);\n        } catch {\n          // Do nothing\n        }\n      }\n      return Array.isArray(keywords) ? keywords.join('\\n') : keywords;\n    }\n    get ignoreKeywordsString() {\n      let ignore_keywords = this.ignore_keywords;\n      if (typeof this.ignore_keywords === 'string') {\n        try {\n          ignore_keywords = JSON.parse(this.ignore_keywords);\n        } catch {\n          // Do nothing\n        }\n      }\n      return Array.isArray(ignore_keywords) ? ignore_keywords.join('\\n') : ignore_keywords;\n    }\n    get topics() {\n      return this.topic.split('|');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"name\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"enabled\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"keywords\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"ignore_keywords\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"location\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor6 = _applyDecoratedDescriptor(_class.prototype, \"topic\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor7 = _applyDecoratedDescriptor(_class.prototype, \"notification_channels\", [_model.attr], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/modifiers/did-insert\", [\"exports\", \"@ember/render-modifiers/modifiers/did-insert\"], function (_exports, _didInsert) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _didInsert.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/render-modifiers/modifiers/did-insert\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/modifiers/did-update\", [\"exports\", \"@ember/render-modifiers/modifiers/did-update\"], function (_exports, _didUpdate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _didUpdate.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/render-modifiers/modifiers/did-update\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/modifiers/react\", [\"exports\", \"ember-modifier\", \"react-dom/client\", \"react\", \"@ember/destroyable\"], function (_exports, _emberModifier, _client, _react, _destroyable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-modifier\",0,\"react-dom/client\",0,\"react\",0,\"@ember/destroyable\"eaimeta@70e063a35619d71f\n  class ReactModifier extends _emberModifier.default {\n    modify(element, [reactComponent], props) {\n      if (!this.root) {\n        this.root = (0, _client.createRoot)(element);\n        (0, _destroyable.registerDestructor)(this, () => this.root.unmount());\n      }\n      this.root.render((0, _react.createElement)(reactComponent, {\n        ...props\n      }));\n    }\n  }\n  _exports.default = ReactModifier;\n});","define(\"crimeisdown/modifiers/will-destroy\", [\"exports\", \"@ember/render-modifiers/modifiers/will-destroy\"], function (_exports, _willDestroy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _willDestroy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/render-modifiers/modifiers/will-destroy\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/router\", [\"exports\", \"@ember/routing/router\", \"crimeisdown/config/environment\"], function (_exports, _router, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/router\",0,\"crimeisdown/config/environment\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  class Router extends _router.default {\n    constructor(...args) {\n      super(...args);\n      _defineProperty(this, \"location\", _environment.default.locationType);\n      _defineProperty(this, \"rootURL\", _environment.default.rootURL);\n    }\n  }\n  _exports.default = Router;\n  Router.map(function () {\n    this.route('map');\n    this.route('directives');\n    this.route('guide');\n    this.route('audio');\n    this.route('sirens');\n    this.route('not-found', {\n      path: '/*path'\n    });\n    this.route('archiveplayer', {\n      path: '/audio/archive/:filename'\n    });\n    this.route('archiveplayer', {\n      path: '/audio/archive'\n    });\n    this.route('audio-live', {\n      path: '/audio/live/:stream'\n    });\n    this.route('map-transcripts', {\n      path: '/transcripts/map'\n    });\n    this.route('search-transcripts', {\n      path: '/transcripts/search'\n    });\n    this.route('notifications', {\n      path: '/transcripts/notifications'\n    });\n    this.route('settings');\n    this.route('airshow');\n    this.route('sandbox');\n  });\n});","define(\"crimeisdown/routes/airshow\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class AirshowRoute extends _route.default {}\n  _exports.default = AirshowRoute;\n});","define(\"crimeisdown/routes/application\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let ApplicationRoute = _exports.default = (_class = class ApplicationRoute extends _route.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"metrics\", _descriptor, this);\n      _initializerDefineProperty(this, \"router\", _descriptor2, this);\n      this.router.on('routeDidChange', () => {\n        const page = this.router.currentURL;\n        const title = this.router.currentRouteName || 'unknown';\n        this.metrics.trackPage({\n          page,\n          title\n        });\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"metrics\", [_service.inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/routes/archiveplayer\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  class ArchiveplayerRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _defineProperty(this, \"queryParams\", {\n        url: {\n          refreshModel: true\n        },\n        type: {\n          refreshModel: true\n        }\n      });\n    }\n    model(params) {\n      if (!params.url) {\n        alert('ERROR: No URL param specified.');\n        return;\n      }\n      let filename = new URL(params.url).pathname.split('/').pop();\n      let type;\n      if (params.type) {\n        type = params.type;\n      } else {\n        type = 'audio/' + filename.split('.').pop(); // use file extension\n      }\n      return {\n        url: params.url,\n        filename: filename,\n        type: type\n      };\n    }\n  }\n  _exports.default = ArchiveplayerRoute;\n});","define(\"crimeisdown/routes/audio-live\", [\"exports\", \"@ember/routing/route\", \"fetch\"], function (_exports, _route, _fetch) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"fetch\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); } /*eslint-disable no-console*/\n  class AudioLiveRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _defineProperty(this, \"queryParams\", {\n        autoplay: {\n          refreshModel: true\n        }\n      });\n      _defineProperty(this, \"autoplay\", false);\n    }\n    async model(params) {\n      params.autoplay = params.autoplay === 'true';\n      try {\n        const response = await (0, _fetch.default)('/data/audio_data/online_streams.json');\n        const onlineStreams = await response.json();\n        const stream = onlineStreams.filter(stream => stream.slug === params.stream)[0];\n        if (stream) {\n          return stream;\n        }\n      } catch (error) {\n        console.error(error);\n      }\n      params.slug = params.stream;\n      delete params.stream;\n      return params;\n    }\n  }\n  _exports.default = AudioLiveRoute;\n});","define(\"crimeisdown/routes/audio\", [\"exports\", \"@ember/routing/route\", \"fetch\"], function (_exports, _route, _fetch) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"fetch\"eaimeta@70e063a35619d71f\n  class AudioRoute extends _route.default {\n    async model() {\n      let model = {};\n      const response = await (0, _fetch.default)('/data/audio_data/online_streams.json');\n      model.streams = await response.json();\n      return model;\n    }\n  }\n  _exports.default = AudioRoute;\n});","define(\"crimeisdown/routes/directives\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class DirectivesRoute extends _route.default {}\n  _exports.default = DirectivesRoute;\n});","define(\"crimeisdown/routes/guide\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class GuideRoute extends _route.default {}\n  _exports.default = GuideRoute;\n});","define(\"crimeisdown/routes/index\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let IndexRoute = _exports.default = (_class = class IndexRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"router\", _descriptor, this);\n    }\n    beforeModel() {\n      this.router.replaceWith('search-transcripts'); // no history entry\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/routes/map-transcripts\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class MapTranscriptsRoute extends _route.default {}\n  _exports.default = MapTranscriptsRoute;\n});","define(\"crimeisdown/routes/map\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class MapRoute extends _route.default {}\n  _exports.default = MapRoute;\n});","define(\"crimeisdown/routes/not-found\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class NotFoundRoute extends _route.default {}\n  _exports.default = NotFoundRoute;\n});","define(\"crimeisdown/routes/notifications\", [\"exports\", \"@ember/routing/route\", \"@ember/service\", \"rsvp\"], function (_exports, _route, _service, _rsvp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\",0,\"rsvp\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let NotificationsRoute = _exports.default = (_class = class NotificationsRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"store\", _descriptor, this);\n    }\n    model() {\n      return (0, _rsvp.hash)({\n        channels: this.store.findAll('notification-channel'),\n        subscriptions: this.store.findAll('transcript-subscription'),\n        talkgroups: this.store.findAll('search-talkgroup')\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"store\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/routes/sandbox\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class SandboxRoute extends _route.default {}\n  _exports.default = SandboxRoute;\n});","define(\"crimeisdown/routes/search-transcripts\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class SearchTranscriptsRoute extends _route.default {}\n  _exports.default = SearchTranscriptsRoute;\n});","define(\"crimeisdown/routes/settings\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class SettingsRoute extends _route.default {}\n  _exports.default = SettingsRoute;\n});","define(\"crimeisdown/routes/sirens\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class SirensRoute extends _route.default {}\n  _exports.default = SirensRoute;\n});","define(\"crimeisdown/serializers/application\", [\"exports\", \"@ember-data/serializer/json\"], function (_exports, _json) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer/json\"eaimeta@70e063a35619d71f\n  class ApplicationSerializer extends _json.default {}\n  _exports.default = ApplicationSerializer;\n});","define(\"crimeisdown/services/address-lookup\", [\"exports\", \"@ember/service\", \"@ember/object\", \"fetch\", \"@glimmer/tracking\"], function (_exports, _service, _object, _fetch, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6;\n  /*global leafletPip*/\n  0; //eaimeta@70e063a35619d71f0,\"@ember/service\",0,\"@ember/object\",0,\"fetch\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let AddressLookup = _exports.default = (_class = class AddressLookup extends _service.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"policeZones\", _descriptor, this);\n      _initializerDefineProperty(this, \"policeAreas\", _descriptor2, this);\n      _initializerDefineProperty(this, \"onlineStreams\", _descriptor3, this);\n      _initializerDefineProperty(this, \"aldermen\", _descriptor4, this);\n      _initializerDefineProperty(this, \"fireStations\", _descriptor5, this);\n      _initializerDefineProperty(this, \"traumaCenters\", _descriptor6, this);\n      this.dataLoadedPromise = this.loadData();\n    }\n    async loadData() {\n      this.onlineStreams = await (await (0, _fetch.default)('/data/audio_data/online_streams.json')).json();\n      this.aldermen = await (await (0, _fetch.default)('/data/city_data/aldermen.json')).json();\n      this.fireStations = await (await (0, _fetch.default)('/data/city_data/fire_stations.json')).json();\n      this.traumaCenters = await (await (0, _fetch.default)('/data/city_data/trauma_centers.json')).json();\n      return true;\n    }\n    async generateLocationDataForAddress(layers, loc) {\n      let result = {};\n      let latlng = L.latLng(loc.geometry.location.lat, loc.geometry.location.lng);\n      result.meta = {\n        formattedAddress: loc.formatted_address,\n        latitude: latlng.lat.toFixed(6),\n        longitude: latlng.lng.toFixed(6)\n      };\n      await this.dataLoadedPromise;\n      result.meta = this.buildMeta(layers, loc.formatted_address, latlng);\n      if (!result.meta.communityArea) {\n        result.meta.formattedAddress = result.meta.formattedAddress + ' (Not in Chicago, no additional location info available)';\n        result.meta.inChicago = false;\n      } else {\n        result.meta.inChicago = true;\n        result.police = this.buildPolice(layers, latlng);\n        result.fire = this.buildFire(latlng);\n        result.ems = this.buildEMS(latlng);\n      }\n      return result;\n    }\n    buildMeta(layers, address, loc) {\n      let meta = {\n        formattedAddress: address,\n        latitude: loc.lat.toFixed(6),\n        longitude: loc.lng.toFixed(6)\n      };\n      if (Object.prototype.hasOwnProperty.call(layers, 'communityAreas')) {\n        let result = leafletPip.pointInLayer(loc, layers.communityAreas.layer, true)[0];\n        if (result) {\n          meta.communityArea = result.feature.properties['Community Area'];\n          // Convert to title case instead of all caps\n          meta.communityArea = meta.communityArea.toLowerCase().replace(/(?:^|\\s|-|\\/)\\S/g, function (m) {\n            return m.toUpperCase();\n          });\n        }\n      }\n      if (Object.prototype.hasOwnProperty.call(layers, 'neighborhoods')) {\n        let result = leafletPip.pointInLayer(loc, layers.neighborhoods.layer, true)[0];\n        if (result) {\n          meta.neighborhood = result.feature.properties['Neighborhood'];\n        }\n      }\n      if (Object.prototype.hasOwnProperty.call(layers, 'wards')) {\n        let result = leafletPip.pointInLayer(loc, layers.wards.layer, true)[0];\n        if (result) {\n          meta.ward = result.feature.properties['Ward'];\n          meta.alderman = this.aldermen[parseInt(meta.ward) - 1];\n        }\n      }\n      return meta;\n    }\n    buildPolice(layers, loc) {\n      let police = {};\n      if (Object.prototype.hasOwnProperty.call(layers, 'policeDistricts')) {\n        let result = leafletPip.pointInLayer(loc, layers.policeDistricts.layer, true)[0];\n        if (result) {\n          police.district = result.feature.properties['Police District'].toLowerCase();\n          for (let key in this.policeZones) {\n            if (this.policeZones[key].includes(police.district)) {\n              this.onlineStreams.forEach(stream => {\n                if ('zone' + key === stream.slug) {\n                  police.zone = stream;\n                  police.zone.num = key;\n                }\n              });\n            }\n          }\n          for (let key in this.policeAreas) {\n            if (this.policeAreas[key].includes(police.district)) {\n              police.area = key;\n            }\n          }\n        }\n      }\n      if (Object.prototype.hasOwnProperty.call(layers, 'policeBeats')) {\n        let result = leafletPip.pointInLayer(loc, layers.policeBeats.layer, true)[0];\n        if (result) {\n          police.beat = result.feature.properties['Police Beat'];\n        }\n      }\n      return police;\n    }\n    buildFire(loc) {\n      let nearestEngine = {\n        distance: 99999999\n      };\n      let nearestTruck = {\n        distance: 99999999\n      };\n      let nearestSquad = {\n        distance: 99999999\n      };\n      let nearestAmbo = {\n        distance: 99999999\n      };\n      this.fireStations.forEach(station => {\n        let distance = loc.distanceTo(L.latLng(station.latitude, station.longitude));\n        if (station.engine.length && nearestEngine.distance > distance) {\n          nearestEngine = station;\n          (0, _object.set)(nearestEngine, 'distance', distance);\n        }\n        if (station.truck.length && nearestTruck.distance > distance) {\n          nearestTruck = station;\n          (0, _object.set)(nearestTruck, 'distance', distance);\n        }\n        if (station.squad.length && nearestSquad.distance > distance) {\n          nearestSquad = station;\n          (0, _object.set)(nearestSquad, 'distance', distance);\n        }\n        if (station.ambo.length && nearestAmbo.distance > distance) {\n          nearestAmbo = station;\n          (0, _object.set)(nearestAmbo, 'distance', distance);\n        }\n      });\n      return {\n        battalion: nearestEngine.batt.replace(' (HQ)', ''),\n        channel: nearestEngine.radio,\n        emsDistrict: nearestEngine.emsDist.replace(' (HQ)', ''),\n        fireDistrict: nearestEngine.fireDist.replace(' (HQ)', ''),\n        nearestAmbo: nearestAmbo,\n        nearestEngine: nearestEngine,\n        nearestTruck: nearestTruck,\n        nearestSquad: nearestSquad\n      };\n    }\n    buildEMS(loc) {\n      let nearestTraumaAdult = {\n        distance: 99999999\n      };\n      let nearestTraumaPed = {\n        distance: 99999999\n      };\n      this.traumaCenters.forEach(hospital => {\n        let distance = loc.distanceTo(L.latLng(hospital.latitude, hospital.longitude));\n        if (hospital.level1Adult && nearestTraumaAdult.distance > distance) {\n          nearestTraumaAdult = hospital;\n          (0, _object.set)(nearestTraumaAdult, 'distance', distance);\n          (0, _object.set)(nearestTraumaAdult, 'distanceMi', Math.round(distance * 0.000621371192 * 100) / 100);\n        }\n        if (hospital.level1Ped && nearestTraumaPed.distance > distance) {\n          nearestTraumaPed = hospital;\n          (0, _object.set)(nearestTraumaPed, 'distance', distance);\n          (0, _object.set)(nearestTraumaPed, 'distanceMi', Math.round(distance * 0.000621371192 * 100) / 100);\n        }\n      });\n      return {\n        nearestTraumaAdult: nearestTraumaAdult,\n        nearestTraumaPed: nearestTraumaPed\n      };\n    }\n    findStation(query = '') {\n      query = query.toUpperCase();\n      let HQ = ' (HQ)';\n      let results = [];\n      this.fireStations.forEach(station => {\n        let searchable = [];\n        if (station.engine) {\n          searchable = searchable.concat(station.engine.split(/, ?/));\n        }\n        if (station.truck) {\n          searchable = searchable.concat(station.truck.split(/, ?/));\n        }\n        if (station.ambo) {\n          searchable = searchable.concat(station.ambo.split(/, ?/));\n        }\n        if (station.special) {\n          searchable = searchable.concat(station.special.split(/, ?/));\n        }\n        if (station.squad) {\n          searchable.push(station.squad.substring(0, station.squad.indexOf('/')));\n        }\n        if (station.batt.indexOf(HQ)) {\n          searchable.push('BC' + station.batt.substring(0, station.batt.indexOf(HQ)));\n        }\n        if (station.fireDist.indexOf(HQ)) {\n          searchable.push('2-2-' + station.fireDist.substring(0, station.fireDist.indexOf(HQ)));\n        }\n        if (station.emsDist.indexOf(HQ)) {\n          searchable.push('4-5-' + station.emsDist.substring(0, station.emsDist.indexOf(HQ)));\n        }\n        if (searchable.indexOf(query) !== -1) {\n          results.push(station);\n        }\n      });\n      return results;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"policeZones\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {\n        1: ['16', '17'],\n        2: ['19'],\n        3: ['12', '14'],\n        4: ['1', '18'],\n        6: ['7', '8'],\n        7: ['2', '3'],\n        8: ['4', '6'],\n        9: ['5', '22'],\n        10: ['10', '11'],\n        11: ['20', '24'],\n        12: ['15', '25'],\n        13: ['9']\n      };\n    }\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"policeAreas\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {\n        North: ['11', '14', '15', '16', '17', '19', '20', '24'],\n        Central: ['1', '2', '3', '8', '9', '10', '12', '18'],\n        South: ['4', '5', '6', '7', '22']\n      };\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"onlineStreams\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"aldermen\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"fireStations\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor6 = _applyDecoratedDescriptor(_class.prototype, \"traumaCenters\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _class);\n});","define(\"crimeisdown/services/config\", [\"exports\", \"@ember/service\", \"@glimmer/tracking\", \"crimeisdown/config/environment\"], function (_exports, _service, _tracking, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"crimeisdown/config/environment\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let ConfigService = _exports.default = (_class = class ConfigService extends _service.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"ENV\", _descriptor, this);\n      const ENV = {\n        ..._environment.default.APP\n      };\n      // Delete the default envs from Ember\n      delete ENV['name'];\n      delete ENV['version'];\n      try {\n        for (const key in ENV) {\n          const value = localStorage.getItem(key);\n          if (value) {\n            ENV[key] = value;\n          }\n        }\n      } catch {\n        // Do nothing, we don't have localStorage\n      }\n      this.ENV = ENV;\n    }\n    get(key) {\n      return this.ENV[key];\n    }\n    set(key, value) {\n      if (this.ENV[key] != value) {\n        this.ENV[key] = value;\n        try {\n          if (value) {\n            localStorage.setItem(key, value);\n          } else {\n            localStorage.removeItem(key);\n          }\n        } catch {\n          // Do nothing, we don't have localStorage\n        }\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"ENV\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"crimeisdown/services/metrics\", [\"exports\", \"ember-metrics/services/metrics\"], function (_exports, _metrics) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _metrics.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-metrics/services/metrics\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/services/moment\", [\"exports\", \"ember-moment/services/moment\"], function (_exports, _moment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _moment.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-moment/services/moment\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/services/page-title\", [\"exports\", \"ember-page-title/services/page-title\"], function (_exports, _pageTitle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pageTitle.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-page-title/services/page-title\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/services/router-scroll\", [\"exports\", \"ember-router-scroll/services/router-scroll\"], function (_exports, _routerScroll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _routerScroll.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-router-scroll/services/router-scroll\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/services/session\", [\"exports\", \"@ember/application\", \"@ember/service\", \"@glimmer/tracking\", \"@sentry/ember\"], function (_exports, _application, _service, _tracking, Sentry) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/application\",0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"@sentry/ember\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let SessionService = _exports.default = (_class = class SessionService extends _service.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"isAuthenticated\", _descriptor, this);\n      _initializerDefineProperty(this, \"user\", _descriptor2, this);\n      _defineProperty(this, \"fetchOptions\", {\n        headers: {\n          Accept: 'application/json'\n        },\n        credentials: 'include'\n      });\n      this.config = (0, _application.getOwner)(this).lookup('service:config');\n      const token = this.config.get('API_AUTH_TOKEN');\n      if (token) {\n        this.fetchOptions.headers['Authorization'] = `Bearer ${token}`;\n      }\n      this.authenticated = new Promise(resolve => {\n        this.getUser().then(() => {\n          if (this.isAuthenticated) {\n            Sentry.setUser({\n              email: this.user.email\n            });\n          }\n          resolve(this.isAuthenticated);\n        });\n      });\n    }\n    async getUser() {\n      try {\n        const response = await fetch(this.config.get('API_BASE_URL') + '/api/user', this.fetchOptions);\n        if (response.status === 200) {\n          this.user = await response.json();\n          this.isAuthenticated = true;\n        } else {\n          throw new Error();\n        }\n      } catch (e) {\n        this.isAuthenticated = false;\n      }\n      return this.user;\n    }\n    async getSearchAPIKeys() {\n      const keys = {\n        meilisearch: this.config.get('MEILISEARCH_KEY'),\n        typesense: this.config.get('TYPESENSE_KEY')\n      };\n      if (keys.meilisearch || keys.typesense) {\n        return Promise.resolve(keys);\n      }\n      if (this.isAuthenticated) {\n        const response = await fetch(this.config.get('API_BASE_URL') + '/api/search-key', {\n          headers: {\n            Accept: 'application/json'\n          },\n          credentials: 'include'\n        });\n        if (response.status != 200) {\n          return Promise.reject(response.status);\n        }\n        const data = await response.json();\n        return Promise.resolve({\n          meilisearch: data.meilisearch,\n          typesense: data.typesense\n        });\n      }\n      return Promise.reject('Not logged in!');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"isAuthenticated\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"user\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return undefined;\n    }\n  }), _class);\n});","define(\"crimeisdown/services/store\", [\"exports\", \"ember-data/store\"], function (_exports, _store) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _store.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-data/store\"eaimeta@70e063a35619d71f\n});","define(\"crimeisdown/templates/airshow\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Airshow\"}}\n  <div class=\"container\">\n      <h2>Chicago Air and Water Show radio</h2>\n      <IcecastPlayer @stream=\"https://icecast.crimeisdown.com/airshow\" />\n  </div>\n  \n  */\n  {\n    \"id\": \"tgN38oNE\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Airshow\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h2\\\"],[12],[1,\\\"Chicago Air and Water Show radio\\\"],[13],[1,\\\"\\\\n    \\\"],[8,[39,3],null,[[\\\"@stream\\\"],[\\\"https://icecast.crimeisdown.com/airshow\\\"]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"h2\\\",\\\"icecast-player\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/airshow.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/application\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"CrimeIsDown.com\"}}\n  \n  <AppHeader />\n  \n  {{outlet}}\n  \n  <AppFooter />\n  \n  */\n  {\n    \"id\": \"LEnNQaxb\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"CrimeIsDown.com\\\"],null]],[1,\\\"\\\\n\\\\n\\\"],[8,[39,1],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[46,[28,[37,3],null,null],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[8,[39,4],null,null,null],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"app-header\\\",\\\"component\\\",\\\"-outlet\\\",\\\"app-footer\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/application.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/archiveplayer\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Play Audio Archive\"}}\n  <div class=\"container\">\n    <div class=\"row\">\n      <div class=\"col-sm-12\">\n        <form method=\"GET\">\n          <div class=\"form-group\">\n            <label for=\"url\">Audio file URL</label>\n            <input type=\"text\" name=\"url\" class=\"form-control\" value={{this.url}} aria-label=\"Audio file URL\">\n          </div>\n          <button type=\"submit\" class=\"btn btn-primary\">Play</button>\n        </form>\n      </div>\n      <div class=\"col-sm-12\">\n        <h4><a href=\"{{this.model.url}}\" target=\"_blank\" rel=\"noopener noreferrer\">{{this.model.filename}}</a></h4>\n        <MediaPlayer @src={{this.model.url}} @type={{this.model.type}} @idSuffix=\"\" />\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"LDJr67cH\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Play Audio Archive\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"form\\\"],[14,\\\"method\\\",\\\"GET\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"url\\\"],[12],[1,\\\"Audio file URL\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"input\\\"],[14,3,\\\"url\\\"],[14,0,\\\"form-control\\\"],[15,2,[30,0,[\\\"url\\\"]]],[14,\\\"aria-label\\\",\\\"Audio file URL\\\"],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"Play\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h4\\\"],[12],[10,3],[15,6,[29,[[30,0,[\\\"model\\\",\\\"url\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,[30,0,[\\\"model\\\",\\\"filename\\\"]]],[13],[13],[1,\\\"\\\\n      \\\"],[8,[39,8],null,[[\\\"@src\\\",\\\"@type\\\",\\\"@idSuffix\\\"],[[30,0,[\\\"model\\\",\\\"url\\\"]],[30,0,[\\\"model\\\",\\\"type\\\"]],\\\"\\\"]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"form\\\",\\\"label\\\",\\\"input\\\",\\\"button\\\",\\\"h4\\\",\\\"a\\\",\\\"media-player\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/archiveplayer.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/audio-live\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title (concat (or this.model.name this.model.slug) \" Live Audio\")}}\n  <div class=\"container\">\n    <div class=\"row\">\n      <div class=\"col-sm-12\">\n        <StreamPlayer @stream={{this.model}} @autoplay={{this.model.autoplay}}>\n          {{#if this.model.name}}\n            <h1>{{this.model.name}}</h1>\n            <p>{{this.model.description}} <strong><LinkTo @route=\"audio\">Visit our Scanner Audio page for more streams, and to download archives of this channel.</LinkTo></strong></p>\n          {{else}}\n            <h1>{{this.model.slug}}</h1>\n          {{/if}}\n          {{#if this.model.broadcastify}}\n            <div class=\"alert alert-warning\" role=\"alert\">This feed is hosted by Broadcastify.com, as it is of an encrypted radio channel. Radio traffic is delayed 30-35 minutes. CrimeIsDown.com has no control over these streams and is not affiliated with Broadcastify. <a href=\"https://www.broadcastify.com/listen/feed/{{ this.model.broadcastifyId }}\" target=\"_blank\" rel=\"noopener noreferrer\"><img class=\"bcfy-favicon\" src=\"https://s.broadcastify.com/icons/favicon-96x96.png\" title=\"Audio provided by Broadcastify.com\" alt=\"Broadcastify.com\" /> Listen on Broadcastify.com</a></div>\n          {{/if}}\n        </StreamPlayer>\n        {{#if this.model.openmhz}}\n          <h2 class=\"h4\">Transmission-based stream/archive</h2>\n          <p>Use the <FaIcon @icon=\"calendar-o\" /> <span class=\"desktop-only\">Archive</span> button in the menu below to jump to a certain time. <a href=\"{{this.model.openmhz}}\"><i>Player hosted by OpenMHz.com</i></a></p>\n          <iframe id=\"openmhz-iframe\" title=\"OpenMHz stream\" src=\"{{this.model.openmhz}}\"></iframe>\n        {{/if}}\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"rNdX99zo\",\n    \"block\": \"[[[1,[28,[35,0],[[28,[37,1],[[28,[37,2],[[30,0,[\\\"model\\\",\\\"name\\\"]],[30,0,[\\\"model\\\",\\\"slug\\\"]]],null],\\\" Live Audio\\\"],null]],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm-12\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,4],null,[[\\\"@stream\\\",\\\"@autoplay\\\"],[[30,0,[\\\"model\\\"]],[30,0,[\\\"model\\\",\\\"autoplay\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"model\\\",\\\"name\\\"]],[[[1,\\\"          \\\"],[10,\\\"h1\\\"],[12],[1,[30,0,[\\\"model\\\",\\\"name\\\"]]],[13],[1,\\\"\\\\n          \\\"],[10,2],[12],[1,[30,0,[\\\"model\\\",\\\"description\\\"]]],[1,\\\" \\\"],[10,\\\"strong\\\"],[12],[8,[39,9],null,[[\\\"@route\\\"],[\\\"audio\\\"]],[[\\\"default\\\"],[[[[1,\\\"Visit our Scanner Audio page for more streams, and to download archives of this channel.\\\"]],[]]]]],[13],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[10,\\\"h1\\\"],[12],[1,[30,0,[\\\"model\\\",\\\"slug\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[30,0,[\\\"model\\\",\\\"broadcastify\\\"]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"alert alert-warning\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"This feed is hosted by Broadcastify.com, as it is of an encrypted radio channel. Radio traffic is delayed 30-35 minutes. CrimeIsDown.com has no control over these streams and is not affiliated with Broadcastify. \\\"],[10,3],[15,6,[29,[\\\"https://www.broadcastify.com/listen/feed/\\\",[30,0,[\\\"model\\\",\\\"broadcastifyId\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[10,\\\"img\\\"],[14,0,\\\"bcfy-favicon\\\"],[14,\\\"src\\\",\\\"https://s.broadcastify.com/icons/favicon-96x96.png\\\"],[14,\\\"title\\\",\\\"Audio provided by Broadcastify.com\\\"],[14,\\\"alt\\\",\\\"Broadcastify.com\\\"],[12],[13],[1,\\\" Listen on Broadcastify.com\\\"],[13],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"]],[]]]]],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"model\\\",\\\"openmhz\\\"]],[[[1,\\\"        \\\"],[10,\\\"h2\\\"],[14,0,\\\"h4\\\"],[12],[1,\\\"Transmission-based stream/archive\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"Use the \\\"],[8,[39,13],null,[[\\\"@icon\\\"],[\\\"calendar-o\\\"]],null],[1,\\\" \\\"],[10,1],[14,0,\\\"desktop-only\\\"],[12],[1,\\\"Archive\\\"],[13],[1,\\\" button in the menu below to jump to a certain time. \\\"],[10,3],[15,6,[29,[[30,0,[\\\"model\\\",\\\"openmhz\\\"]]]]],[12],[10,\\\"i\\\"],[12],[1,\\\"Player hosted by OpenMHz.com\\\"],[13],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"iframe\\\"],[14,1,\\\"openmhz-iframe\\\"],[14,\\\"title\\\",\\\"OpenMHz stream\\\"],[15,\\\"src\\\",[29,[[30,0,[\\\"model\\\",\\\"openmhz\\\"]]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"concat\\\",\\\"or\\\",\\\"div\\\",\\\"stream-player\\\",\\\"if\\\",\\\"h1\\\",\\\"p\\\",\\\"strong\\\",\\\"link-to\\\",\\\"a\\\",\\\"img\\\",\\\"h2\\\",\\\"fa-icon\\\",\\\"span\\\",\\\"i\\\",\\\"iframe\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/audio-live.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/audio\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Scanner Audio\"}}\n  <div class=\"container\">\n    <div class=\"row\">\n      <div class=\"col-lg-6\">\n        <div class=\"d-lg-none\">\n          <p><em><a href=\"#lookuprecording\">Jump to scanner recording download</a></em></p>\n        </div>\n        <div class=\"mb-3\">\n          <VirtualScanner @streams={{this.model.streams}} />\n        </div>\n        <div>\n          <h3>General #ChicagoScanner feed</h3>\n          <p>Scanner feed of ISP Dist. Chicago, Metra PD, CPD Citywides, various CFD incident channels, Marine 16, and aviation UNICOM. Scan list subject to change.<br><br><a href=\"https://www.youtube.com/@EricTendian/live\" target=\"_blank\" rel=\"noopener noreferrer\">View on YouTube</a></p>\n          <iframe id=\"youtube-player\" title=\"YouTube scanner feed\" src=\"https://crimeisdown.com/youtubelive\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n        </div>\n        <div class=\"mt-3\">\n          <div class=\"accordion\" id=\"accordion\">\n            <MapTools />\n          </div>\n        </div>\n      </div>\n      <div class=\"col-lg-6\">\n        <div class=\"row\">\n          <div class=\"col-md-6\">\n            <h3 id=\"lookuprecording\">Look up scanner recording</h3>\n            <AudioSearch />\n            <hr>\n            <p>\n              {{#if this.session.isAuthenticated}}\n              You are logged in! You have {{#if (eq this.session.user.patreon_tier.features.archive_downloads 1000)}}unlimited downloads{{else}}a download limit of {{this.session.user.patreon_tier.features.archive_downloads}}{{/if}}.\n              {{else}}\n              <a href=\"https://www.patreon.com/bePatron?u=4805116\" referrerpolicy=\"unsafe-url\" class=\"ptrn-button\"><img src=\"/img/become-a-patron.png\" alt=\"Become a Patron!\"></a>\n              {{/if}}\n            </p>\n            <table class=\"table\">\n              <thead>\n              <tr>\n                <th>Cost</th>\n                <th>Downloads / day</th>\n              </tr>\n              </thead>\n              <tbody>\n              <tr>\n                <td>Free</td>\n                <td>5</td>\n              </tr>\n              <tr>\n                <td><a href=\"https://www.patreon.com/checkout/EricTendian/1260234\" target=\"_blank\" rel=\"noopener noreferrer\">$1/mo Patron</a> {{#if (and this.session.isAuthenticated (eq this.session.user.patreon_tier.rate 1))}}(you){{/if}}</td>\n                <td>10</td>\n              </tr>\n              <tr>\n                <td><a href=\"https://www.patreon.com/checkout/EricTendian/1260095\" target=\"_blank\" rel=\"noopener noreferrer\">$5/mo Patron</a> {{#if (and this.session.isAuthenticated (eq this.session.user.patreon_tier.rate 5))}}(you){{/if}}</td>\n                <td>20</td>\n              </tr>\n              <tr>\n                <td><a href=\"https://www.patreon.com/checkout/EricTendian/1260096\" target=\"_blank\" rel=\"noopener noreferrer\">$10/mo Patron</a> {{#if (and this.session.isAuthenticated (eq this.session.user.patreon_tier.rate 10))}}(you){{/if}}</td>\n                <td>30</td>\n              </tr>\n              <tr>\n                <td><a href=\"https://www.patreon.com/checkout/EricTendian/1260098\" target=\"_blank\" rel=\"noopener noreferrer\">$20/mo Patron</a> {{#if (and this.session.isAuthenticated (eq this.session.user.patreon_tier.rate 20))}}(you){{/if}}</td>\n                <td>50</td>\n              </tr>\n              <tr>\n                <td><a href=\"https://www.patreon.com/checkout/EricTendian/1260099\" target=\"_blank\" rel=\"noopener noreferrer\">$50/mo Patron</a> {{#if (and this.session.isAuthenticated (eq this.session.user.patreon_tier.rate 50))}}(you){{/if}}</td>\n                <td>Unlimited</td>\n              </tr>\n              </tbody>\n            </table>\n          </div>\n          <div class=\"col-md-6\">\n            <AudioRangeExport />\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-md-12 mt-2\" id=\"online-streams-list\">\n            <h2>Online Streams</h2>\n            <h4>From CrimeIsDown.com</h4>\n            <p>These streams allow individual audio clips to be played, so you can rewind easily without need to download a full archive. They are more like a virtual police scanner.</p>\n            <ul>\n              <li>\n                <p><a href=\"https://openmhz.com/system/sc21102\" target=\"_blank\" rel=\"noopener noreferrer\">STARCOM21</a></p>\n              </li>\n              <li>\n                <p><a href=\"https://openmhz.com/system/chi_oemc\" target=\"_blank\" rel=\"noopener noreferrer\">Chicago OEMC 800MHz</a> (includes CFD)</p>\n              </li>\n              <li>\n                <p><a href=\"https://openmhz.com/system/chi_cfd\" target=\"_blank\" rel=\"noopener noreferrer\">Chicago Fire Department</a> (old system, not in use usually)</p>\n              </li>\n              <li>\n                <p><a href=\"https://openmhz.com/system/chi_cpd\" target=\"_blank\" rel=\"noopener noreferrer\">Chicago Police Department</a> (including delayed encrypted feeds)</p>\n              </li>\n              <li>\n                <p><a href=\"https://openmhz.com/system/chisuburbs\" target=\"_blank\" rel=\"noopener noreferrer\">Chicago Suburbs</a></p>\n              </li>\n              <li>\n                <p><a href=\"https://www.broadcastify.com/calls/\" target=\"_blank\" rel=\"noopener noreferrer\">Broadcastify Calls</a></p>\n              </li>\n            </ul>\n            <h4>Broadcastify feed lists by county</h4>\n            <ul>\n              <li>\n                <p><a href=\"https://www.broadcastify.com/listen/ctid/606\" target=\"_blank\" rel=\"noopener noreferrer\">Cook County (includes Chicago)</a></p>\n              </li>\n              <li>\n                <p><a href=\"https://www.broadcastify.com/listen/ctid/639\" target=\"_blank\" rel=\"noopener noreferrer\">Lake County (north suburbs)</a></p>\n              </li>\n              <li>\n                <p><a href=\"https://www.broadcastify.com/listen/ctid/612\" target=\"_blank\" rel=\"noopener noreferrer\">DuPage County (west suburbs)</a></p>\n              </li>\n              <li>\n                <p><a href=\"https://www.broadcastify.com/listen/ctid/635\" target=\"_blank\" rel=\"noopener noreferrer\">Kane County (far west/northwest suburbs)</a></p>\n              </li>\n              <li>\n                <p><a href=\"https://www.broadcastify.com/listen/ctid/689\" target=\"_blank\" rel=\"noopener noreferrer\">Will County (south/southwest suburbs)</a></p>\n              </li>\n            </ul>\n            <h4>Other Sources</h4>\n            <ul>\n              <li>\n                <p><a href=\"https://www.liveatc.net/search/?icao=kord\" target=\"_blank\" rel=\"noopener noreferrer\">LiveATC O'Hare Airport</a></p>\n              </li>\n              <li>\n                <p><a href=\"https://www.liveatc.net/search/?icao=kmdw\" target=\"_blank\" rel=\"noopener noreferrer\">LiveATC Midway Airport</a></p>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"aI6oGjId\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Scanner Audio\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-lg-6\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"d-lg-none\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[10,\\\"em\\\"],[12],[10,3],[14,6,\\\"#lookuprecording\\\"],[12],[1,\\\"Jump to scanner recording download\\\"],[13],[13],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,5],null,[[\\\"@streams\\\"],[[30,0,[\\\"model\\\",\\\"streams\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,\\\"General #ChicagoScanner feed\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"Scanner feed of ISP Dist. Chicago, Metra PD, CPD Citywides, various CFD incident channels, Marine 16, and aviation UNICOM. Scan list subject to change.\\\"],[10,\\\"br\\\"],[12],[13],[10,\\\"br\\\"],[12],[13],[10,3],[14,6,\\\"https://www.youtube.com/@EricTendian/live\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"View on YouTube\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"iframe\\\"],[14,1,\\\"youtube-player\\\"],[14,\\\"title\\\",\\\"YouTube scanner feed\\\"],[14,\\\"src\\\",\\\"https://crimeisdown.com/youtubelive\\\"],[14,\\\"frameborder\\\",\\\"0\\\"],[14,\\\"allow\\\",\\\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\\\"],[14,\\\"referrerpolicy\\\",\\\"strict-origin-when-cross-origin\\\"],[14,\\\"allowfullscreen\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"mt-3\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion\\\"],[14,1,\\\"accordion\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[39,9],null,null,null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-lg-6\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,1,\\\"lookuprecording\\\"],[12],[1,\\\"Look up scanner recording\\\"],[13],[1,\\\"\\\\n          \\\"],[8,[39,10],null,null,null],[1,\\\"\\\\n          \\\"],[10,\\\"hr\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[10,2],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[[[1,\\\"            You are logged in! You have \\\"],[41,[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"features\\\",\\\"archive_downloads\\\"]],1000],null],[[[1,\\\"unlimited downloads\\\"]],[]],[[[1,\\\"a download limit of \\\"],[1,[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"features\\\",\\\"archive_downloads\\\"]]]],[]]],[1,\\\".\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,3],[14,6,\\\"https://www.patreon.com/bePatron?u=4805116\\\"],[14,\\\"referrerpolicy\\\",\\\"unsafe-url\\\"],[14,0,\\\"ptrn-button\\\"],[12],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/img/become-a-patron.png\\\"],[14,\\\"alt\\\",\\\"Become a Patron!\\\"],[12],[13],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"table\\\"],[14,0,\\\"table\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"th\\\"],[12],[1,\\\"Cost\\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"th\\\"],[12],[1,\\\"Downloads / day\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[1,\\\"Free\\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[1,\\\"5\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[10,3],[14,6,\\\"https://www.patreon.com/checkout/EricTendian/1260234\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"$1/mo Patron\\\"],[13],[1,\\\" \\\"],[41,[28,[37,21],[[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"rate\\\"]],1],null]],null],[[[1,\\\"(you)\\\"]],[]],null],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[1,\\\"10\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[10,3],[14,6,\\\"https://www.patreon.com/checkout/EricTendian/1260095\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"$5/mo Patron\\\"],[13],[1,\\\" \\\"],[41,[28,[37,21],[[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"rate\\\"]],5],null]],null],[[[1,\\\"(you)\\\"]],[]],null],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[1,\\\"20\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[10,3],[14,6,\\\"https://www.patreon.com/checkout/EricTendian/1260096\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"$10/mo Patron\\\"],[13],[1,\\\" \\\"],[41,[28,[37,21],[[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"rate\\\"]],10],null]],null],[[[1,\\\"(you)\\\"]],[]],null],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[1,\\\"30\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[10,3],[14,6,\\\"https://www.patreon.com/checkout/EricTendian/1260098\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"$20/mo Patron\\\"],[13],[1,\\\" \\\"],[41,[28,[37,21],[[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"rate\\\"]],20],null]],null],[[[1,\\\"(you)\\\"]],[]],null],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[1,\\\"50\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[10,3],[14,6,\\\"https://www.patreon.com/checkout/EricTendian/1260099\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"$50/mo Patron\\\"],[13],[1,\\\" \\\"],[41,[28,[37,21],[[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"rate\\\"]],50],null]],null],[[[1,\\\"(you)\\\"]],[]],null],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[12],[1,\\\"Unlimited\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[39,22],null,null,null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"col-md-12 mt-2\\\"],[14,1,\\\"online-streams-list\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h2\\\"],[12],[1,\\\"Online Streams\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"h4\\\"],[12],[1,\\\"From CrimeIsDown.com\\\"],[13],[1,\\\"\\\\n          \\\"],[10,2],[12],[1,\\\"These streams allow individual audio clips to be played, so you can rewind easily without need to download a full archive. They are more like a virtual police scanner.\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://openmhz.com/system/sc21102\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"STARCOM21\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://openmhz.com/system/chi_oemc\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Chicago OEMC 800MHz\\\"],[13],[1,\\\" (includes CFD)\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://openmhz.com/system/chi_cfd\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Chicago Fire Department\\\"],[13],[1,\\\" (old system, not in use usually)\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://openmhz.com/system/chi_cpd\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Chicago Police Department\\\"],[13],[1,\\\" (including delayed encrypted feeds)\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://openmhz.com/system/chisuburbs\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Chicago Suburbs\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.broadcastify.com/calls/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Broadcastify Calls\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Broadcastify feed lists by county\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.broadcastify.com/listen/ctid/606\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Cook County (includes Chicago)\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.broadcastify.com/listen/ctid/639\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Lake County (north suburbs)\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.broadcastify.com/listen/ctid/612\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"DuPage County (west suburbs)\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.broadcastify.com/listen/ctid/635\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Kane County (far west/northwest suburbs)\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.broadcastify.com/listen/ctid/689\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Will County (south/southwest suburbs)\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Other Sources\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.liveatc.net/search/?icao=kord\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"LiveATC O'Hare Airport\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[10,3],[14,6,\\\"https://www.liveatc.net/search/?icao=kmdw\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"LiveATC Midway Airport\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"p\\\",\\\"em\\\",\\\"a\\\",\\\"virtual-scanner\\\",\\\"h3\\\",\\\"br\\\",\\\"iframe\\\",\\\"map-tools\\\",\\\"audio-search\\\",\\\"hr\\\",\\\"if\\\",\\\"eq\\\",\\\"img\\\",\\\"table\\\",\\\"thead\\\",\\\"tr\\\",\\\"th\\\",\\\"tbody\\\",\\\"td\\\",\\\"and\\\",\\\"audio-range-export\\\",\\\"h2\\\",\\\"h4\\\",\\\"ul\\\",\\\"li\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/audio.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/alert\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#unless this.hasSeenAlert}}\n  <div class=\"alert alert-{{or @type 'primary'}} alert-dismissible fade show\" role=\"alert\">\n    {{yield}}\n    <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\" {{on \"click\" this.dismiss}}></button>\n  </div>\n  {{/unless}}\n  \n  */\n  {\n    \"id\": \"P8vQxfpV\",\n    \"block\": \"[[[41,[51,[30,0,[\\\"hasSeenAlert\\\"]]],[[[10,0],[15,0,[29,[\\\"alert alert-\\\",[28,[37,2],[[30,1],\\\"primary\\\"],null],\\\" alert-dismissible fade show\\\"]]],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n  \\\"],[18,2,null],[1,\\\"\\\\n  \\\"],[11,\\\"button\\\"],[24,0,\\\"btn-close\\\"],[24,\\\"data-bs-dismiss\\\",\\\"alert\\\"],[24,\\\"aria-label\\\",\\\"Close\\\"],[24,4,\\\"button\\\"],[4,[38,5],[\\\"click\\\",[30,0,[\\\"dismiss\\\"]]],null],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@type\\\",\\\"&default\\\"],false,[\\\"unless\\\",\\\"div\\\",\\\"or\\\",\\\"yield\\\",\\\"button\\\",\\\"on\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/alert.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/app-footer\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <footer id=\"site-footer\">\n    <div class=\"container-fluid\">\n      <div class=\"row\">\n        <div class=\"col-sm-5\">\n          <p>\n            Copyright &copy; 2014-{{this.currentYear}} CrimeIsDown.com. All Rights Reserved.\n          </p>\n        </div>\n        <div class=\"col-sm-7\">\n          <button class=\"btn btn-sm btn-secondary\" type=\"button\" onclick=\"doorbell.show();\">Send Feedback</button> |\n          <a href=\"https://twitter.com/EricTendian/lists/CrimeIsDown\">Follow on Twitter</a> |\n          <a href=\"https://www.patreon.com/EricTendian\">Support on Patreon</a> |\n          <a href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4SHEMCHJPV8KY&lc=US&item_name=CrimeIsDown%2ecom&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted\">Donate thru Paypal</a> |\n          <a href=\"https://status.crimeisdown.com/\">Site Status</a>\n        </div>\n      </div>\n    </div>\n  </footer>\n  \n  */\n  {\n    \"id\": \"iDfquV/+\",\n    \"block\": \"[[[10,\\\"footer\\\"],[14,1,\\\"site-footer\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"container-fluid\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col-sm-5\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          Copyright © 2014-\\\"],[1,[30,0,[\\\"currentYear\\\"]]],[1,\\\" CrimeIsDown.com. All Rights Reserved.\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col-sm-7\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-sm btn-secondary\\\"],[14,\\\"onclick\\\",\\\"doorbell.show();\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"Send Feedback\\\"],[13],[1,\\\" |\\\\n        \\\"],[10,3],[14,6,\\\"https://twitter.com/EricTendian/lists/CrimeIsDown\\\"],[12],[1,\\\"Follow on Twitter\\\"],[13],[1,\\\" |\\\\n        \\\"],[10,3],[14,6,\\\"https://www.patreon.com/EricTendian\\\"],[12],[1,\\\"Support on Patreon\\\"],[13],[1,\\\" |\\\\n        \\\"],[10,3],[14,6,\\\"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4SHEMCHJPV8KY&lc=US&item_name=CrimeIsDown%2ecom&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted\\\"],[12],[1,\\\"Donate thru Paypal\\\"],[13],[1,\\\" |\\\\n        \\\"],[10,3],[14,6,\\\"https://status.crimeisdown.com/\\\"],[12],[1,\\\"Site Status\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"footer\\\",\\\"div\\\",\\\"p\\\",\\\"button\\\",\\\"a\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/app-footer.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/app-header\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <header>\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary fixed-top\" data-bs-theme=\"dark\">\n      <div class=\"container-fluid\">\n        <LinkTo @route=\"index\" class=\"navbar-brand\">\n          {{!-- template-lint-disable require-valid-alt-text --}}\n          <img src=\"/img/logo.png\" alt=\"Logo\" width=\"30\" height=\"30\" class=\"d-inline-block align-middle\">\n          cmh2.nerdfest.dev \n        </LinkTo>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </button>\n  \n        <div class=\"collapse navbar-collapse\" id=\"navbar\">\n          <ul class=\"navbar-nav me-auto\">\n            <li class=\"nav-item\">\n              <LinkTo @route=\"search-transcripts\" id=\"transcript-link\" class=\"nav-link\" data-bs-toggle=\"collapse\" data-bs-target=\".navbar-collapse.show\">Transcript Search</LinkTo>\n            </li>\n          </ul>\n  \n          {{!-- <form class=\"d-flex\">\n            <div class=\"form-check me-3\">\n              <label class=\"form-check-label text-muted\">\n                <input type=\"checkbox\" class=\"form-check-input\" id=\"nightmodetoggle\">\n                Night Mode\n              </label>\n            </div>\n            <div class=\"form-check\">\n              <label class=\"form-check-label text-muted red-blue-flashing\">\n                <Input @type=\"checkbox\" class=\"form-check-input\" id=\"copstoggle\" @checked={{this.playmusic}} {{on \"change\" this.togglemusic}} />\n                <FaIcon @icon=\"volume-up\" />&nbsp;COPS Mode\n              </label>\n              <div class=\"d-none\">\n                <audio id=\"copstheme\" src=\"https://www.soundboard.com/mediafiles/Inner%20Circle%20-%20Bad%20Boys%20(COPS%20theme%20song)219275-1efae287-f275-499c-8ef5-878aa3795aed.mp3\" loop preload=\"auto\"></audio>\n              </div>\n            </div>\n          </form> --}}\n        </div>\n      </div>\n    </nav>\n  </header>\n  \n  */\n  {\n    \"id\": \"fKlQYq0i\",\n    \"block\": \"[[[10,\\\"header\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"nav\\\"],[14,0,\\\"navbar navbar-expand-lg bg-body-tertiary fixed-top\\\"],[14,\\\"data-bs-theme\\\",\\\"dark\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"container-fluid\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,3],[[24,0,\\\"navbar-brand\\\"]],[[\\\"@route\\\"],[\\\"index\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/img/logo.png\\\"],[14,\\\"alt\\\",\\\"Logo\\\"],[14,\\\"width\\\",\\\"30\\\"],[14,\\\"height\\\",\\\"30\\\"],[14,0,\\\"d-inline-block align-middle\\\"],[12],[13],[1,\\\"\\\\n        cmh2.nerdfest.dev \\\\n      \\\"]],[]]]]],[1,\\\"\\\\n      \\\"],[10,\\\"button\\\"],[14,0,\\\"navbar-toggler\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#navbar\\\"],[14,\\\"aria-controls\\\",\\\"navbar\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-label\\\",\\\"Toggle navigation\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"navbar-toggler-icon\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"collapse navbar-collapse\\\"],[14,1,\\\"navbar\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"navbar-nav me-auto\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[12],[1,\\\"\\\\n            \\\"],[8,[39,3],[[24,1,\\\"transcript-link\\\"],[24,0,\\\"nav-link\\\"],[24,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[24,\\\"data-bs-target\\\",\\\".navbar-collapse.show\\\"]],[[\\\"@route\\\"],[\\\"search-transcripts\\\"]],[[\\\"default\\\"],[[[[1,\\\"Transcript Search\\\"]],[]]]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"header\\\",\\\"nav\\\",\\\"div\\\",\\\"link-to\\\",\\\"img\\\",\\\"button\\\",\\\"span\\\",\\\"ul\\\",\\\"li\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/app-header.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/audio-range-export\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"audio-range-export\" {{did-insert this.initialize}}>\n    <h4>Range export (Commander+)</h4>\n    <p class=\"text-muted\">Combine up to 24 continuous hours into one MP3 file.</p>\n  \n    {{#unless this.authReady}}\n      <p class=\"small text-muted\">Checking account access...</p>\n    {{/unless}}\n  \n    {{#if this.authReady}}\n      {{#if (not this.session.isAuthenticated)}}\n        <div class=\"alert alert-info\" data-test-range-login-cta>\n          <p class=\"mb-2\">Log in to use range export.</p>\n          <a class=\"btn btn-primary btn-sm\" href=\"{{this.loginUrl}}\" referrerpolicy=\"unsafe-url\">Log in with Patreon</a>\n        </div>\n      {{else if (not this.canUseRangeExport)}}\n        <div class=\"alert alert-warning\" data-test-range-upgrade-cta>\n          <p class=\"mb-2\">Range export requires Commander tier ($50/mo) or above.</p>\n          <a class=\"btn btn-primary btn-sm\" href=\"{{this.commanderCheckoutUrl}}\" target=\"_blank\" rel=\"noopener noreferrer\">Upgrade to Commander</a>\n        </div>\n      {{/if}}\n    {{/if}}\n  \n    <form class=\"audio-range-export__form\" {{on \"submit\" this.submit}}>\n      <div class=\"mb-3\">\n        <label for=\"range-feed\">Radio channel</label>\n        <select name=\"feed\" id=\"range-feed\" class=\"form-control\" required data-test-range-feed>\n          <option value=\"\" disabled selected>Select channel</option>\n          {{#each this.feeds as |feed|}}\n            <option value={{feed.value}}>{{feed.label}}</option>\n          {{/each}}\n        </select>\n      </div>\n  \n      <div class=\"mb-3\">\n        <label for=\"range-start-datetime\">Start time (US Central)</label>\n        <div class=\"input-group date\">\n          <EmberFlatpickr\n            name=\"start_datetime\"\n            @id=\"range-start-datetime\"\n            class=\"form-control\"\n            @allowInput={{true}}\n            @defaultDate={{this.startDate}}\n            @date={{this.startDate}}\n            @enableTime={{this.startPickerOptions.enableTime}}\n            @dateFormat={{this.startPickerOptions.dateFormat}}\n            @minuteIncrement={{this.startPickerOptions.minuteIncrement}}\n            @onChange={{null}}\n          />\n          <span class=\"input-group-text\"><FaIcon @icon=\"calendar\" /></span>\n        </div>\n      </div>\n  \n      <div class=\"mb-3\">\n        <label for=\"range-end-datetime\">End time (US Central)</label>\n        <div class=\"input-group date\">\n          <EmberFlatpickr\n            name=\"end_datetime\"\n            @id=\"range-end-datetime\"\n            class=\"form-control\"\n            @allowInput={{true}}\n            @defaultDate={{this.endDate}}\n            @date={{this.endDate}}\n            @enableTime={{this.endPickerOptions.enableTime}}\n            @dateFormat={{this.endPickerOptions.dateFormat}}\n            @minuteIncrement={{this.endPickerOptions.minuteIncrement}}\n            @onChange={{null}}\n          />\n          <span class=\"input-group-text\"><FaIcon @icon=\"calendar\" /></span>\n        </div>\n      </div>\n  \n      <button\n        type=\"submit\"\n        class=\"btn btn-primary\"\n        disabled={{this.submitDisabled}}\n        data-test-range-submit\n      >\n        {{if this.isSubmitting \"Submitting...\" \"Create range export\"}}\n      </button>\n    </form>\n  \n    {{#if this.createError}}\n      <div class=\"alert alert-danger mt-3 audio-range-export__message\" data-test-range-create-error>\n        {{this.createError}}\n      </div>\n    {{/if}}\n  \n    {{#if this.hasJobResult}}\n      <div class=\"card mt-3 audio-range-export__status\" data-test-range-status>\n        <div class=\"card-body\">\n          <p class=\"mb-2\">\n            Export status:\n            <span class=\"badge {{this.statusBadgeClass}}\" data-test-range-job-status>{{or this.status \"queued\"}}</span>\n          </p>\n          <p class=\"mb-1\">Requested hours: {{or this.requestedHours 0}}</p>\n          <p class=\"mb-1\">Processed hours: {{or this.processedHours 0}}</p>\n  \n          {{#if (and this.missingHours this.missingHours.length)}}\n            <div class=\"audio-range-export__missing mt-2\" data-test-range-missing-hours>\n              <p class=\"mb-1\"><strong>Missing hours</strong></p>\n              <ul class=\"mb-0\">\n                {{#each this.missingHours as |hour|}}\n                  <li>{{hour}}</li>\n                {{/each}}\n              </ul>\n            </div>\n          {{/if}}\n  \n          {{#if this.downloadUrl}}\n            <a\n              href=\"{{this.downloadUrl}}\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              class=\"btn btn-success mt-3\"\n              data-test-range-download\n            >\n              Download merged audio\n            </a>\n          {{/if}}\n  \n          {{#if this.jobError}}\n            <div class=\"alert alert-danger mt-3 mb-0 audio-range-export__message\" data-test-range-job-error>\n              {{this.jobError}}\n            </div>\n          {{/if}}\n        </div>\n      </div>\n    {{/if}}\n  </div>\n  \n  */\n  {\n    \"id\": \"PWBwdLrJ\",\n    \"block\": \"[[[11,0],[24,0,\\\"audio-range-export\\\"],[4,[38,1],[[30,0,[\\\"initialize\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Range export (Commander+)\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"text-muted\\\"],[12],[1,\\\"Combine up to 24 continuous hours into one MP3 file.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,0,[\\\"authReady\\\"]]],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"small text-muted\\\"],[12],[1,\\\"Checking account access...\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"authReady\\\"]],[[[41,[28,[37,6],[[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]]],null],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"alert alert-info\\\"],[14,\\\"data-test-range-login-cta\\\",\\\"\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"mb-2\\\"],[12],[1,\\\"Log in to use range export.\\\"],[13],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"btn btn-primary btn-sm\\\"],[15,6,[29,[[30,0,[\\\"loginUrl\\\"]]]]],[14,\\\"referrerpolicy\\\",\\\"unsafe-url\\\"],[12],[1,\\\"Log in with Patreon\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,6],[[30,0,[\\\"canUseRangeExport\\\"]]],null],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"alert alert-warning\\\"],[14,\\\"data-test-range-upgrade-cta\\\",\\\"\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"mb-2\\\"],[12],[1,\\\"Range export requires Commander tier ($50/mo) or above.\\\"],[13],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"btn btn-primary btn-sm\\\"],[15,6,[29,[[30,0,[\\\"commanderCheckoutUrl\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Upgrade to Commander\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]],null]],[]]]],[]],null],[1,\\\"\\\\n  \\\"],[11,\\\"form\\\"],[24,0,\\\"audio-range-export__form\\\"],[4,[38,9],[\\\"submit\\\",[30,0,[\\\"submit\\\"]]],null],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"range-feed\\\"],[12],[1,\\\"Radio channel\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"select\\\"],[14,3,\\\"feed\\\"],[14,1,\\\"range-feed\\\"],[14,0,\\\"form-control\\\"],[14,\\\"required\\\",\\\"\\\"],[14,\\\"data-test-range-feed\\\",\\\"\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"option\\\"],[14,2,\\\"\\\"],[14,\\\"disabled\\\",\\\"\\\"],[14,\\\"selected\\\",\\\"\\\"],[12],[1,\\\"Select channel\\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[30,0,[\\\"feeds\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[10,\\\"option\\\"],[15,2,[30,1,[\\\"value\\\"]]],[12],[1,[30,1,[\\\"label\\\"]]],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"range-start-datetime\\\"],[12],[1,\\\"Start time (US Central)\\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"input-group date\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,15],[[24,3,\\\"start_datetime\\\"],[24,0,\\\"form-control\\\"]],[[\\\"@id\\\",\\\"@allowInput\\\",\\\"@defaultDate\\\",\\\"@date\\\",\\\"@enableTime\\\",\\\"@dateFormat\\\",\\\"@minuteIncrement\\\",\\\"@onChange\\\"],[\\\"range-start-datetime\\\",true,[30,0,[\\\"startDate\\\"]],[30,0,[\\\"startDate\\\"]],[30,0,[\\\"startPickerOptions\\\",\\\"enableTime\\\"]],[30,0,[\\\"startPickerOptions\\\",\\\"dateFormat\\\"]],[30,0,[\\\"startPickerOptions\\\",\\\"minuteIncrement\\\"]],null]],null],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[8,[39,17],null,[[\\\"@icon\\\"],[\\\"calendar\\\"]],null],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"range-end-datetime\\\"],[12],[1,\\\"End time (US Central)\\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"input-group date\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,15],[[24,3,\\\"end_datetime\\\"],[24,0,\\\"form-control\\\"]],[[\\\"@id\\\",\\\"@allowInput\\\",\\\"@defaultDate\\\",\\\"@date\\\",\\\"@enableTime\\\",\\\"@dateFormat\\\",\\\"@minuteIncrement\\\",\\\"@onChange\\\"],[\\\"range-end-datetime\\\",true,[30,0,[\\\"endDate\\\"]],[30,0,[\\\"endDate\\\"]],[30,0,[\\\"endPickerOptions\\\",\\\"enableTime\\\"]],[30,0,[\\\"endPickerOptions\\\",\\\"dateFormat\\\"]],[30,0,[\\\"endPickerOptions\\\",\\\"minuteIncrement\\\"]],null]],null],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[8,[39,17],null,[[\\\"@icon\\\"],[\\\"calendar\\\"]],null],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[15,\\\"disabled\\\",[30,0,[\\\"submitDisabled\\\"]]],[14,\\\"data-test-range-submit\\\",\\\"\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[52,[30,0,[\\\"isSubmitting\\\"]],\\\"Submitting...\\\",\\\"Create range export\\\"]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"createError\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"alert alert-danger mt-3 audio-range-export__message\\\"],[14,\\\"data-test-range-create-error\\\",\\\"\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[30,0,[\\\"createError\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"hasJobResult\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"card mt-3 audio-range-export__status\\\"],[14,\\\"data-test-range-status\\\",\\\"\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"card-body\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"mb-2\\\"],[12],[1,\\\"\\\\n          Export status:\\\\n          \\\"],[10,1],[15,0,[29,[\\\"badge \\\",[30,0,[\\\"statusBadgeClass\\\"]]]]],[14,\\\"data-test-range-job-status\\\",\\\"\\\"],[12],[1,[28,[35,19],[[30,0,[\\\"status\\\"]],\\\"queued\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"mb-1\\\"],[12],[1,\\\"Requested hours: \\\"],[1,[28,[35,19],[[30,0,[\\\"requestedHours\\\"]],0],null]],[13],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"mb-1\\\"],[12],[1,\\\"Processed hours: \\\"],[1,[28,[35,19],[[30,0,[\\\"processedHours\\\"]],0],null]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,20],[[30,0,[\\\"missingHours\\\"]],[30,0,[\\\"missingHours\\\",\\\"length\\\"]]],null],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"audio-range-export__missing mt-2\\\"],[14,\\\"data-test-range-missing-hours\\\",\\\"\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"mb-1\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Missing hours\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[10,\\\"ul\\\"],[14,0,\\\"mb-0\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[30,0,[\\\"missingHours\\\"]]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"li\\\"],[12],[1,[30,2]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"downloadUrl\\\"]],[[[1,\\\"          \\\"],[10,3],[15,6,[29,[[30,0,[\\\"downloadUrl\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[14,0,\\\"btn btn-success mt-3\\\"],[14,\\\"data-test-range-download\\\",\\\"\\\"],[12],[1,\\\"\\\\n            Download merged audio\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"jobError\\\"]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"alert alert-danger mt-3 mb-0 audio-range-export__message\\\"],[14,\\\"data-test-range-job-error\\\",\\\"\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[30,0,[\\\"jobError\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\"]],[\\\"feed\\\",\\\"hour\\\"],false,[\\\"div\\\",\\\"did-insert\\\",\\\"h4\\\",\\\"p\\\",\\\"unless\\\",\\\"if\\\",\\\"not\\\",\\\"a\\\",\\\"form\\\",\\\"on\\\",\\\"label\\\",\\\"select\\\",\\\"option\\\",\\\"each\\\",\\\"-track-array\\\",\\\"ember-flatpickr\\\",\\\"span\\\",\\\"fa-icon\\\",\\\"button\\\",\\\"or\\\",\\\"and\\\",\\\"strong\\\",\\\"ul\\\",\\\"li\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/audio-range-export.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/audio-search\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <form id=\"recordingsearch\" {{on \"submit\" this.submit}}>\n    <div class=\"mb-3\">\n      <label for=\"cpdfeed\">Radio channel</label>\n      <select name=\"feed\" id=\"cpdfeed\" class=\"form-control\" required>\n        {{#unless @feed}}\n        <option value=\"\" disabled selected>Select channel</option>\n        {{/unless}}\n        {{#each this.feeds as |feed|}}\n          <option value={{feed.value}} selected={{if (eq feed.value @feed) \"selected\"}}>{{feed.label}}</option>\n        {{/each}}\n      </select>\n    </div>\n    <div class=\"mb-3\">\n      <label for=\"datetimepicker\">Time of recording (in US Central time)</label>\n      <div class=\"input-group date\">\n        <EmberFlatpickr name=\"datetime\" @id=\"datetimepicker\" @allowInput={{true}} class=\"form-control\" @defaultDate={{this.options.defaultDate}} @enableTime={{this.options.enableTime}} @dateFormat={{this.options.dateFormat}} @minuteIncrement={{this.options.minuteIncrement}} @date={{readonly this.options.defaultDate}} @onChange={{null}} @altInput={{this.options.altInput}} @altFormat={{this.options.altFormat}} />\n        <span class=\"input-group-text\"><FaIcon @icon=\"calendar\" /></span>\n      </div>\n    </div>\n    <div class=\"mb-3\">\n      <button type=\"submit\" class=\"btn btn-primary\">Download recording</button>\n    </div>\n  </form>\n  \n  */\n  {\n    \"id\": \"MsqaxFaX\",\n    \"block\": \"[[[11,\\\"form\\\"],[24,1,\\\"recordingsearch\\\"],[4,[38,1],[\\\"submit\\\",[30,0,[\\\"submit\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"cpdfeed\\\"],[12],[1,\\\"Radio channel\\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"select\\\"],[14,3,\\\"feed\\\"],[14,1,\\\"cpdfeed\\\"],[14,0,\\\"form-control\\\"],[14,\\\"required\\\",\\\"\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[30,1]],[[[1,\\\"      \\\"],[10,\\\"option\\\"],[14,2,\\\"\\\"],[14,\\\"disabled\\\",\\\"\\\"],[14,\\\"selected\\\",\\\"\\\"],[12],[1,\\\"Select channel\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[42,[28,[37,8],[[28,[37,8],[[30,0,[\\\"feeds\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[10,\\\"option\\\"],[15,2,[30,2,[\\\"value\\\"]]],[15,\\\"selected\\\",[52,[28,[37,10],[[30,2,[\\\"value\\\"]],[30,1]],null],\\\"selected\\\"]],[12],[1,[30,2,[\\\"label\\\"]]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"datetimepicker\\\"],[12],[1,\\\"Time of recording (in US Central time)\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"input-group date\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,11],[[24,3,\\\"datetime\\\"],[24,0,\\\"form-control\\\"]],[[\\\"@id\\\",\\\"@allowInput\\\",\\\"@defaultDate\\\",\\\"@enableTime\\\",\\\"@dateFormat\\\",\\\"@minuteIncrement\\\",\\\"@date\\\",\\\"@onChange\\\",\\\"@altInput\\\",\\\"@altFormat\\\"],[\\\"datetimepicker\\\",true,[30,0,[\\\"options\\\",\\\"defaultDate\\\"]],[30,0,[\\\"options\\\",\\\"enableTime\\\"]],[30,0,[\\\"options\\\",\\\"dateFormat\\\"]],[30,0,[\\\"options\\\",\\\"minuteIncrement\\\"]],[28,[37,12],[[30,0,[\\\"options\\\",\\\"defaultDate\\\"]]],null],null,[30,0,[\\\"options\\\",\\\"altInput\\\"]],[30,0,[\\\"options\\\",\\\"altFormat\\\"]]]],null],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[8,[39,14],null,[[\\\"@icon\\\"],[\\\"calendar\\\"]],null],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"Download recording\\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@feed\\\",\\\"feed\\\"],false,[\\\"form\\\",\\\"on\\\",\\\"div\\\",\\\"label\\\",\\\"select\\\",\\\"unless\\\",\\\"option\\\",\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"eq\\\",\\\"ember-flatpickr\\\",\\\"readonly\\\",\\\"span\\\",\\\"fa-icon\\\",\\\"button\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/audio-search.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/directives-list\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"col-lg-12\">\n    <h1>Chicago Police Department Directive Changes</h1>\n    <p>Diffs on all CPD directives updated since 2015. View the raw diffs on <a href=\"https://github.com/CrimeIsDown/cpd-directives\">GitHub</a>.</p>\n    <div class=\"alert alert-warning\" role=\"alert\">\n      Due to changes with the CPD directives website that impact our ability to scrape it, this list has not been updated since 2021. Refer to the <a href=\"https://directives.chicagopolice.org/#search\">Search page of the official CPD directives website</a> to see the most recent directives.\n    </div>\n  \n    <p><strong>View what a directive looked like on a given date:</strong></p>\n    <form id=\"findDirectiveForm\" class=\"row\" aria-label=\"Directive viewer\" method=\"post\" {{on \"submit\" this.submitFindDirectiveForm}}>\n      <div class=\"col-sm\">\n        <label class=\"sr-only\" for=\"url\">\n          CPD directive URL\n        </label>\n        <div class=\"input-group mb-2 me-sm-2\">\n          <span class=\"input-group-text\">URL</span>\n          <input class=\"form-control\" size=\"50\" type=\"url\" name=\"url\" id=\"url\" placeholder=\"http://directives.chicagopolice.org/directives/data/...\">\n        </div>\n      </div>\n      <div class=\"col-sm\">\n        <label class=\"sr-only\" for=\"date\">\n          Version as of date\n        </label>\n        <div class=\"input-group mb-2 me-sm-2\">\n          <span class=\"input-group-text\">Date</span>\n          <input class=\"form-control\" type=\"date\" name=\"date\" id=\"date\">\n        </div>\n      </div>\n      <div class=\"col-sm\">\n        <button type=\"submit\" class=\"btn btn-primary mb-2\">Open</button>\n      </div>\n    </form>\n  \n    <table id=\"directives\" class=\"table\">\n      <thead></thead>\n      <tbody>\n      <h3>Loading...</h3>\n      </tbody>\n    </table>\n  </div>\n  \n  <div class=\"modal fade\" id=\"directiveViewer\" tabindex=\"-1\" role=\"dialog\">\n    <div class=\"modal-dialog modal-lg\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h4 class=\"modal-title\">Directive Name</h4>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div id=\"primaryDiffView\" class=\"modal-body\">\n          <iframe id=\"directiveFrame\" title=\"Directive contents\"></iframe>\n        </div>\n        {{!-- template-lint-disable no-inline-styles --}}\n        <div id=\"sideBySideView\" class=\"modal-body row\" style=\"display: none\">\n          <div class=\"col-md-6\">\n            <h5 class=\"text-center\">Old</h5>\n            <iframe id=\"oldVersion\" title=\"Old directive contents\"></iframe>\n          </div>\n          <div class=\"col-md-6\">\n            <h5 class=\"text-center\">New</h5>\n            <iframe id=\"newVersion\" title=\"New directive contents\"></iframe>\n          </div>\n        </div>\n        <div class=\"modal-footer justify-content-between\">\n          <div>\n            <a id=\"no-highlights-btn\" href=\"#\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"btn btn-sm btn-info\">View without highlights</a>\n            <a id=\"switch-diff-view\" href=\"#\" class=\"btn btn-sm btn-info\">Toggle side-by-side view</a>\n          </div>\n          <div>\n            <div class=\"input-group\">\n              <label for=\"link\" class=\"input-group-text\">Shareable link</label>\n              <input id=\"link\" name=\"link\" type=\"text\" class=\"form-control\" readonly>\n            </div>\n          </div>\n          <div>\n            <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\">Close</button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"ByY8eARp\",\n    \"block\": \"[[[10,0],[14,0,\\\"col-lg-12\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h1\\\"],[12],[1,\\\"Chicago Police Department Directive Changes\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[12],[1,\\\"Diffs on all CPD directives updated since 2015. View the raw diffs on \\\"],[10,3],[14,6,\\\"https://github.com/CrimeIsDown/cpd-directives\\\"],[12],[1,\\\"GitHub\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"alert alert-warning\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n    Due to changes with the CPD directives website that impact our ability to scrape it, this list has not been updated since 2021. Refer to the \\\"],[10,3],[14,6,\\\"https://directives.chicagopolice.org/#search\\\"],[12],[1,\\\"Search page of the official CPD directives website\\\"],[13],[1,\\\" to see the most recent directives.\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,\\\"View what a directive looked like on a given date:\\\"],[13],[13],[1,\\\"\\\\n  \\\"],[11,\\\"form\\\"],[24,1,\\\"findDirectiveForm\\\"],[24,0,\\\"row\\\"],[24,\\\"aria-label\\\",\\\"Directive viewer\\\"],[24,\\\"method\\\",\\\"post\\\"],[4,[38,6],[\\\"submit\\\",[30,0,[\\\"submitFindDirectiveForm\\\"]]],null],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only\\\"],[14,\\\"for\\\",\\\"url\\\"],[12],[1,\\\"\\\\n        CPD directive URL\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"input-group mb-2 me-sm-2\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[1,\\\"URL\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,\\\"size\\\",\\\"50\\\"],[14,3,\\\"url\\\"],[14,1,\\\"url\\\"],[14,\\\"placeholder\\\",\\\"http://directives.chicagopolice.org/directives/data/...\\\"],[14,4,\\\"url\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only\\\"],[14,\\\"for\\\",\\\"date\\\"],[12],[1,\\\"\\\\n        Version as of date\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"input-group mb-2 me-sm-2\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[1,\\\"Date\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,3,\\\"date\\\"],[14,1,\\\"date\\\"],[14,4,\\\"date\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary mb-2\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"Open\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,\\\"table\\\"],[14,1,\\\"directives\\\"],[14,0,\\\"table\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"thead\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h3\\\"],[12],[1,\\\"Loading...\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"modal fade\\\"],[14,1,\\\"directiveViewer\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[14,\\\"role\\\",\\\"dialog\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"modal-dialog modal-lg\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"modal-content\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"modal-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[14,0,\\\"modal-title\\\"],[12],[1,\\\"Directive Name\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"btn-close\\\"],[14,\\\"data-bs-dismiss\\\",\\\"modal\\\"],[14,\\\"aria-label\\\",\\\"Close\\\"],[14,4,\\\"button\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,1,\\\"primaryDiffView\\\"],[14,0,\\\"modal-body\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"iframe\\\"],[14,1,\\\"directiveFrame\\\"],[14,\\\"title\\\",\\\"Directive contents\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"      \\\"],[10,0],[14,1,\\\"sideBySideView\\\"],[14,0,\\\"modal-body row\\\"],[14,5,\\\"display: none\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h5\\\"],[14,0,\\\"text-center\\\"],[12],[1,\\\"Old\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"iframe\\\"],[14,1,\\\"oldVersion\\\"],[14,\\\"title\\\",\\\"Old directive contents\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h5\\\"],[14,0,\\\"text-center\\\"],[12],[1,\\\"New\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"iframe\\\"],[14,1,\\\"newVersion\\\"],[14,\\\"title\\\",\\\"New directive contents\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"modal-footer justify-content-between\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[12],[1,\\\"\\\\n          \\\"],[10,3],[14,1,\\\"no-highlights-btn\\\"],[14,6,\\\"#\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[14,0,\\\"btn btn-sm btn-info\\\"],[12],[1,\\\"View without highlights\\\"],[13],[1,\\\"\\\\n          \\\"],[10,3],[14,1,\\\"switch-diff-view\\\"],[14,6,\\\"#\\\"],[14,0,\\\"btn btn-sm btn-info\\\"],[12],[1,\\\"Toggle side-by-side view\\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"input-group\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"link\\\"],[14,0,\\\"input-group-text\\\"],[12],[1,\\\"Shareable link\\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,1,\\\"link\\\"],[14,3,\\\"link\\\"],[14,0,\\\"form-control\\\"],[14,\\\"readonly\\\",\\\"\\\"],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[12],[1,\\\"\\\\n          \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,\\\"data-bs-dismiss\\\",\\\"modal\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"Close\\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"div\\\",\\\"h1\\\",\\\"p\\\",\\\"a\\\",\\\"strong\\\",\\\"form\\\",\\\"on\\\",\\\"label\\\",\\\"span\\\",\\\"input\\\",\\\"button\\\",\\\"table\\\",\\\"thead\\\",\\\"tbody\\\",\\\"h3\\\",\\\"h4\\\",\\\"iframe\\\",\\\"h5\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/directives-list.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/incident-map\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"row\">\n    <div class=\"col-md-4 col-lg-3 search-container mb-4 mb-md-0\">\n      <p><em>Interact with this map or use the search box to find information about a specific address. Police districts are outlined in blue.</em></p>\n      <div class=\"accordion\" id=\"accordion\">\n        <div class=\"accordion-item\">\n          <h2 class=\"accordion-header\" id=\"headingAddrSearch\">\n            <button class=\"accordion-button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseAddrSearch\" aria-expanded=\"true\" aria-controls=\"collapseAddrSearch\" type=\"button\">\n              Address Search\n            </button>\n            {{!--<a class=\"draggable-handle\"><FaIcon @icon=\"arrows-v\" /></a>--}}\n          </h2>\n          <div id=\"collapseAddrSearch\" class=\"collapse show\" role=\"tabpanel\" aria-labelledby=\"headingAddrSearch\">\n            <div id=\"address-search\" class=\"accordion-body\">\n              <form {{on \"submit\" this.searchAddress}}>\n                <div class=\"form-group\">\n                  <label for=\"address\">Address, intersection, place to search</label>\n                  <div class=\"input-group\">\n                    <Input class=\"form-control\" name=\"address\" placeholder=\"e.g. 3510 S Michigan, Chicago\" @type=\"text\" @value={{this.address}} aria-label=\"Address, intersection, place to search\" />\n                    <button class=\"btn btn-primary\" type=\"submit\">Search</button>\n                  </div>\n                </div>\n              </form>\n              <div class=\"form-group mt-1 mb-3\">\n                <button type=\"button\" class=\"btn btn-info{{if this.geolocationPending \" disabled\" \"\"}}\" {{on \"click\" this.locateMe}} title=\"Device geolocation works best on mobile\"><FaIcon @icon=\"crosshairs\" /> Use my location</button>\n              </div>\n              {{#if this.no_results}}\n              <div class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\n                The location entered could not be found. Please try again with a different address or intersection. <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n              </div>\n              {{/if}}\n              {{#if this.location.meta.latitude}}\n              {{#if this.location_approximate}}\n              <div class=\"alert alert-warning alert-dismissible fade show\" role=\"alert\">\n                The location entered is not precise, the boundary results given may not be correct. Use a valid street address for better accuracy. <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n              </div>\n              {{/if}}\n              <table class=\"table table-bordered table-condensed\">\n                <tbody>\n                <tr class=\"info\">\n                  <th colspan=\"2\">Location Info</th>\n                </tr>\n                <tr>\n                  <td>Formatted Address</td>\n                  <td>{{ this.location.meta.formattedAddress }}</td>\n                </tr>\n                <tr>\n                  <td>Latitude: {{ this.location.meta.latitude }}</td>\n                  <td>Longitude: {{ this.location.meta.longitude }}</td>\n                </tr>\n                <tr>\n                  <td>Neighborhood</td>\n                  <td>{{ this.location.meta.neighborhood }}</td>\n                </tr>\n                <tr>\n                  <td>Community Area</td>\n                  <td>{{ this.location.meta.communityArea }}</td>\n                </tr>\n                <tr>\n                  <td>Ward / Alderman</td>\n                  <td>{{#if this.location.meta.ward}}{{ this.location.meta.ward }} - <a href=\"{{ this.location.meta.alderman.website }}\" target=\"_blank\" rel=\"noopener noreferrer\">Alderman {{ this.location.meta.alderman.name }}</a>{{/if}}</td>\n                </tr>\n                <tr class=\"info\">\n                  <th colspan=\"2\">Chicago Police Department</th>\n                </tr>\n                <tr>\n                  <td>District {{ this.location.police.district }}, Beat {{ this.location.police.beat }}</td>\n                  <td>Area {{ this.location.police.area }}</td>\n                </tr>\n                <tr>\n                  <td colspan=\"2\">\n                    {{#if this.location.police.zone.name}}\n                      <strong>{{ this.location.police.zone.name }}</strong> ({{ this.location.police.zone.frequency }})<br>\n                      <p>{{ this.location.police.zone.description }}</p>\n                      <p><LinkTo class=\"btn btn-primary\" @route=\"audio-live\" @model={{this.location.police.zone.slug}} title={{concat \"Listen to \" this.location.police.zone.name}}><FaIcon @icon=\"volume-up\" /> Listen to CPD with Instant Replay</LinkTo></p>\n                      <StreamPlayer @stream={{this.location.police.zone}} @autoplay={{false}} />\n  \n                      <h5><strong>Search the audio archive</strong></h5>\n                      {{#if (eq this.location.police.district \"2\")}}\n                      <p class=\"mb-0\"><small><sup>*</sup>The 2nd district switched to Zone 7 on June 30, 2022.</small></p>\n                      {{/if}}\n                      <AudioSearch @feed={{this.location.police.zone.slug}} />\n                    {{/if}}\n                  </td>\n                </tr>\n  \n                <tr class=\"info\">\n                  <th colspan=\"2\">Chicago Fire Department</th>\n                </tr>\n                <tr>\n                  <td>\n                    <i>Nearest Companies:</i><br>\n                    <span tabindex=\"0\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"{{ this.location.fire.nearestEngine.addr }}\">{{ this.location.fire.nearestEngine.engine }} (Engine)</span><br>\n                    <span tabindex=\"0\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"{{ this.location.fire.nearestTruck.addr }}\">{{ this.location.fire.nearestTruck.truck }} (Truck)</span><br>\n                    <span tabindex=\"0\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"{{ this.location.fire.nearestAmbo.addr }}\">{{ this.location.fire.nearestAmbo.ambo }} (Ambo.)</span><br>\n                    <span tabindex=\"0\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"{{ this.location.fire.nearestSquad.addr }}\">{{ this.location.fire.nearestSquad.squad }} (Squad)</span>\n                  </td>\n                  <td>\n                    <i>Loc. Within:</i><br>\n                    Battalion {{ this.location.fire.battalion }}<br>\n                    Fire Dist. {{ this.location.fire.fireDistrict }}<br>\n                    EMS District {{ this.location.fire.emsDistrict }}\n                  </td>\n                </tr>\n                <tr>\n                  <td colspan=\"2\">\n                    Radio Channel: <strong>{{ this.location.fire.channel }}</strong>\n                    {{#if this.location.fire.channel}}\n                    <a\n                      href=\"{{if (eq this.location.fire.channel \"Main\") \"https://openmhz.com/system/chi_cfd?filter-type=talkgroup&filter-code=1,3\" \"https://openmhz.com/system/chi_cfd?filter-type=talkgroup&filter-code=2,4\"}}\"\n                      class=\"btn btn-primary\" title=\"Listen to CFD {{ this.location.fire.channel }}\"\n                    ><FaIcon @icon=\"volume-up\" /> Listen to CFD with Instant Replay</a>\n                    {{/if}}\n                  </td>\n                </tr>\n                <tr class=\"info\">\n                  <th colspan=\"2\">Closest Medical Services</th>\n                </tr>\n                <tr>\n                  <td colspan=\"2\">\n                    Adult Trauma Center:\n                    {{#if this.location.ems.nearestTraumaAdult.name}}\n                    <em>\n                      {{ this.location.ems.nearestTraumaAdult.name }}\n                      -\n                      {{ this.location.ems.nearestTraumaAdult.distanceMi }}mi\n                    </em>\n                    ({{ this.location.ems.nearestTraumaAdult.addr }},\n                      {{ this.location.ems.nearestTraumaAdult.city }},\n                      {{ this.location.ems.nearestTraumaAdult.state }},\n                      {{ this.location.ems.nearestTraumaAdult.zip }})\n                    - Patient Reports on {{ this.location.ems.nearestTraumaAdult.medChannel }}\n                    {{/if}}\n                  </td>\n                </tr>\n                <tr>\n                  <td colspan=\"2\">\n                    Pediatric Trauma Center:\n                    {{#if this.location.ems.nearestTraumaPed.name}}\n                    <em>\n                      {{ this.location.ems.nearestTraumaPed.name }}\n                      -\n                      {{ this.location.ems.nearestTraumaPed.distanceMi }}mi\n                    </em>\n                    ({{ this.location.ems.nearestTraumaPed.addr }},\n                      {{ this.location.ems.nearestTraumaPed.city }},\n                      {{ this.location.ems.nearestTraumaPed.state }},\n                      {{ this.location.ems.nearestTraumaPed.zip }})\n                    - Patient Reports on {{ this.location.ems.nearestTraumaPed.medChannel }}\n                    {{/if}}\n                  </td>\n                </tr>\n                </tbody>\n              </table>\n              {{/if}}\n            </div>\n          </div>\n        </div>\n        <MapTools />\n      </div>\n    </div>\n    <div class=\"col map-container\">\n      <ul class=\"nav nav-tabs\" id=\"cadTabs\" role=\"tablist\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" id=\"map-tab\" data-bs-toggle=\"tab\" href=\"#main-map\" aria-controls=\"main-map\"><span class=\"d-none d-md-inline\">Address Search</span> Map</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" id=\"traffic-tab\" data-bs-toggle=\"tab\" href=\"#traffic-map\" aria-controls=\"traffic-map\">Traffic<span class=\"d-none d-md-inline\"> Map</span></a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" id=\"crime-tab\" data-bs-toggle=\"tab\" href=\"#crime-map\" aria-controls=\"crime-map\">Crime<span class=\"d-none d-md-inline\"> Map</span></a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"/transcripts/map\">Incidents<span class=\"d-none d-md-inline\"> Map</span></a>\n        </li>\n      </ul>\n  \n      <div class=\"tab-content\">\n        <div class=\"tab-pane fade show active\" id=\"main-map\" role=\"tabpanel\" aria-labelledby=\"map-tab\">\n          <div id=\"leaflet-map\" {{did-insert this.initMap}}></div>\n        </div>\n        <div class=\"tab-pane fade\" id=\"traffic-map\" role=\"tabpanel\" aria-labelledby=\"traffic-tab\">\n          <div data-src={{this.wazeIframeUrl}}>\n            <iframe id=\"waze-map\" title=\"Waze map\"></iframe>\n          </div>\n        </div>\n        <div class=\"tab-pane fade\" id=\"crime-map\" role=\"tabpanel\" aria-labelledby=\"crime-tab\">\n          <div data-src={{this.crimereportsIframeUrl}}>\n            <iframe id=\"clear-map\" title=\"Crime map\"></iframe>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"JYq0wEkI\",\n    \"block\": \"[[[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"col-md-4 col-lg-3 search-container mb-4 mb-md-0\\\"],[12],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"em\\\"],[12],[1,\\\"Interact with this map or use the search box to find information about a specific address. Police districts are outlined in blue.\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"accordion\\\"],[14,1,\\\"accordion\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h2\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"headingAddrSearch\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#collapseAddrSearch\\\"],[14,\\\"aria-expanded\\\",\\\"true\\\"],[14,\\\"aria-controls\\\",\\\"collapseAddrSearch\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            Address Search\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,1,\\\"collapseAddrSearch\\\"],[14,0,\\\"collapse show\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"headingAddrSearch\\\"],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"address-search\\\"],[14,0,\\\"accordion-body\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"form\\\"],[4,[38,6],[\\\"submit\\\",[30,0,[\\\"searchAddress\\\"]]],null],[12],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"address\\\"],[12],[1,\\\"Address, intersection, place to search\\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"input-group\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[39,8],[[24,0,\\\"form-control\\\"],[24,3,\\\"address\\\"],[24,\\\"placeholder\\\",\\\"e.g. 3510 S Michigan, Chicago\\\"],[24,\\\"aria-label\\\",\\\"Address, intersection, place to search\\\"]],[[\\\"@type\\\",\\\"@value\\\"],[\\\"text\\\",[30,0,[\\\"address\\\"]]]],null],[1,\\\"\\\\n                  \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"Search\\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"form-group mt-1 mb-3\\\"],[12],[1,\\\"\\\\n              \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-info\\\",[52,[30,0,[\\\"geolocationPending\\\"]],\\\" disabled\\\",\\\"\\\"]]]],[24,\\\"title\\\",\\\"Device geolocation works best on mobile\\\"],[24,4,\\\"button\\\"],[4,[38,6],[\\\"click\\\",[30,0,[\\\"locateMe\\\"]]],null],[12],[8,[39,10],null,[[\\\"@icon\\\"],[\\\"crosshairs\\\"]],null],[1,\\\" Use my location\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"no_results\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"alert alert-danger alert-dismissible fade show\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n              The location entered could not be found. Please try again with a different address or intersection. \\\"],[10,\\\"button\\\"],[14,0,\\\"btn-close\\\"],[14,\\\"data-bs-dismiss\\\",\\\"alert\\\"],[14,\\\"aria-label\\\",\\\"Close\\\"],[14,4,\\\"button\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"latitude\\\"]],[[[41,[30,0,[\\\"location_approximate\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"alert alert-warning alert-dismissible fade show\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n              The location entered is not precise, the boundary results given may not be correct. Use a valid street address for better accuracy. \\\"],[10,\\\"button\\\"],[14,0,\\\"btn-close\\\"],[14,\\\"data-bs-dismiss\\\",\\\"alert\\\"],[14,\\\"aria-label\\\",\\\"Close\\\"],[14,4,\\\"button\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[10,\\\"table\\\"],[14,0,\\\"table table-bordered table-condensed\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"th\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"Location Info\\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"Formatted Address\\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"formattedAddress\\\"]]],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"Latitude: \\\"],[1,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"latitude\\\"]]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"Longitude: \\\"],[1,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"longitude\\\"]]],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"Neighborhood\\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"neighborhood\\\"]]],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"Community Area\\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"communityArea\\\"]]],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"Ward / Alderman\\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[41,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"ward\\\"]],[[[1,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"ward\\\"]]],[1,\\\" - \\\"],[10,3],[15,6,[29,[[30,0,[\\\"location\\\",\\\"meta\\\",\\\"alderman\\\",\\\"website\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Alderman \\\"],[1,[30,0,[\\\"location\\\",\\\"meta\\\",\\\"alderman\\\",\\\"name\\\"]]],[13]],[]],null],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"th\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"Chicago Police Department\\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"District \\\"],[1,[30,0,[\\\"location\\\",\\\"police\\\",\\\"district\\\"]]],[1,\\\", Beat \\\"],[1,[30,0,[\\\"location\\\",\\\"police\\\",\\\"beat\\\"]]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"Area \\\"],[1,[30,0,[\\\"location\\\",\\\"police\\\",\\\"area\\\"]]],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\",\\\"name\\\"]],[[[1,\\\"                    \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\",\\\"name\\\"]]],[13],[1,\\\" (\\\"],[1,[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\",\\\"frequency\\\"]]],[1,\\\")\\\"],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,2],[12],[1,[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\",\\\"description\\\"]]],[13],[1,\\\"\\\\n                    \\\"],[10,2],[12],[8,[39,19],[[24,0,\\\"btn btn-primary\\\"],[16,\\\"title\\\",[28,[37,20],[\\\"Listen to \\\",[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\",\\\"name\\\"]]],null]]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"audio-live\\\",[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\",\\\"slug\\\"]]]],[[\\\"default\\\"],[[[[8,[39,10],null,[[\\\"@icon\\\"],[\\\"volume-up\\\"]],null],[1,\\\" Listen to CPD with Instant Replay\\\"]],[]]]]],[13],[1,\\\"\\\\n                    \\\"],[8,[39,21],null,[[\\\"@stream\\\",\\\"@autoplay\\\"],[[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\"]],false]],null],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"h5\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Search the audio archive\\\"],[13],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,23],[[30,0,[\\\"location\\\",\\\"police\\\",\\\"district\\\"]],\\\"2\\\"],null],[[[1,\\\"                    \\\"],[10,2],[14,0,\\\"mb-0\\\"],[12],[10,\\\"small\\\"],[12],[10,\\\"sup\\\"],[12],[1,\\\"*\\\"],[13],[1,\\\"The 2nd district switched to Zone 7 on June 30, 2022.\\\"],[13],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[8,[39,26],null,[[\\\"@feed\\\"],[[30,0,[\\\"location\\\",\\\"police\\\",\\\"zone\\\",\\\"slug\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n\\\\n              \\\"],[10,\\\"tr\\\"],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"th\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"Chicago Fire Department\\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"i\\\"],[12],[1,\\\"Nearest Companies:\\\"],[13],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                  \\\"],[10,1],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"data-bs-toggle\\\",\\\"tooltip\\\"],[14,\\\"data-bs-placement\\\",\\\"top\\\"],[15,\\\"title\\\",[29,[[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestEngine\\\",\\\"addr\\\"]]]]],[12],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestEngine\\\",\\\"engine\\\"]]],[1,\\\" (Engine)\\\"],[13],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                  \\\"],[10,1],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"data-bs-toggle\\\",\\\"tooltip\\\"],[14,\\\"data-bs-placement\\\",\\\"top\\\"],[15,\\\"title\\\",[29,[[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestTruck\\\",\\\"addr\\\"]]]]],[12],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestTruck\\\",\\\"truck\\\"]]],[1,\\\" (Truck)\\\"],[13],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                  \\\"],[10,1],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"data-bs-toggle\\\",\\\"tooltip\\\"],[14,\\\"data-bs-placement\\\",\\\"top\\\"],[15,\\\"title\\\",[29,[[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestAmbo\\\",\\\"addr\\\"]]]]],[12],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestAmbo\\\",\\\"ambo\\\"]]],[1,\\\" (Ambo.)\\\"],[13],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                  \\\"],[10,1],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"data-bs-toggle\\\",\\\"tooltip\\\"],[14,\\\"data-bs-placement\\\",\\\"top\\\"],[15,\\\"title\\\",[29,[[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestSquad\\\",\\\"addr\\\"]]]]],[12],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"nearestSquad\\\",\\\"squad\\\"]]],[1,\\\" (Squad)\\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"i\\\"],[12],[1,\\\"Loc. Within:\\\"],[13],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                  Battalion \\\"],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"battalion\\\"]]],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                  Fire Dist. \\\"],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"fireDistrict\\\"]]],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n                  EMS District \\\"],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"emsDistrict\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"\\\\n                  Radio Channel: \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"channel\\\"]]],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"location\\\",\\\"fire\\\",\\\"channel\\\"]],[[[1,\\\"                  \\\"],[10,3],[15,6,[29,[[52,[28,[37,23],[[30,0,[\\\"location\\\",\\\"fire\\\",\\\"channel\\\"]],\\\"Main\\\"],null],\\\"https://openmhz.com/system/chi_cfd?filter-type=talkgroup&filter-code=1,3\\\",\\\"https://openmhz.com/system/chi_cfd?filter-type=talkgroup&filter-code=2,4\\\"]]]],[14,0,\\\"btn btn-primary\\\"],[15,\\\"title\\\",[29,[\\\"Listen to CFD \\\",[30,0,[\\\"location\\\",\\\"fire\\\",\\\"channel\\\"]]]]],[12],[8,[39,10],null,[[\\\"@icon\\\"],[\\\"volume-up\\\"]],null],[1,\\\" Listen to CFD with Instant Replay\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"th\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"Closest Medical Services\\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"\\\\n                  Adult Trauma Center:\\\\n\\\"],[41,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"name\\\"]],[[[1,\\\"                  \\\"],[10,\\\"em\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"name\\\"]]],[1,\\\"\\\\n                    -\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"distanceMi\\\"]]],[1,\\\"mi\\\\n                  \\\"],[13],[1,\\\"\\\\n                  (\\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"addr\\\"]]],[1,\\\",\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"city\\\"]]],[1,\\\",\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"state\\\"]]],[1,\\\",\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"zip\\\"]]],[1,\\\")\\\\n                  - Patient Reports on \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaAdult\\\",\\\"medChannel\\\"]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"2\\\"],[12],[1,\\\"\\\\n                  Pediatric Trauma Center:\\\\n\\\"],[41,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"name\\\"]],[[[1,\\\"                  \\\"],[10,\\\"em\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"name\\\"]]],[1,\\\"\\\\n                    -\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"distanceMi\\\"]]],[1,\\\"mi\\\\n                  \\\"],[13],[1,\\\"\\\\n                  (\\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"addr\\\"]]],[1,\\\",\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"city\\\"]]],[1,\\\",\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"state\\\"]]],[1,\\\",\\\\n                    \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"zip\\\"]]],[1,\\\")\\\\n                  - Patient Reports on \\\"],[1,[30,0,[\\\"location\\\",\\\"ems\\\",\\\"nearestTraumaPed\\\",\\\"medChannel\\\"]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[8,[39,29],null,null,null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"col map-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"ul\\\"],[14,0,\\\"nav nav-tabs\\\"],[14,1,\\\"cadTabs\\\"],[14,\\\"role\\\",\\\"tablist\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"nav-link active\\\"],[14,1,\\\"map-tab\\\"],[14,\\\"data-bs-toggle\\\",\\\"tab\\\"],[14,6,\\\"#main-map\\\"],[14,\\\"aria-controls\\\",\\\"main-map\\\"],[12],[10,1],[14,0,\\\"d-none d-md-inline\\\"],[12],[1,\\\"Address Search\\\"],[13],[1,\\\" Map\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"nav-link\\\"],[14,1,\\\"traffic-tab\\\"],[14,\\\"data-bs-toggle\\\",\\\"tab\\\"],[14,6,\\\"#traffic-map\\\"],[14,\\\"aria-controls\\\",\\\"traffic-map\\\"],[12],[1,\\\"Traffic\\\"],[10,1],[14,0,\\\"d-none d-md-inline\\\"],[12],[1,\\\" Map\\\"],[13],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"nav-link\\\"],[14,1,\\\"crime-tab\\\"],[14,\\\"data-bs-toggle\\\",\\\"tab\\\"],[14,6,\\\"#crime-map\\\"],[14,\\\"aria-controls\\\",\\\"crime-map\\\"],[12],[1,\\\"Crime\\\"],[10,1],[14,0,\\\"d-none d-md-inline\\\"],[12],[1,\\\" Map\\\"],[13],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"nav-link\\\"],[14,6,\\\"/transcripts/map\\\"],[12],[1,\\\"Incidents\\\"],[10,1],[14,0,\\\"d-none d-md-inline\\\"],[12],[1,\\\" Map\\\"],[13],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"tab-content\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"tab-pane fade show active\\\"],[14,1,\\\"main-map\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"map-tab\\\"],[12],[1,\\\"\\\\n        \\\"],[11,0],[24,1,\\\"leaflet-map\\\"],[4,[38,32],[[30,0,[\\\"initMap\\\"]]],null],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"tab-pane fade\\\"],[14,1,\\\"traffic-map\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"traffic-tab\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,\\\"data-src\\\",[30,0,[\\\"wazeIframeUrl\\\"]]],[12],[1,\\\"\\\\n          \\\"],[10,\\\"iframe\\\"],[14,1,\\\"waze-map\\\"],[14,\\\"title\\\",\\\"Waze map\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"tab-pane fade\\\"],[14,1,\\\"crime-map\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"crime-tab\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,\\\"data-src\\\",[30,0,[\\\"crimereportsIframeUrl\\\"]]],[12],[1,\\\"\\\\n          \\\"],[10,\\\"iframe\\\"],[14,1,\\\"clear-map\\\"],[14,\\\"title\\\",\\\"Crime map\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"div\\\",\\\"p\\\",\\\"em\\\",\\\"h2\\\",\\\"button\\\",\\\"form\\\",\\\"on\\\",\\\"label\\\",\\\"input\\\",\\\"if\\\",\\\"fa-icon\\\",\\\"table\\\",\\\"tbody\\\",\\\"tr\\\",\\\"th\\\",\\\"td\\\",\\\"a\\\",\\\"strong\\\",\\\"br\\\",\\\"link-to\\\",\\\"concat\\\",\\\"stream-player\\\",\\\"h5\\\",\\\"eq\\\",\\\"small\\\",\\\"sup\\\",\\\"audio-search\\\",\\\"i\\\",\\\"span\\\",\\\"map-tools\\\",\\\"ul\\\",\\\"li\\\",\\\"did-insert\\\",\\\"iframe\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/incident-map.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/map-tools\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"accordion-item\">\n    <h2 class=\"accordion-header\" id=\"headingRIDSearch\">\n      <button class=\"accordion-button collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseRIDSearch\" aria-expanded=\"true\" aria-controls=\"collapseRIDSearch\" type=\"button\">\n        Radio ID Search\n      </button>\n    </h2>\n    <div id=\"collapseRIDSearch\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingRIDSearch\">\n      <div id=\"search-radioids\" class=\"accordion-body\">\n        <SearchRadioids />\n      </div>\n    </div>\n  </div>\n  <div class=\"accordion-item\">\n    <h2 class=\"accordion-header\" id=\"headingUCRSearch\">\n      <button class=\"accordion-button collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseUCRSearch\" aria-expanded=\"true\" aria-controls=\"collapseUCRSearch\" type=\"button\">\n        UCR Code Search\n      </button>\n    </h2>\n    <div id=\"collapseUCRSearch\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingUCRSearch\">\n      <div id=\"search-ucrcodes\" class=\"accordion-body\">\n        <SearchUcrcodes />\n      </div>\n    </div>\n  </div>\n  <div class=\"accordion-item\">\n    <h2 class=\"accordion-header\" id=\"headingNotepad\">\n      <button class=\"accordion-button collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseNotepad\" aria-expanded=\"true\" aria-controls=\"collapseNotepad\" type=\"button\">\n        Notepad\n      </button>\n    </h2>\n    <div id=\"collapseNotepad\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingNotepad\">\n      <div id=\"notepad\" class=\"accordion-body\">\n        <p>Use the text area for any notes you may need to take when listening to the scanner.</p>\n        <PellEditor />\n        <p><em>Refreshing the page or navigating away will clear anything you have written.</em></p>\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"FNsYOVo6\",\n    \"block\": \"[[[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"headingRIDSearch\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button collapsed\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#collapseRIDSearch\\\"],[14,\\\"aria-expanded\\\",\\\"true\\\"],[14,\\\"aria-controls\\\",\\\"collapseRIDSearch\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n      Radio ID Search\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,1,\\\"collapseRIDSearch\\\"],[14,0,\\\"accordion-collapse collapse\\\"],[14,\\\"aria-labelledby\\\",\\\"headingRIDSearch\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,1,\\\"search-radioids\\\"],[14,0,\\\"accordion-body\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,3],null,null,null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"headingUCRSearch\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button collapsed\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#collapseUCRSearch\\\"],[14,\\\"aria-expanded\\\",\\\"true\\\"],[14,\\\"aria-controls\\\",\\\"collapseUCRSearch\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n      UCR Code Search\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,1,\\\"collapseUCRSearch\\\"],[14,0,\\\"accordion-collapse collapse\\\"],[14,\\\"aria-labelledby\\\",\\\"headingUCRSearch\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,1,\\\"search-ucrcodes\\\"],[14,0,\\\"accordion-body\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,4],null,null,null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"headingNotepad\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button collapsed\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#collapseNotepad\\\"],[14,\\\"aria-expanded\\\",\\\"true\\\"],[14,\\\"aria-controls\\\",\\\"collapseNotepad\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n      Notepad\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,1,\\\"collapseNotepad\\\"],[14,0,\\\"accordion-collapse collapse\\\"],[14,\\\"aria-labelledby\\\",\\\"headingNotepad\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,1,\\\"notepad\\\"],[14,0,\\\"accordion-body\\\"],[12],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Use the text area for any notes you may need to take when listening to the scanner.\\\"],[13],[1,\\\"\\\\n      \\\"],[8,[39,6],null,null,null],[1,\\\"\\\\n      \\\"],[10,2],[12],[10,\\\"em\\\"],[12],[1,\\\"Refreshing the page or navigating away will clear anything you have written.\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"div\\\",\\\"h2\\\",\\\"button\\\",\\\"search-radioids\\\",\\\"search-ucrcodes\\\",\\\"p\\\",\\\"pell-editor\\\",\\\"em\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/map-tools.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/media-player\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <audio\n    id=\"videojs-player{{@idSuffix}}\"\n    class=\"video-js vjs-default-skin vjs-fluid\"\n    {{did-insert this.initializeMediaPlayer}}\n    {{will-destroy this.teardownMediaPlayer}}\n  >\n  </audio>\n  <div id=\"timeline{{@idSuffix}}\"></div>\n  \n  {{#if (and (not @hideZoom) (not @disableWavesurfer))}}\n  <div class=\"input-group mb-3\">\n    <span class=\"input-group-text\"><FaIcon @icon=\"search-minus\" /></span>\n    <input\n      class=\"form-control\"\n      name=\"zoom\"\n      type=\"range\"\n      min={{this.minZoom}}\n      max={{this.maxZoom}}\n      step=\"1\"\n      value={{this.currentZoom}}\n      {{on \"change\" this.zoom}}\n      aria-label=\"Zoom control\"\n    />\n    <span class=\"input-group-text\"><FaIcon @icon=\"search-plus\" /></span>\n  </div>\n  {{/if}}\n  \n  */\n  {\n    \"id\": \"rbeVXDfW\",\n    \"block\": \"[[[11,\\\"audio\\\"],[16,1,[29,[\\\"videojs-player\\\",[30,1]]]],[24,0,\\\"video-js vjs-default-skin vjs-fluid\\\"],[4,[38,1],[[30,0,[\\\"initializeMediaPlayer\\\"]]],null],[4,[38,2],[[30,0,[\\\"teardownMediaPlayer\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[15,1,[29,[\\\"timeline\\\",[30,1]]]],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,5],[[28,[37,6],[[30,2]],null],[28,[37,6],[[30,3]],null]],null],[[[10,0],[14,0,\\\"input-group mb-3\\\"],[12],[1,\\\"\\\\n  \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[8,[39,8],null,[[\\\"@icon\\\"],[\\\"search-minus\\\"]],null],[13],[1,\\\"\\\\n  \\\"],[11,\\\"input\\\"],[24,0,\\\"form-control\\\"],[24,3,\\\"zoom\\\"],[16,\\\"min\\\",[30,0,[\\\"minZoom\\\"]]],[16,\\\"max\\\",[30,0,[\\\"maxZoom\\\"]]],[24,\\\"step\\\",\\\"1\\\"],[16,2,[30,0,[\\\"currentZoom\\\"]]],[24,\\\"aria-label\\\",\\\"Zoom control\\\"],[24,4,\\\"range\\\"],[4,[38,10],[\\\"change\\\",[30,0,[\\\"zoom\\\"]]],null],[12],[13],[1,\\\"\\\\n  \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[8,[39,8],null,[[\\\"@icon\\\"],[\\\"search-plus\\\"]],null],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@idSuffix\\\",\\\"@hideZoom\\\",\\\"@disableWavesurfer\\\"],false,[\\\"audio\\\",\\\"did-insert\\\",\\\"will-destroy\\\",\\\"div\\\",\\\"if\\\",\\\"and\\\",\\\"not\\\",\\\"span\\\",\\\"fa-icon\\\",\\\"input\\\",\\\"on\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/media-player.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/notification-channel-form\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h2 id=\"channel-form-heading\" class=\"fs-4 mt-4\">{{if @channel \"Edit\" \"Add a new\"}} notification channel</h2>\n  <form id=\"channel-form\" {{on \"submit\" this.submit}}>\n    <div class=\"mb-3\">\n      <label for=\"serviceInput\" class=\"form-label\">Service name:</label>\n      <select id=\"serviceInput\" name=\"service\" class=\"form-select\" {{on \"change\" this.setService}} required>\n        <option value=\"\">Choose a service</option>\n        <option value=\"ntfy\" selected={{eq @channel.service \"ntfy\"}}>ntfy.crimeisdown.com</option>\n        <option value=\"tgram\" selected={{eq @channel.service \"tgram\"}}>Telegram</option>\n        <option value=\"ses\" selected={{eq @channel.service \"ses\"}}>Email</option>\n        {{!-- <option value=\"sns\" selected={{eq @channel.service \"sns\"}}>SMS</option> --}}\n      </select>\n    </div>\n    <div class=\"mb-3\">\n      <label for=\"pathInput\" class=\"form-label\">\n        Destination:\n        {{#if (or (eq @channel.service \"tgram\") (eq this.service \"tgram\"))}}\n        Telegram Chat ID\n        {{/if}}\n        {{#if (or (eq @channel.service \"ntfy\") (eq this.service \"ntfy\"))}}\n        ntfy Topic Name\n        {{/if}}\n        {{#if (or (eq @channel.service \"ses\") (eq this.service \"ses\"))}}\n        Email Address\n        {{/if}}\n        {{#if (or (eq @channel.service \"sns\") (eq this.service \"sns\"))}}\n        Phone Number\n        {{/if}}\n      </label>\n      <Input @type=\"text\" class=\"form-control\" id=\"pathInput\" name=\"path\" @value={{@channel.path}} required />\n    </div>\n    {{#if (or (eq @channel.service \"tgram\") (eq this.service \"tgram\"))}}\n    <div class=\"alert alert-info\" role=\"alert\">\n      Get your Telegram chat ID by sending a message to <a href=\"https://t.me/crimeisdown_bot\" target=\"_blank\" rel=\"noopener noreferrer\">@crimeisdown_bot</a>.\n    </div>\n    {{/if}}\n    {{#if (or (eq @channel.service \"ntfy\") (eq this.service \"ntfy\"))}}\n    <div class=\"alert alert-info\" role=\"alert\">\n      This topic name can be anything you like, but it must be unique across all users. It cannot contain spaces (use _underscores_ instead). This topic name is what you will enter onto <a href=\"https://ntfy.crimeisdown.com/\" target=\"_blank\" rel=\"noopener noreferrer\">ntfy.crimeisdown.com</a> to subscribe to notifications.\n    </div>\n    {{/if}}\n    <button type=\"submit\" class=\"btn btn-primary\">{{if @channel \"Update\" \"Add\"}} Channel</button>\n  </form>\n  \n  */\n  {\n    \"id\": \"5zHeQSdC\",\n    \"block\": \"[[[10,\\\"h2\\\"],[14,1,\\\"channel-form-heading\\\"],[14,0,\\\"fs-4 mt-4\\\"],[12],[1,[52,[30,1],\\\"Edit\\\",\\\"Add a new\\\"]],[1,\\\" notification channel\\\"],[13],[1,\\\"\\\\n\\\"],[11,\\\"form\\\"],[24,1,\\\"channel-form\\\"],[4,[38,3],[\\\"submit\\\",[30,0,[\\\"submit\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"serviceInput\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"Service name:\\\"],[13],[1,\\\"\\\\n    \\\"],[11,\\\"select\\\"],[24,1,\\\"serviceInput\\\"],[24,3,\\\"service\\\"],[24,0,\\\"form-select\\\"],[24,\\\"required\\\",\\\"\\\"],[4,[38,3],[\\\"change\\\",[30,0,[\\\"setService\\\"]]],null],[12],[1,\\\"\\\\n      \\\"],[10,\\\"option\\\"],[14,2,\\\"\\\"],[12],[1,\\\"Choose a service\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"option\\\"],[14,2,\\\"ntfy\\\"],[15,\\\"selected\\\",[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"ntfy\\\"],null]],[12],[1,\\\"ntfy.crimeisdown.com\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"option\\\"],[14,2,\\\"tgram\\\"],[15,\\\"selected\\\",[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"tgram\\\"],null]],[12],[1,\\\"Telegram\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"option\\\"],[14,2,\\\"ses\\\"],[15,\\\"selected\\\",[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"ses\\\"],null]],[12],[1,\\\"Email\\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"pathInput\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"\\\\n      Destination:\\\\n\\\"],[41,[28,[37,9],[[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"tgram\\\"],null],[28,[37,8],[[30,0,[\\\"service\\\"]],\\\"tgram\\\"],null]],null],[[[1,\\\"      Telegram Chat ID\\\\n\\\"]],[]],null],[41,[28,[37,9],[[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"ntfy\\\"],null],[28,[37,8],[[30,0,[\\\"service\\\"]],\\\"ntfy\\\"],null]],null],[[[1,\\\"      ntfy Topic Name\\\\n\\\"]],[]],null],[41,[28,[37,9],[[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"ses\\\"],null],[28,[37,8],[[30,0,[\\\"service\\\"]],\\\"ses\\\"],null]],null],[[[1,\\\"      Email Address\\\\n\\\"]],[]],null],[41,[28,[37,9],[[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"sns\\\"],null],[28,[37,8],[[30,0,[\\\"service\\\"]],\\\"sns\\\"],null]],null],[[[1,\\\"      Phone Number\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[8,[39,10],[[24,0,\\\"form-control\\\"],[24,1,\\\"pathInput\\\"],[24,3,\\\"path\\\"],[24,\\\"required\\\",\\\"\\\"]],[[\\\"@type\\\",\\\"@value\\\"],[\\\"text\\\",[30,1,[\\\"path\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"tgram\\\"],null],[28,[37,8],[[30,0,[\\\"service\\\"]],\\\"tgram\\\"],null]],null],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"alert alert-info\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n    Get your Telegram chat ID by sending a message to \\\"],[10,3],[14,6,\\\"https://t.me/crimeisdown_bot\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"@crimeisdown_bot\\\"],[13],[1,\\\".\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,9],[[28,[37,8],[[30,1,[\\\"service\\\"]],\\\"ntfy\\\"],null],[28,[37,8],[[30,0,[\\\"service\\\"]],\\\"ntfy\\\"],null]],null],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"alert alert-info\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n    This topic name can be anything you like, but it must be unique across all users. It cannot contain spaces (use _underscores_ instead). This topic name is what you will enter onto \\\"],[10,3],[14,6,\\\"https://ntfy.crimeisdown.com/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"ntfy.crimeisdown.com\\\"],[13],[1,\\\" to subscribe to notifications.\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,4,\\\"submit\\\"],[12],[1,[52,[30,1],\\\"Update\\\",\\\"Add\\\"]],[1,\\\" Channel\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@channel\\\"],false,[\\\"h2\\\",\\\"if\\\",\\\"form\\\",\\\"on\\\",\\\"div\\\",\\\"label\\\",\\\"select\\\",\\\"option\\\",\\\"eq\\\",\\\"or\\\",\\\"input\\\",\\\"a\\\",\\\"button\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/notification-channel-form.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/notification-channel-list\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#unless (or @form @channels)}}\n  <h2 class=\"fs-4\">Your available notification channels</h2>\n  {{/unless}}\n  {{#unless this.channels}}\n  <p>No channels. Add one!</p>\n  {{/unless}}\n  <ul class=\"list-group\">\n  {{#each this.channels as |channel|}}\n  {{#if (or (not @channels) (includes @channels channel.intId))}}\n    <li class=\"list-group-item\">\n      {{#if @form}}\n        {{#if @selectedChannels}}\n        <input class=\"form-check-input\" type=\"checkbox\" value=\"{{channel.id}}\" id=\"channel_{{channel.id}}\" name=\"notification_channels\" checked={{includes @selectedChannels channel.intId}}>\n        {{else}}\n        <input class=\"form-check-input\" type=\"checkbox\" value=\"{{channel.id}}\" id=\"channel_{{channel.id}}\" name=\"notification_channels\">\n        {{/if}}\n        <label class=\"form-check-label\" for=\"channel_{{channel.id}}\">\n          <span class=\"badge bg-primary ms-2 me-2\">\n            {{channel.serviceName}}\n          </span>\n          {{channel.path}}\n        </label>\n      {{else}}\n        <div class=\"row\">\n          <div class=\"col\">\n            <span class=\"badge bg-primary me-2\">\n              {{channel.serviceName}}\n            </span>\n            {{channel.path}}\n          </div>\n          {{#unless @channels}}\n          <div class=\"col-3 d-flex justify-content-end\">\n            <button type=\"button\" class=\"btn btn-secondary btn-sm me-2\" aria-label=\"Edit\" {{on \"click\" (fn @onEdit channel)}}><FaIcon @icon=\"pencil-alt\" /></button>\n            <button type=\"button\" class=\"btn btn-danger btn-sm\" aria-label=\"Delete\" {{on \"click\" (fn this.deleteChannel channel)}}><FaIcon @icon=\"trash-alt\" /></button>\n          </div>\n          {{/unless}}\n        </div>\n      {{/if}}\n    </li>\n  {{/if}}\n  {{/each}}\n  </ul>\n  \n  */\n  {\n    \"id\": \"uLS2A8HW\",\n    \"block\": \"[[[41,[51,[28,[37,1],[[30,1],[30,2]],null]],[[[10,\\\"h2\\\"],[14,0,\\\"fs-4\\\"],[12],[1,\\\"Your available notification channels\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[51,[30,0,[\\\"channels\\\"]]],[[[10,2],[12],[1,\\\"No channels. Add one!\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[10,\\\"ul\\\"],[14,0,\\\"list-group\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[30,0,[\\\"channels\\\"]]],null]],null],null,[[[41,[28,[37,1],[[28,[37,8],[[30,2]],null],[28,[37,9],[[30,2],[30,3,[\\\"intId\\\"]]],null]],null],[[[1,\\\"  \\\"],[10,\\\"li\\\"],[14,0,\\\"list-group-item\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[41,[30,4],[[[1,\\\"      \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[15,2,[29,[[30,3,[\\\"id\\\"]]]]],[15,1,[29,[\\\"channel_\\\",[30,3,[\\\"id\\\"]]]]],[14,3,\\\"notification_channels\\\"],[15,\\\"checked\\\",[28,[37,9],[[30,4],[30,3,[\\\"intId\\\"]]],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[15,2,[29,[[30,3,[\\\"id\\\"]]]]],[15,1,[29,[\\\"channel_\\\",[30,3,[\\\"id\\\"]]]]],[14,3,\\\"notification_channels\\\"],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"      \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[15,\\\"for\\\",[29,[\\\"channel_\\\",[30,3,[\\\"id\\\"]]]]],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"badge bg-primary ms-2 me-2\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[30,3,[\\\"serviceName\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[30,3,[\\\"path\\\"]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n          \\\"],[10,1],[14,0,\\\"badge bg-primary me-2\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[30,3,[\\\"serviceName\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[1,[30,3,[\\\"path\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[30,2]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"col-3 d-flex justify-content-end\\\"],[12],[1,\\\"\\\\n          \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-secondary btn-sm me-2\\\"],[24,\\\"aria-label\\\",\\\"Edit\\\"],[24,4,\\\"button\\\"],[4,[38,16],[\\\"click\\\",[28,[37,17],[[30,5],[30,3]],null]],null],[12],[8,[39,18],null,[[\\\"@icon\\\"],[\\\"pencil-alt\\\"]],null],[13],[1,\\\"\\\\n          \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-danger btn-sm\\\"],[24,\\\"aria-label\\\",\\\"Delete\\\"],[24,4,\\\"button\\\"],[4,[38,16],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"deleteChannel\\\"]],[30,3]],null]],null],[12],[8,[39,18],null,[[\\\"@icon\\\"],[\\\"trash-alt\\\"]],null],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[3]],null],[13],[1,\\\"\\\\n\\\"]],[\\\"@form\\\",\\\"@channels\\\",\\\"channel\\\",\\\"@selectedChannels\\\",\\\"@onEdit\\\"],false,[\\\"unless\\\",\\\"or\\\",\\\"h2\\\",\\\"p\\\",\\\"ul\\\",\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"not\\\",\\\"includes\\\",\\\"li\\\",\\\"input\\\",\\\"label\\\",\\\"span\\\",\\\"div\\\",\\\"button\\\",\\\"on\\\",\\\"fn\\\",\\\"fa-icon\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/notification-channel-list.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/notification-settings\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#if this.session.isAuthenticated}}\n  <ul class=\"nav nav-tabs mt-0\" role=\"tablist\">\n    {{!-- template-lint-disable no-invalid-role require-context-role --}}\n    <li class=\"nav-item\" role=\"presentation\" aria-label=\"Subscriptions tab\">\n      <button class=\"nav-link active\" id=\"subscriptions-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#subscriptions-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"subscriptions-tab-pane\" aria-selected=\"true\">\n        Subscriptions\n      </button>\n    </li>\n    <li class=\"nav-item\" role=\"presentation\" aria-label=\"Channels tab\">\n      <button class=\"nav-link\" id=\"channels-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#channels-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"channels-tab-pane\" aria-selected=\"false\">\n        Channels\n      </button>\n    </li>\n    {{#if this.session.user.is_admin}}\n    <li class=\"nav-item\" role=\"presentation\" aria-label=\"Admin tab\">\n      <button class=\"nav-link\" id=\"admin-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#admin-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"admin-tab-pane\" aria-selected=\"false\" {{on \"show.bs.tab\" this.getNotificationsConfig}}>\n        Admin\n      </button>\n    </li>\n    {{/if}}\n  </ul>\n  <div class=\"tab-content\">\n    <div class=\"tab-pane fade show active\" id=\"subscriptions-tab-pane\" role=\"tabpanel\" aria-labelledby=\"subscriptions-tab\" tabindex=\"0\">\n      <div class=\"row mt-4\">\n        <div class=\"col-lg\">\n          <NotificationSubscriptionList @onEdit={{this.editSubscription}} />\n        </div>\n        <div class=\"col-lg\">\n          <NotificationSubscriptionForm @subscription={{this.currentSubscription}} @onSubmit={{this.clearCurrentSubscription}} />\n        </div>\n      </div>\n    </div>\n    <div class=\"tab-pane fade\" id=\"channels-tab-pane\" role=\"tabpanel\" aria-labelledby=\"channels-tab\" tabindex=\"0\">\n      <div class=\"row mt-4\">\n        <div class=\"col-lg\">\n          <NotificationChannelList @onEdit={{this.editChannel}} />\n        </div>\n        <div class=\"col-lg\">\n          <NotificationChannelForm @channel={{this.currentChannel}} @onSubmit={{this.clearCurrentChannel}} />\n        </div>\n      </div>\n    </div>\n    {{#if this.session.user.is_admin}}\n    <div class=\"tab-pane fade\" id=\"admin-tab-pane\" role=\"tabpanel\" aria-labelledby=\"admin-tab\" tabindex=\"0\">\n      <pre class=\"mt-4\">\n  {{json this.notificationsConfig}}\n      </pre>\n    </div>\n    {{/if}}\n  </div>\n  {{else}}\n  <a href=\"https://api.crimeisdown.com/auth/redirect\" referrerpolicy=\"unsafe-url\" class=\"ptrn-button\"><img src=\"/img/login-with-patreon.png\" alt=\"Log in with Patreon\"></a>\n  {{/if}}\n  \n  */\n  {\n    \"id\": \"yEgKsnnW\",\n    \"block\": \"[[[41,[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[[[10,\\\"ul\\\"],[14,0,\\\"nav nav-tabs mt-0\\\"],[14,\\\"role\\\",\\\"tablist\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"  \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[14,\\\"role\\\",\\\"presentation\\\"],[14,\\\"aria-label\\\",\\\"Subscriptions tab\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"nav-link active\\\"],[14,1,\\\"subscriptions-tab\\\"],[14,\\\"data-bs-toggle\\\",\\\"tab\\\"],[14,\\\"data-bs-target\\\",\\\"#subscriptions-tab-pane\\\"],[14,\\\"role\\\",\\\"tab\\\"],[14,\\\"aria-controls\\\",\\\"subscriptions-tab-pane\\\"],[14,\\\"aria-selected\\\",\\\"true\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n      Subscriptions\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[14,\\\"role\\\",\\\"presentation\\\"],[14,\\\"aria-label\\\",\\\"Channels tab\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"nav-link\\\"],[14,1,\\\"channels-tab\\\"],[14,\\\"data-bs-toggle\\\",\\\"tab\\\"],[14,\\\"data-bs-target\\\",\\\"#channels-tab-pane\\\"],[14,\\\"role\\\",\\\"tab\\\"],[14,\\\"aria-controls\\\",\\\"channels-tab-pane\\\"],[14,\\\"aria-selected\\\",\\\"false\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n      Channels\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"session\\\",\\\"user\\\",\\\"is_admin\\\"]],[[[1,\\\"  \\\"],[10,\\\"li\\\"],[14,0,\\\"nav-item\\\"],[14,\\\"role\\\",\\\"presentation\\\"],[14,\\\"aria-label\\\",\\\"Admin tab\\\"],[12],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"nav-link\\\"],[24,1,\\\"admin-tab\\\"],[24,\\\"data-bs-toggle\\\",\\\"tab\\\"],[24,\\\"data-bs-target\\\",\\\"#admin-tab-pane\\\"],[24,\\\"role\\\",\\\"tab\\\"],[24,\\\"aria-controls\\\",\\\"admin-tab-pane\\\"],[24,\\\"aria-selected\\\",\\\"false\\\"],[24,4,\\\"button\\\"],[4,[38,4],[\\\"show.bs.tab\\\",[30,0,[\\\"getNotificationsConfig\\\"]]],null],[12],[1,\\\"\\\\n      Admin\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"tab-content\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"tab-pane fade show active\\\"],[14,1,\\\"subscriptions-tab-pane\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"subscriptions-tab\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"row mt-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col-lg\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,6],null,[[\\\"@onEdit\\\"],[[30,0,[\\\"editSubscription\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col-lg\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,7],null,[[\\\"@subscription\\\",\\\"@onSubmit\\\"],[[30,0,[\\\"currentSubscription\\\"]],[30,0,[\\\"clearCurrentSubscription\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"tab-pane fade\\\"],[14,1,\\\"channels-tab-pane\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"channels-tab\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"row mt-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col-lg\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,8],null,[[\\\"@onEdit\\\"],[[30,0,[\\\"editChannel\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col-lg\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,9],null,[[\\\"@channel\\\",\\\"@onSubmit\\\"],[[30,0,[\\\"currentChannel\\\"]],[30,0,[\\\"clearCurrentChannel\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"session\\\",\\\"user\\\",\\\"is_admin\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"tab-pane fade\\\"],[14,1,\\\"admin-tab-pane\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"admin-tab\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"pre\\\"],[14,0,\\\"mt-4\\\"],[12],[1,\\\"\\\"],[1,[28,[35,11],[[30,0,[\\\"notificationsConfig\\\"]]],null]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\"]],[]],[[[10,3],[14,6,\\\"https://api.crimeisdown.com/auth/redirect\\\"],[14,\\\"referrerpolicy\\\",\\\"unsafe-url\\\"],[14,0,\\\"ptrn-button\\\"],[12],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/img/login-with-patreon.png\\\"],[14,\\\"alt\\\",\\\"Log in with Patreon\\\"],[12],[13],[13],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"ul\\\",\\\"li\\\",\\\"button\\\",\\\"on\\\",\\\"div\\\",\\\"notification-subscription-list\\\",\\\"notification-subscription-form\\\",\\\"notification-channel-list\\\",\\\"notification-channel-form\\\",\\\"pre\\\",\\\"json\\\",\\\"a\\\",\\\"img\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/notification-settings.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/notification-subscription-form\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h2 id=\"subscription-form-heading\" class=\"fs-4\">{{if @subscription \"Edit\" \"Add a new\"}} subscription</h2>\n  <form id=\"subscription-form\" aria-label=\"New subscription form\" {{on \"submit\" this.submit}} {{did-insert this.initData}}>\n    <div class=\"row mb-3\">\n      <div class=\"col\">\n        <label for=\"nameInput\" class=\"form-label\">Subscription name</label>\n        <input type=\"text\" class=\"form-control\" id=\"nameInput\" name=\"name\" value=\"{{@subscription.name}}\" required />\n      </div>\n      <div class=\"col-3\">\n        <div class=\"form-check\">\n          <input class=\"form-check-input\" type=\"checkbox\" id=\"enabledInput\" name=\"enabled\"\n            checked={{if @subscription @subscription.enabled true}}>\n          <label class=\"form-check-label\" for=\"enabledInput\">\n            Enabled?\n          </label>\n        </div>\n      </div>\n    </div>\n    <div class=\"mb-3\">\n      <label for=\"keywordList\" class=\"form-label\">Keywords to match, one per line (will be interpreted as exact matches, case insensitive)</label>\n      <textarea class=\"form-control\" id=\"keywordList\" rows=\"3\" name=\"keywords\" value=\"{{@subscription.keywordsString}}\" placeholder=\"Examples: dead body&#10;person shot&#10;still and box&#10;still in box\"></textarea>\n    </div>\n    <div class=\"mb-3\">\n      <label for=\"ignoreKeywordList\" class=\"form-label\">Keywords to prevent a notification if other keywords were matched above, one per line (will be interpreted as exact matches, case insensitive)</label>\n      <textarea class=\"form-control\" id=\"ignoreKeywordList\" rows=\"1\" name=\"ignore_keywords\" value=\"{{@subscription.ignoreKeywordsString}}\" placeholder=\"Examples: disregard&#10;dead body cam\"></textarea>\n    </div>\n    {{#if this.session.user.patreon_tier.features.transcript_geosearch}}\n    <div class=\"mb-3\" {{did-insert this.loadAutocomplete}}>\n      <p class=\"fst-italic\">Optionally, get notified of incidents near an address of your choice, based on either distance or current driving time. If provided along with keywords, will only notify if both keywords and location matches.</p>\n      <label for=\"addressInput\" class=\"form-label\">Address</label>\n      <div class=\"input-group\">\n        <input type=\"text\" class=\"form-control\" id=\"addressInput\" name=\"address\" value=\"{{@subscription.location.address}}\" />\n        <a href=\"https://www.google.com/maps/search/{{@subscription.location.geo.lat}},{{@subscription.location.geo.lng}}\" class=\"btn btn-secondary\" id=\"mapAddressButton\" target=\"_blank\" rel=\"noopener noreferrer\"><FaIcon @icon=\"map-marker-alt\" /> View on map</a>\n      </div>\n      <input type=\"hidden\" id=\"latInput\" name=\"lat\" value=\"{{@subscription.location.geo.lat}}\" />\n      <input type=\"hidden\" id=\"lngInput\" name=\"lng\" value=\"{{@subscription.location.geo.lng}}\" />\n      <div class=\"row mt-3\">\n        <div class=\"col\">\n          <label for=\"radiusInput\" class=\"form-label\">Radius (miles)</label>\n          <input type=\"number\" class=\"form-control\" id=\"radiusInput\" name=\"radius\" value=\"{{@subscription.location.radius}}\" min=\"0\" max=\"100\" step=\"0.1\" />\n        </div>\n        <div class=\"col\">\n          <label for=\"travelTimeInput\" class=\"form-label\">Travel time (minutes)</label>\n          <input type=\"number\" class=\"form-control\" id=\"travelTimeInput\" name=\"travel_time\" value=\"{{@subscription.location.travel_time}}\" min=\"0\" max=\"60\" step=\"1\" />\n        </div>\n      </div>\n    </div>\n    {{/if}}\n    <fieldset class=\"row mb-3\" name=\"topic\" required>\n      <legend>Talkgroups to match</legend>\n      <i>Scroll for a full list.</i>\n      <div class=\"talkgroup-list row\">\n        {{#each this.availableTalkgroups as |system|}}\n        <div class=\"col-12 mt-3\">\n          <h4>{{system.group}}</h4>\n        </div>\n        {{#each system.talkgroups as |dept|}}\n        <div class=\"col-12 mt-3\">\n          <p><strong>{{dept.group}}</strong></p>\n        </div>\n        {{#each dept.talkgroups as |tg|}}\n        <div class=\"col-md-4\">\n          <div class=\"form-check\">\n            {{#if @subscription}}\n            <input class=\"form-check-input\" type=\"checkbox\" value=\"{{tg.value}}\" id=\"talkgroup_{{tg.value}}\" name=\"topic\"\n              checked={{includes @subscription.topics tg.value}}>\n            {{else}}\n            <input class=\"form-check-input\" type=\"checkbox\" value=\"{{tg.value}}\" id=\"talkgroup_{{tg.value}}\" name=\"topic\">\n            {{/if}}\n            <label class=\"form-check-label\" for=\"talkgroup_{{tg.value}}\">\n              {{tg.label}}\n            </label>\n          </div>\n        </div>\n        {{/each}}\n        {{/each}}\n        {{/each}}\n      </div>\n    </fieldset>\n    <fieldset class=\"row mb-3\" name=\"notification_channels\" required>\n      <legend>Notification channels to send on</legend>\n      <NotificationChannelList @form=\"true\" @selectedChannels={{@subscription.notification_channels}} />\n    </fieldset>\n    <button type=\"submit\" class=\"btn btn-primary\">{{if @subscription \"Update\" \"Add\"}} Subscription</button>\n  </form>\n  \n  */\n  {\n    \"id\": \"iUPKmA1w\",\n    \"block\": \"[[[10,\\\"h2\\\"],[14,1,\\\"subscription-form-heading\\\"],[14,0,\\\"fs-4\\\"],[12],[1,[52,[30,1],\\\"Edit\\\",\\\"Add a new\\\"]],[1,\\\" subscription\\\"],[13],[1,\\\"\\\\n\\\"],[11,\\\"form\\\"],[24,1,\\\"subscription-form\\\"],[24,\\\"aria-label\\\",\\\"New subscription form\\\"],[4,[38,3],[\\\"submit\\\",[30,0,[\\\"submit\\\"]]],null],[4,[38,4],[[30,0,[\\\"initData\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"nameInput\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"Subscription name\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"nameInput\\\"],[14,3,\\\"name\\\"],[15,2,[29,[[30,1,[\\\"name\\\"]]]]],[14,\\\"required\\\",\\\"\\\"],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-3\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"form-check\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[14,1,\\\"enabledInput\\\"],[14,3,\\\"enabled\\\"],[15,\\\"checked\\\",[52,[30,1],[30,1,[\\\"enabled\\\"]],true]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[14,\\\"for\\\",\\\"enabledInput\\\"],[12],[1,\\\"\\\\n          Enabled?\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"keywordList\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"Keywords to match, one per line (will be interpreted as exact matches, case insensitive)\\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"textarea\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"keywordList\\\"],[14,\\\"rows\\\",\\\"3\\\"],[14,3,\\\"keywords\\\"],[15,2,[29,[[30,1,[\\\"keywordsString\\\"]]]]],[14,\\\"placeholder\\\",\\\"Examples: dead body\\\\nperson shot\\\\nstill and box\\\\nstill in box\\\"],[12],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"ignoreKeywordList\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"Keywords to prevent a notification if other keywords were matched above, one per line (will be interpreted as exact matches, case insensitive)\\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"textarea\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"ignoreKeywordList\\\"],[14,\\\"rows\\\",\\\"1\\\"],[14,3,\\\"ignore_keywords\\\"],[15,2,[29,[[30,1,[\\\"ignoreKeywordsString\\\"]]]]],[14,\\\"placeholder\\\",\\\"Examples: disregard\\\\ndead body cam\\\"],[12],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"features\\\",\\\"transcript_geosearch\\\"]],[[[1,\\\"  \\\"],[11,0],[24,0,\\\"mb-3\\\"],[4,[38,4],[[30,0,[\\\"loadAutocomplete\\\"]]],null],[12],[1,\\\"\\\\n    \\\"],[10,2],[14,0,\\\"fst-italic\\\"],[12],[1,\\\"Optionally, get notified of incidents near an address of your choice, based on either distance or current driving time. If provided along with keywords, will only notify if both keywords and location matches.\\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"addressInput\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"Address\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"input-group\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"addressInput\\\"],[14,3,\\\"address\\\"],[15,2,[29,[[30,1,[\\\"location\\\",\\\"address\\\"]]]]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[10,3],[15,6,[29,[\\\"https://www.google.com/maps/search/\\\",[30,1,[\\\"location\\\",\\\"geo\\\",\\\"lat\\\"]],\\\",\\\",[30,1,[\\\"location\\\",\\\"geo\\\",\\\"lng\\\"]]]]],[14,0,\\\"btn btn-secondary\\\"],[14,1,\\\"mapAddressButton\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[8,[39,11],null,[[\\\"@icon\\\"],[\\\"map-marker-alt\\\"]],null],[1,\\\" View on map\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"input\\\"],[14,1,\\\"latInput\\\"],[14,3,\\\"lat\\\"],[15,2,[29,[[30,1,[\\\"location\\\",\\\"geo\\\",\\\"lat\\\"]]]]],[14,4,\\\"hidden\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"input\\\"],[14,1,\\\"lngInput\\\"],[14,3,\\\"lng\\\"],[15,2,[29,[[30,1,[\\\"location\\\",\\\"geo\\\",\\\"lng\\\"]]]]],[14,4,\\\"hidden\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"row mt-3\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"radiusInput\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"Radius (miles)\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"radiusInput\\\"],[14,3,\\\"radius\\\"],[15,2,[29,[[30,1,[\\\"location\\\",\\\"radius\\\"]]]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"max\\\",\\\"100\\\"],[14,\\\"step\\\",\\\"0.1\\\"],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"travelTimeInput\\\"],[14,0,\\\"form-label\\\"],[12],[1,\\\"Travel time (minutes)\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"travelTimeInput\\\"],[14,3,\\\"travel_time\\\"],[15,2,[29,[[30,1,[\\\"location\\\",\\\"travel_time\\\"]]]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"max\\\",\\\"60\\\"],[14,\\\"step\\\",\\\"1\\\"],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"],[10,\\\"fieldset\\\"],[14,0,\\\"row mb-3\\\"],[14,3,\\\"topic\\\"],[14,\\\"required\\\",\\\"\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"legend\\\"],[12],[1,\\\"Talkgroups to match\\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"i\\\"],[12],[1,\\\"Scroll for a full list.\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"talkgroup-list row\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,16],[[28,[37,16],[[30,0,[\\\"availableTalkgroups\\\"]]],null]],null],null,[[[1,\\\"      \\\"],[10,0],[14,0,\\\"col-12 mt-3\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[12],[1,[30,2,[\\\"group\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,16],[[28,[37,16],[[30,2,[\\\"talkgroups\\\"]]],null]],null],null,[[[1,\\\"      \\\"],[10,0],[14,0,\\\"col-12 mt-3\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,[30,3,[\\\"group\\\"]]],[13],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,16],[[28,[37,16],[[30,3,[\\\"talkgroups\\\"]]],null]],null],null,[[[1,\\\"      \\\"],[10,0],[14,0,\\\"col-md-4\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"form-check\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[1,\\\"          \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[15,2,[29,[[30,4,[\\\"value\\\"]]]]],[15,1,[29,[\\\"talkgroup_\\\",[30,4,[\\\"value\\\"]]]]],[14,3,\\\"topic\\\"],[15,\\\"checked\\\",[28,[37,19],[[30,1,[\\\"topics\\\"]],[30,4,[\\\"value\\\"]]],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[15,2,[29,[[30,4,[\\\"value\\\"]]]]],[15,1,[29,[\\\"talkgroup_\\\",[30,4,[\\\"value\\\"]]]]],[14,3,\\\"topic\\\"],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"          \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[15,\\\"for\\\",[29,[\\\"talkgroup_\\\",[30,4,[\\\"value\\\"]]]]],[12],[1,\\\"\\\\n            \\\"],[1,[30,4,[\\\"label\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null]],[3]],null]],[2]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,\\\"fieldset\\\"],[14,0,\\\"row mb-3\\\"],[14,3,\\\"notification_channels\\\"],[14,\\\"required\\\",\\\"\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"legend\\\"],[12],[1,\\\"Notification channels to send on\\\"],[13],[1,\\\"\\\\n    \\\"],[8,[39,20],null,[[\\\"@form\\\",\\\"@selectedChannels\\\"],[\\\"true\\\",[30,1,[\\\"notification_channels\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,4,\\\"submit\\\"],[12],[1,[52,[30,1],\\\"Update\\\",\\\"Add\\\"]],[1,\\\" Subscription\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@subscription\\\",\\\"system\\\",\\\"dept\\\",\\\"tg\\\"],false,[\\\"h2\\\",\\\"if\\\",\\\"form\\\",\\\"on\\\",\\\"did-insert\\\",\\\"div\\\",\\\"label\\\",\\\"input\\\",\\\"textarea\\\",\\\"p\\\",\\\"a\\\",\\\"fa-icon\\\",\\\"fieldset\\\",\\\"legend\\\",\\\"i\\\",\\\"each\\\",\\\"-track-array\\\",\\\"h4\\\",\\\"strong\\\",\\\"includes\\\",\\\"notification-channel-list\\\",\\\"button\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/notification-subscription-form.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/notification-subscription-list\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h2 class=\"fs-4\">Your current subscriptions</h2>\n  {{#unless this.subscriptions}}\n  <p>No subscriptions.</p>\n  {{/unless}}\n  <ul class=\"ps-0\" {{did-insert this.initData}}>\n    {{#each this.subscriptions as |subscription|}}\n    <li class=\"d-block\">\n      <div class=\"card mb-4\">\n        <div class=\"card-header\">\n          <div class=\"row\">\n            <div class=\"col\">\n              <h5 class=\"mt-1 mb-0\">\n                {{#unless subscription.enabled}}\n                <span class=\"badge bg-secondary me-2\">Disabled</span>\n                {{/unless}}\n                {{subscription.name}}\n              </h5>\n            </div>\n            <div class=\"col-3 d-flex justify-content-end\">\n              <button type=\"button\" class=\"btn btn-secondary btn-sm me-2\" aria-label=\"Edit\" {{on \"click\" (fn @onEdit subscription)}}><FaIcon @icon=\"pencil-alt\" /></button>\n              <button type=\"button\" class=\"btn btn-danger btn-sm\" aria-label=\"Delete\" {{on \"click\" (fn this.deleteSubscription subscription)}}><FaIcon @icon=\"trash-alt\" /></button>\n            </div>\n          </div>\n        </div>\n        <div class=\"card-body\">\n          {{#if subscription.keywordsString}}\n          <div class=\"mb-3\">\n            <p class=\"fw-bold\">Keywords to match, one per line</p>\n            <Textarea class=\"form-control\" id=\"keywordList\" rows=\"3\" @value={{subscription.keywordsString}} disabled></Textarea>\n          </div>\n          {{/if}}\n          {{#if subscription.ignoreKeywordsString}}\n          <div class=\"mb-3\">\n            <p class=\"fw-bold\">Keywords to negate other keyword matches, one per line</p>\n            <Textarea class=\"form-control\" id=\"ignoreKeywordList\" rows=\"1\" @value={{subscription.ignoreKeywordsString}} disabled></Textarea>\n          </div>\n          {{/if}}\n          {{#if subscription.location.address}}\n          <div class=\"mb-3\">\n            <p class=\"fst-italic\">\n              Will notify on calls less than\n              {{if subscription.location.radius (concat subscription.location.radius \" mile\" (pluralize subscription.location.radius))}}\n              {{if (and subscription.location.radius subscription.location.travel_time) \"or\"}}\n              {{if subscription.location.travel_time (concat subscription.location.travel_time \" minute\" (pluralize subscription.location.travel_time))}}\n              away from {{subscription.location.address}}\n            </p>\n          </div>\n          {{/if}}\n          <div class=\"mb-3\">\n            <p class=\"fw-bold\">Talkgroups to match</p>\n            <ul>\n            {{#each this.availableTalkgroups as |system|}}\n            {{#each system.talkgroups as |dept|}}\n            {{#each dept.talkgroups as |tg|}}\n            {{#if (includes subscription.topics tg.value)}}\n              <li>{{tg.label}} ({{tg.system}})</li>\n            {{/if}}\n            {{/each}}\n            {{/each}}\n            {{/each}}\n            </ul>\n          </div>\n          <div class=\"mb-3\">\n            <p class=\"fw-bold\">Will notify via:</p>\n            <NotificationChannelList @channels={{subscription.notification_channels}} />\n            {{#unless subscription.enabled}}\n            <p class=\"mt-2 fst-italic\">Note: Notifications are currently disabled. Please edit and re-enable the subscription to receive them.</p>\n            {{/unless}}\n          </div>\n        </div>\n      </div>\n    </li>\n    {{/each}}\n  </ul>\n  \n  */\n  {\n    \"id\": \"KCOOM2Bs\",\n    \"block\": \"[[[10,\\\"h2\\\"],[14,0,\\\"fs-4\\\"],[12],[1,\\\"Your current subscriptions\\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[30,0,[\\\"subscriptions\\\"]]],[[[10,2],[12],[1,\\\"No subscriptions.\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[11,\\\"ul\\\"],[24,0,\\\"ps-0\\\"],[4,[38,4],[[30,0,[\\\"initData\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[30,0,[\\\"subscriptions\\\"]]],null]],null],null,[[[1,\\\"  \\\"],[10,\\\"li\\\"],[14,0,\\\"d-block\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"card mb-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"card-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"h5\\\"],[14,0,\\\"mt-1 mb-0\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[30,1,[\\\"enabled\\\"]]],[[[1,\\\"              \\\"],[10,1],[14,0,\\\"badge bg-secondary me-2\\\"],[12],[1,\\\"Disabled\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"              \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"col-3 d-flex justify-content-end\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-secondary btn-sm me-2\\\"],[24,\\\"aria-label\\\",\\\"Edit\\\"],[24,4,\\\"button\\\"],[4,[38,12],[\\\"click\\\",[28,[37,13],[[30,2],[30,1]],null]],null],[12],[8,[39,14],null,[[\\\"@icon\\\"],[\\\"pencil-alt\\\"]],null],[13],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-danger btn-sm\\\"],[24,\\\"aria-label\\\",\\\"Delete\\\"],[24,4,\\\"button\\\"],[4,[38,12],[\\\"click\\\",[28,[37,13],[[30,0,[\\\"deleteSubscription\\\"]],[30,1]],null]],null],[12],[8,[39,14],null,[[\\\"@icon\\\"],[\\\"trash-alt\\\"]],null],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"card-body\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"keywordsString\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n          \\\"],[10,2],[14,0,\\\"fw-bold\\\"],[12],[1,\\\"Keywords to match, one per line\\\"],[13],[1,\\\"\\\\n          \\\"],[8,[39,16],[[24,0,\\\"form-control\\\"],[24,1,\\\"keywordList\\\"],[24,\\\"rows\\\",\\\"3\\\"],[24,\\\"disabled\\\",\\\"\\\"]],[[\\\"@value\\\"],[[30,1,[\\\"keywordsString\\\"]]]],[[\\\"default\\\"],[[[],[]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,1,[\\\"ignoreKeywordsString\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n          \\\"],[10,2],[14,0,\\\"fw-bold\\\"],[12],[1,\\\"Keywords to negate other keyword matches, one per line\\\"],[13],[1,\\\"\\\\n          \\\"],[8,[39,16],[[24,0,\\\"form-control\\\"],[24,1,\\\"ignoreKeywordList\\\"],[24,\\\"rows\\\",\\\"1\\\"],[24,\\\"disabled\\\",\\\"\\\"]],[[\\\"@value\\\"],[[30,1,[\\\"ignoreKeywordsString\\\"]]]],[[\\\"default\\\"],[[[],[]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,1,[\\\"location\\\",\\\"address\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n          \\\"],[10,2],[14,0,\\\"fst-italic\\\"],[12],[1,\\\"\\\\n            Will notify on calls less than\\\\n            \\\"],[1,[52,[30,1,[\\\"location\\\",\\\"radius\\\"]],[28,[37,17],[[30,1,[\\\"location\\\",\\\"radius\\\"]],\\\" mile\\\",[28,[37,18],[[30,1,[\\\"location\\\",\\\"radius\\\"]]],null]],null]]],[1,\\\"\\\\n            \\\"],[1,[52,[28,[37,19],[[30,1,[\\\"location\\\",\\\"radius\\\"]],[30,1,[\\\"location\\\",\\\"travel_time\\\"]]],null],\\\"or\\\"]],[1,\\\"\\\\n            \\\"],[1,[52,[30,1,[\\\"location\\\",\\\"travel_time\\\"]],[28,[37,17],[[30,1,[\\\"location\\\",\\\"travel_time\\\"]],\\\" minute\\\",[28,[37,18],[[30,1,[\\\"location\\\",\\\"travel_time\\\"]]],null]],null]]],[1,\\\"\\\\n            away from \\\"],[1,[30,1,[\\\"location\\\",\\\"address\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n          \\\"],[10,2],[14,0,\\\"fw-bold\\\"],[12],[1,\\\"Talkgroups to match\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[30,0,[\\\"availableTalkgroups\\\"]]],null]],null],null,[[[42,[28,[37,6],[[28,[37,6],[[30,3,[\\\"talkgroups\\\"]]],null]],null],null,[[[42,[28,[37,6],[[28,[37,6],[[30,4,[\\\"talkgroups\\\"]]],null]],null],null,[[[41,[28,[37,20],[[30,1,[\\\"topics\\\"]],[30,5,[\\\"value\\\"]]],null],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[12],[1,[30,5,[\\\"label\\\"]]],[1,\\\" (\\\"],[1,[30,5,[\\\"system\\\"]]],[1,\\\")\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[5]],null]],[4]],null]],[3]],null],[1,\\\"          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mb-3\\\"],[12],[1,\\\"\\\\n          \\\"],[10,2],[14,0,\\\"fw-bold\\\"],[12],[1,\\\"Will notify via:\\\"],[13],[1,\\\"\\\\n          \\\"],[8,[39,21],null,[[\\\"@channels\\\"],[[30,1,[\\\"notification_channels\\\"]]]],null],[1,\\\"\\\\n\\\"],[41,[51,[30,1,[\\\"enabled\\\"]]],[[[1,\\\"          \\\"],[10,2],[14,0,\\\"mt-2 fst-italic\\\"],[12],[1,\\\"Note: Notifications are currently disabled. Please edit and re-enable the subscription to receive them.\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[13],[1,\\\"\\\\n\\\"]],[\\\"subscription\\\",\\\"@onEdit\\\",\\\"system\\\",\\\"dept\\\",\\\"tg\\\"],false,[\\\"h2\\\",\\\"unless\\\",\\\"p\\\",\\\"ul\\\",\\\"did-insert\\\",\\\"each\\\",\\\"-track-array\\\",\\\"li\\\",\\\"div\\\",\\\"h5\\\",\\\"span\\\",\\\"button\\\",\\\"on\\\",\\\"fn\\\",\\\"fa-icon\\\",\\\"if\\\",\\\"textarea\\\",\\\"concat\\\",\\\"pluralize\\\",\\\"and\\\",\\\"includes\\\",\\\"notification-channel-list\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/notification-subscription-list.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/search-radioids\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div id=\"radio-search\">\n    <div \n      {{react this.simpleSearchComponent \n        id=\"radio-id\" \n        labelText=\"Radio ID\"\n        exampleText=\"Example: 1234, 599, 2-1-8, 100X\"\n        ariaDescribedBy=\"radio-id-desc\" \n        onSearch=this.lookupRadioId\n      }} \n    />\n    <div class=\"results\">\n      <table class=\"table table-bordered table-condensed\">\n        <tbody>\n        <tr>\n          <th scope=\"row\">Agency</th>\n          <td id=\"agency\">{{this.radio.agency}}</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Level 1 (Bureau)</th>\n          <td id=\"level1\">{{this.radio.level1}}</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Level 2 (Division)</th>\n          <td id=\"level2\">{{this.radio.level2}}</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Level 3 (Section)</th>\n          <td id=\"level3\">{{this.radio.level3}}</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Level 4 (Unit/Assignment)</th>\n          <td id=\"level4\">{{this.radio.level4}}</td>\n        </tr>\n        </tbody>\n      </table>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"plJ9EkI0\",\n    \"block\": \"[[[10,0],[14,1,\\\"radio-search\\\"],[12],[1,\\\"\\\\n  \\\"],[11,0],[4,[38,1],[[30,0,[\\\"simpleSearchComponent\\\"]]],[[\\\"id\\\",\\\"labelText\\\",\\\"exampleText\\\",\\\"ariaDescribedBy\\\",\\\"onSearch\\\"],[\\\"radio-id\\\",\\\"Radio ID\\\",\\\"Example: 1234, 599, 2-1-8, 100X\\\",\\\"radio-id-desc\\\",[30,0,[\\\"lookupRadioId\\\"]]]]],[12],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"results\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"table\\\"],[14,0,\\\"table table-bordered table-condensed\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Agency\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"agency\\\"],[12],[1,[30,0,[\\\"radio\\\",\\\"agency\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Level 1 (Bureau)\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"level1\\\"],[12],[1,[30,0,[\\\"radio\\\",\\\"level1\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Level 2 (Division)\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"level2\\\"],[12],[1,[30,0,[\\\"radio\\\",\\\"level2\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Level 3 (Section)\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"level3\\\"],[12],[1,[30,0,[\\\"radio\\\",\\\"level3\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Level 4 (Unit/Assignment)\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"level4\\\"],[12],[1,[30,0,[\\\"radio\\\",\\\"level4\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"div\\\",\\\"react\\\",\\\"table\\\",\\\"tbody\\\",\\\"tr\\\",\\\"th\\\",\\\"td\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/search-radioids.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/search-ucrcodes\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div id=\"ucr-search\">\n    <div \n      {{react this.simpleSearchComponent \n        id=\"ucr-id\" \n        labelText=\"UCR (Uniform Crime Reporting) Code\"\n        exampleText=\"Example: 041A\"\n        ariaDescribedBy=\"ucr-id-desc\" \n        onSearch=this.lookupUCR\n      }} \n    />\n    <div class=\"results\">\n      <table class=\"table table-bordered table-condensed\">\n        <tbody>\n        <tr>\n          <th scope=\"row\">Primary Description</th>\n          <td id=\"primary_desc\">{{this.ucr.primaryDesc}}</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Secondary Description</th>\n          <td id=\"secondary_desc\">{{this.ucr.secondaryDesc}}</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Index Code?</th>\n          <td id=\"index_code\">{{this.ucr.indexCode}}</td>\n        </tr>\n        </tbody>\n      </table>\n      <p>The full list of UCR codes and information about them can be found in the <a href=\"http://directives.chicagopolice.org/forms/CPD-63.451_Table.pdf\">CPD's Incident Reporting Guide</a>.</p>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"lj+iF++Y\",\n    \"block\": \"[[[10,0],[14,1,\\\"ucr-search\\\"],[12],[1,\\\"\\\\n  \\\"],[11,0],[4,[38,1],[[30,0,[\\\"simpleSearchComponent\\\"]]],[[\\\"id\\\",\\\"labelText\\\",\\\"exampleText\\\",\\\"ariaDescribedBy\\\",\\\"onSearch\\\"],[\\\"ucr-id\\\",\\\"UCR (Uniform Crime Reporting) Code\\\",\\\"Example: 041A\\\",\\\"ucr-id-desc\\\",[30,0,[\\\"lookupUCR\\\"]]]]],[12],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"results\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"table\\\"],[14,0,\\\"table table-bordered table-condensed\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Primary Description\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"primary_desc\\\"],[12],[1,[30,0,[\\\"ucr\\\",\\\"primaryDesc\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Secondary Description\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"secondary_desc\\\"],[12],[1,[30,0,[\\\"ucr\\\",\\\"secondaryDesc\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[14,\\\"scope\\\",\\\"row\\\"],[12],[1,\\\"Index Code?\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"td\\\"],[14,1,\\\"index_code\\\"],[12],[1,[30,0,[\\\"ucr\\\",\\\"indexCode\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The full list of UCR codes and information about them can be found in the \\\"],[10,3],[14,6,\\\"http://directives.chicagopolice.org/forms/CPD-63.451_Table.pdf\\\"],[12],[1,\\\"CPD's Incident Reporting Guide\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"div\\\",\\\"react\\\",\\\"table\\\",\\\"tbody\\\",\\\"tr\\\",\\\"th\\\",\\\"td\\\",\\\"p\\\",\\\"a\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/search-ucrcodes.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/settings\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"row\">\n    <div class=\"col-md-6 offset-md-3\">\n      <h1 class=\"fs-3\">Settings</h1>\n      <p>Various settings for the developer</p>\n  \n      <form {{on \"submit\" this.update}}>\n        {{#each-in this.config.ENV as |key value|}}\n        <div class=\"form-floating mb-3\">\n          <Input @type=\"text\" class=\"form-control\" id=\"{{key}}\" name=\"{{key}}\" @value={{value}} placeholder=\"Value for {{key}}\" />\n          <label for=\"{{key}}\" class=\"form-label\">{{key}}</label>\n        </div>\n        {{/each-in}}\n        <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n      </form>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"IryONnMm\",\n    \"block\": \"[[[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"col-md-6 offset-md-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h1\\\"],[14,0,\\\"fs-3\\\"],[12],[1,\\\"Settings\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Various settings for the developer\\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[11,\\\"form\\\"],[4,[38,4],[\\\"submit\\\",[30,0,[\\\"update\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[30,0,[\\\"config\\\",\\\"ENV\\\"]]],null],null,[[[1,\\\"      \\\"],[10,0],[14,0,\\\"form-floating mb-3\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,7],[[24,0,\\\"form-control\\\"],[16,1,[29,[[30,2]]]],[16,3,[29,[[30,2]]]],[16,\\\"placeholder\\\",[29,[\\\"Value for \\\",[30,2]]]]],[[\\\"@type\\\",\\\"@value\\\"],[\\\"text\\\",[30,1]]],null],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[30,2]]]],[14,0,\\\"form-label\\\"],[12],[1,[30,2]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[1,2]],null],[1,\\\"      \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"Submit\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"value\\\",\\\"key\\\"],false,[\\\"div\\\",\\\"h1\\\",\\\"p\\\",\\\"form\\\",\\\"on\\\",\\\"each\\\",\\\"-each-in\\\",\\\"input\\\",\\\"label\\\",\\\"button\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/settings.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/stream-player\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <figure>\n    <figcaption>{{yield}}</figcaption>\n    <audio {{did-insert (fn this.initializeMediaPlayer @stream @autoplay)}} id=\"stream-player-{{@stream.slug}}\" class=\"stream-player stream-player-wide\" preload=\"none\">\n      Your browser does not support the <code>audio</code> element.\n    </audio>\n  </figure>\n  */\n  {\n    \"id\": \"TlXisugG\",\n    \"block\": \"[[[10,\\\"figure\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"figcaption\\\"],[12],[18,3,null],[13],[1,\\\"\\\\n  \\\"],[11,\\\"audio\\\"],[16,1,[29,[\\\"stream-player-\\\",[30,1,[\\\"slug\\\"]]]]],[24,0,\\\"stream-player stream-player-wide\\\"],[24,\\\"preload\\\",\\\"none\\\"],[4,[38,4],[[28,[37,5],[[30,0,[\\\"initializeMediaPlayer\\\"]],[30,1],[30,2]],null]],null],[12],[1,\\\"\\\\n    Your browser does not support the \\\"],[10,\\\"code\\\"],[12],[1,\\\"audio\\\"],[13],[1,\\\" element.\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@stream\\\",\\\"@autoplay\\\",\\\"&default\\\"],false,[\\\"figure\\\",\\\"figcaption\\\",\\\"yield\\\",\\\"audio\\\",\\\"did-insert\\\",\\\"fn\\\",\\\"code\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/stream-player.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/transcript-search\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h1 class=\"visually-hidden\">Call Transcript Search</h1>\n  <div class=\"row mb-2 {{if (eq this.hasAccess undefined) \"d-none\" \"\"}}\">\n    <div class=\"col-lg-3 d-none d-lg-block\">\n      <h2 class=\"fs-4\">Filters</h2>\n    </div>\n    <div id=\"searchbox\" class=\"col-lg mb-2 mb-lg-0\"></div>\n    <div id=\"sort-by\" class=\"col-lg-auto col\"></div>\n    <div id=\"hits-per-page\" class=\"col-lg-auto col\"></div>\n    <div id=\"option-buttons\" class=\"col-md-auto d-flex justify-content-end\">\n      <button type=\"button\" class=\"btn btn-primary d-lg-none\" data-bs-toggle=\"collapse\" data-bs-target=\"#filters\" aria-controls=\"filters\">\n        <span class=\"visually-hidden\">Filters</span>\n        <FaIcon @icon=\"filter\" />\n      </button>\n      {{#if this.hasAccess}}\n      {{#if this.session.user.patreon_tier.features.transcript_notifications}}\n      <LinkTo @route=\"notifications\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"btn btn-info text-bg-info\">\n        <span class=\"visually-hidden\">Notify Me</span>\n        <FaIcon @icon=\"bell\" />\n      </LinkTo>\n      {{/if}}\n      <div id=\"refresh-buttons\" class=\"btn-group\" role=\"group\" aria-label=\"Refresh buttons\">\n        <button type=\"button\" class=\"btn btn-primary\" {{on \"click\" this.refresh}}>\n          <span class=\"visually-hidden\">Refresh</span>\n          <FaIcon @icon=\"redo\" class=\"{{if this.autoRefreshInterval \"spin\" \"\"}}\" />\n        </button>\n        <button type=\"button\" class=\"btn btn-outline-primary {{if this.autoRefreshInterval \"active\" \"\"}}\" data-bs-toggle=\"button\" {{on \"click\" this.toggleAutoRefresh}}>\n          Auto-Refresh\n        </button>\n      </div>\n      {{/if}}\n      <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"collapse\" data-bs-target=\"#settings\" aria-controls=\"settings\">\n        <span class=\"visually-hidden\">Settings</span>\n        <FaIcon @icon=\"gear\" />\n      </button>\n      <button type=\"button\" class=\"btn btn-primary\" {{on \"click\" this.saveSearch}}>\n        <span class=\"visually-hidden\">Save</span>\n        <FaIcon @icon=\"save\" />\n      </button>\n    </div>\n  </div>\n  \n  {{#if (eq this.hasAccess undefined)}}\n  <p {{did-insert this.setupSearch}}>Logging in...</p>\n  {{/if}}\n  <div class=\"search-panel row {{if (eq this.hasAccess undefined) \"d-none\" \"\"}}\">\n    <div class=\"search-panel__filters col-lg-3\">\n      {{#if (eq this.indexName this.demoIndexName)}}\n      <div class=\"alert alert-danger\">\n        {{#if this.session.isAuthenticated}}\n        <p>\n          You are currently using a demo version with old transmissions. To search the latest scanner traffic, please upgrade your membership on Patreon to the\n          {{#if (and this.onTranscriptMapPage (not this.session.user.patreon_tier.features.transcript_geosearch))}}\n          Captain ($20/mo)\n          {{else}}\n          Sergeant ($5/mo)\n          {{/if}}\n          tier or above to access.\n        </p>\n        {{else}}\n        <p>You are currently using a demo version with old transmissions. To search the latest scanner traffic, become a patron of at least $5/mo and then <a href=\"{{ this.config.ENV.API_BASE_URL }}/auth/redirect\" referrerpolicy=\"unsafe-url\">login</a>.</p>\n        <p class=\"mt-2\"><a href=\"https://www.patreon.com/bePatron?u=4805116\" referrerpolicy=\"unsafe-url\" class=\"ptrn-button\"><img class=\"img-fluid\" src=\"/img/become-a-patron.png\" alt=\"Become a Patron!\"></a></p>\n        {{/if}}\n      </div>\n      {{else}}\n        {{#unless (eq this.indexName this.latestIndexName)}}\n        <div class=\"alert alert-warning\">\n          <p>You are using an old search index ({{this.indexName}}). To search the latest scanner traffic, please switch to the <a href=\"javascript:;\" {{on \"click\" (fn this.setIndexName this.latestIndexName)}}>latest index</a>.</p>\n        </div>\n        {{/unless}}\n      {{/if}}\n      <div id=\"filters\" class=\"collapse\">\n        <h2 id=\"filtersHeading\" class=\"d-lg-none\">Filters</h2>\n        <div class=\"row mb-4\">\n          <div id=\"clear-refinements\" class=\"col\"></div>\n          <div id=\"reset-refinements\" class=\"col\">\n            <button type=\"button\" class=\"ais-ClearRefinements-button\" {{on \"click\" this.resetFilters}}><span>Default filters</span></button>\n          </div>\n          <div id=\"chicago-refinements\" class=\"col\">\n            <button type=\"button\" class=\"ais-ClearRefinements-button\" {{on \"click\" this.setChicagoFilters}}><span>Chicago only</span></button>\n          </div>\n        </div>\n        <div class=\"accordion accordion-flush\" id=\"filterOptionsAccordion\">\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"saved-h-heading\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#saved-h-collapse\" aria-expanded=\"false\" aria-controls=\"tg-h-collapse\">\n                Saved Searches\n              </button>\n            </h3>\n            <div id=\"saved-h-collapse\" class=\"accordion-collapse collapse show\" aria-labelledby=\"saved-h-heading\">\n              <div id=\"saved-h-menu\" class=\"accordion-body\">\n                {{#unless this.savedSearches}}\n                No saved searches.\n                {{/unless}}\n                {{#each this.savedSearches as |search|}}\n                <ul class=\"list-group list-group-horizontal pb-2\">\n                  <a href=\"{{search.latestUrl}}\" class=\"list-group-item list-group-item-action\">\n                    {{search.name}}\n                  </a>\n                  {{#if search.is_global}}\n                  <li class=\"list-group-item\">\n                    <FaIcon @icon=\"earth-americas\" />\n                  </li>\n                  {{/if}}\n                  {{#if (eq search.user_id this.session.user.id)}}\n                  <button type=\"button\" class=\"btn btn-secondary btn-sm list-group-item\" aria-label=\"Update\" {{on \"click\" (fn this.updateSavedSearch search)}}>\n                    <FaIcon @icon=\"pencil\" />\n                  </button>\n                  <button type=\"button\" class=\"btn btn-danger btn-sm list-group-item\" aria-label=\"Delete\" {{on \"click\" (fn this.deleteSavedSearch search)}}>\n                    <FaIcon @icon=\"trash-alt\" />\n                  </button>\n                  {{/if}}\n                </ul>\n                {{/each}}\n              </div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"tg-h-heading\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#tg-h-collapse\" aria-expanded=\"false\" aria-controls=\"tg-h-collapse\">\n                System / Department / Talkgroup\n              </button>\n            </h3>\n            <div id=\"tg-h-collapse\" class=\"accordion-collapse collapse show\" aria-labelledby=\"tg-h-heading\">\n              <div id=\"tg-h-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"system-heading\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#system-collapse\" aria-expanded=\"false\" aria-controls=\"system-collapse\">\n                Radio System\n              </button>\n            </h3>\n            <div id=\"system-collapse\" class=\"accordion-collapse collapse show\" aria-labelledby=\"system-heading\">\n              <div id=\"system-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"dept-heading\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#dept-collapse\" aria-expanded=\"false\" aria-controls=\"dept-collapse\">\n                Departments\n              </button>\n            </h3>\n            <div id=\"dept-collapse\" class=\"accordion-collapse collapse show\" aria-labelledby=\"dept-heading\">\n              <div id=\"dept-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"tg-heading\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#tg-collapse\" aria-expanded=\"false\" aria-controls=\"tg-collapse\">\n                Talkgroups\n              </button>\n            </h3>\n            <div id=\"tg-collapse\" class=\"accordion-collapse collapse show\" aria-labelledby=\"tg-heading\">\n              <div id=\"tg-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"tg-type-heading\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#tg-type-collapse\" aria-expanded=\"false\" aria-controls=\"tg-type-collapse\">\n                Talkgroup Type\n              </button>\n            </h3>\n            <div id=\"tg-type-collapse\" class=\"accordion-collapse collapse show\" aria-labelledby=\"tg-type-heading\">\n              <div id=\"tg-type-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"units-heading\">\n              <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#units-collapse\" aria-expanded=\"false\" aria-controls=\"units-collapse\">\n                Units\n              </button>\n            </h3>\n            <div id=\"units-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"units-heading\">\n              <div id=\"units-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"radios-heading\">\n              <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#radios-collapse\" aria-expanded=\"false\" aria-controls=\"radios-collapse\">\n                Radio IDs\n              </button>\n            </h3>\n            <div id=\"radios-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"radios-heading\">\n              <div id=\"radios-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div>\n          {{!-- <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"srclist-heading\">\n              <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#srclist-collapse\" aria-expanded=\"false\" aria-controls=\"srclist-collapse\">\n                Sources\n              </button>\n            </h3>\n            <div id=\"srclist-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"srclist-heading\">\n              <div id=\"srclist-menu\" class=\"accordion-body\"></div>\n            </div>\n          </div> --}}\n          <div class=\"accordion-item\">\n            <h3 class=\"accordion-header\" id=\"calltime-heading\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#time-input-collapse\" aria-expanded=\"false\" aria-controls=\"time-input-collapse\">\n                Call Time\n              </button>\n            </h3>\n            <div id=\"time-input-collapse\" class=\"accordion-collapse collapse show\" aria-labelledby=\"calltime-heading\">\n              <div id=\"time-input\" class=\"accordion-body\">\n                <div class=\"col\">\n                  <label for=\"minStartTime\">From Time</label>\n                  <div class=\"input-group date\">\n                    <EmberFlatpickr name=\"minStartTime\" @id=\"minStartTime\" @allowInput={{true}} class=\"form-control\" @defaultDate={{this.flatpickrOptions.minDefaultDate}} @enableTime={{this.flatpickrOptions.enableTime}} @dateFormat={{this.flatpickrOptions.dateFormat}} @date={{this.minStartTime}} @onChange={{null}} @onClose={{this.setStartTimeRange}} @altInput={{this.flatpickrOptions.altInput}} @altFormat={{this.flatpickrOptions.altFormat}} />\n                    <span class=\"input-group-text\"><FaIcon @icon=\"calendar\" /></span>\n                  </div>\n                </div>\n                <div class=\"col\">\n                  <label for=\"maxStartTime\">To Time</label>\n                  <div class=\"input-group date\">\n                    <EmberFlatpickr name=\"maxStartTime\" @id=\"maxStartTime\" @allowInput={{true}} class=\"form-control\" @defaultDate={{this.flatpickrOptions.maxDefaultDate}} @enableTime={{this.flatpickrOptions.enableTime}} @dateFormat={{this.flatpickrOptions.dateFormat}} @date={{this.maxStartTime}} @onChange={{null}} @onClose={{this.setStartTimeRange}} @altInput={{this.flatpickrOptions.altInput}} @altFormat={{this.flatpickrOptions.altFormat}} />\n                    <span class=\"input-group-text\"><FaIcon @icon=\"calendar\" /></span>\n                  </div>\n                </div>\n                <div class=\"alert alert-warning mt-3\" role=\"alert\">\n                  You can only search one month at a time due to system limitations. Please limit your search to a month or less. Archives go back to January 2023.\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class=\"search-panel__results col\">\n      <div id=\"settings\" class=\"collapse row justify-content-between mb-1\">\n        <div class=\"col-md-auto\">\n          <div class=\"form-check form-switch mt-2 mb-1\">\n            <Input class=\"form-check-input\" @type=\"checkbox\" role=\"switch\" id=\"waveform-toggle\" @checked={{this.useMediaPlayerComponent}} aria-checked=\"{{this.useMediaPlayerComponent}}\" />\n            <label class=\"form-check-label\" for=\"waveform-toggle\">Show waveform when playing audio</label>\n          </div>\n        </div>\n      </div>\n      <div id=\"current-refinements\" class=\"mt-2\"></div>\n      <div id=\"stats\" class=\"mb-1\"></div>\n      {{#if this.onTranscriptMapPage}}\n      <h5>Experimental map of radio calls</h5>\n      {{#if (and this.hasAccess (not this.session.user.patreon_tier.features.transcript_geosearch))}}\n      <p class=\"text-danger\">Sorry, you must be at the Captain tier or above on Patreon to access the map of calls (currently an experimental feature).</p>\n      {{/if}}\n      <div id=\"geo-search\" class=\"ais-GeoSearch-map mb-1\"></div>\n      {{/if}}\n      <div id=\"hits\" class=\"ais-Hits\">\n        <ol class=\"ais-Hits-list\">\n          {{#each this.hits key=\"id\" as |hit|}}\n          <li id=\"hit-{{hit.id}}\" class=\"ais-Hits-item{{if (eq hit.id this.selectedHit) \" selected\" \"\"}}\" {{did-insert this.didInsertHit}}>\n            <div class=\"row\">\n              <div class=\"col-lg-5 collapse d-md-block order-lg-2\" id=\"hit-{{hit.id}}-metadata-col\">\n                <p class=\"d-none d-md-block\">\n                  <strong>\n                    <a href=\"{{hit.permalink}}\"><FaIcon @icon=\"link\" /> {{hit.start_time_string}}</a>\n                  </strong>\n                  {{hit.time_warning}}\n                  <span class=\"fst-italic fs-7\">({{hit.relative_time}})</span>\n                </p>\n                <p>\n                  <span class=\"badge text-bg-light me-1\">\n                    Duration: {{hit.call_length}}s\n                  </span>\n                  <a href=\"https://openmhz.com/system/{{hit.short_name}}?filter-type=talkgroup&filter-code={{hit.talkgroup}}&time={{hit.start_time_ms}}\" class=\"badge text-bg-secondary me-1\" target=\"_blank\" rel=\"noopener noreferrer\">\n                    TG {{hit.talkgroup}}\n                  </a>\n                  <span\n                    class=\"badge text-bg-secondary me-1\"\n                  >\n                    {{hit.audio_type}}\n                  </span>\n                  {{#if hit.encrypted}}\n                  <span class=\"badge text-bg-warning me-1\" data-bs-toggle=\"tooltip\" title=\"From an official Broadcastify.com stream of an encrypted channel\">\n                    Encrypted / Delayed 30mins\n                  </span>\n                  {{/if}}\n                  {{#if (eq this.session.user.id 1)}}\n                  <button\n                    class=\"badge text-bg-light btn btn-sm btn-light\"\n                    type=\"button\"\n                    data-bs-toggle=\"modal\"\n                    data-bs-target=\"#metadata-{{hit.id}}\"\n                  >\n                    Raw Data\n                  </button>\n                  {{/if}}\n                </p>\n                <p class=\"fst-italic\">{{hit.talkgroup_group}} / <strong>{{hit.talkgroup_description}}</strong></p>\n                {{#if hit.showPlayer}}\n                  {{#if this.useMediaPlayerComponent}}\n                  <MediaPlayer @src=\"{{hit.raw_audio_url}}\" @type=\"audio/mpeg\" @idSuffix=\"-{{hit.id}}\" @hideZoom=\"true\" @autoplay=\"true\" />\n                  {{else}}\n                  <audio\n                    id=\"call-audio-{{hit.id}}\"\n                    class=\"call-audio\"\n                    src=\"{{hit.raw_audio_url}}\"\n                    controls\n                    autoplay\n                  ></audio>\n                  {{/if}}\n                  <a href=\"{{hit.raw_audio_url}}\" class=\"btn btn-sm btn-primary mt-2\" target=\"_blank\" rel=\"noopener noreferrer\">\n                    <FaIcon @icon=\"download\" /> Download Audio\n                  </a>\n                {{/if}}\n              </div>\n              <div class=\"col\">\n                <h4 class=\"fs-6\">\n                  <button type=\"button\" class=\"btn btn-sm btn-success\" {{on \"click\" (fn this.playAudio hit)}}>\n                    <FaIcon @icon=\"play\" /><span class=\"visually-hidden\">Play Audio</span>\n                  </button>\n                  {{#if (eq hit.id this.selectedHit)}}\n                  <a class=\"btn btn-sm btn-warning\" href=\"{{hit.contextUrl}}\" {{on \"click\" (fn this.getContext hit)}}>\n                    <FaIcon @icon=\"star\" />\n                  </a>\n                  {{else}}\n                  <a class=\"btn btn-sm btn-primary\" href=\"{{hit.contextUrl}}\" {{on \"click\" (fn this.getContext hit)}}>\n                    <FaIcon @icon=\"filter\" />\n                  </a>\n                  {{/if}}\n                  <button type=\"button\" class=\"btn btn-sm btn-info d-md-none\" data-bs-toggle=\"collapse\" data-bs-target=\"#hit-{{hit.id}}-metadata-col\" aria-expanded=\"false\" aria-controls=\"hit-{{hit.id}}-metadata-col\">\n                    <FaIcon @icon=\"circle-info\" /><span class=\"visually-hidden\">More Details</span>\n                  </button>\n                  {{hit.talkgroup_tag}}\n                  <span class=\"badge text-bg-{{hit.talkgroup_group_tag_color}} ms-1 me-1\">\n                    {{hit.talkgroup_group_tag}}\n                  </span>\n                </h4>\n                {{#if this.onTranscriptMapPage}}\n                <p><span class=\"badge text-bg-light fs-6\"><FaIcon @icon=\"location-dot\" /> {{hit.geo_formatted_address}}</span></p>\n                {{/if}}\n                <p class=\"text-small d-md-none\">\n                  <strong>\n                    <a href=\"{{hit.permalink}}\">{{hit.start_time_string}}</a>\n                  </strong>\n                  {{hit.time_warning}}\n                  <span class=\"fst-italic fs-7\">({{hit.relative_time}})</span>\n                </p>\n                <blockquote class=\"blockquote\">\n                  {{#each hit.raw_transcript as |segment|}}\n                    <p>\n                      {{#if (get segment \"0\")}}\n                      {{!-- template-lint-disable no-triple-curlies --}}\n                      <a href=\"{{get segment \"0.filter_link\"}}\" title=\"Radio ID {{get segment \"0.src\"}}\" {{on \"click\" (fn this.filterSrc (get segment \"0\") hit)}}>{{{get segment \"0.label\"}}}</a>{{#if (get segment \"0.address\")}} <a href=\"javascript:;\" data-bs-toggle=\"tooltip\" data-bs-title=\"{{{get segment \"0.address\"}}}\"><FaIcon @icon=\"map-marker-alt\" /></a>{{/if}}:\n                      {{/if}}\n                      {{!-- template-lint-disable no-triple-curlies --}}\n                      {{{get segment \"1\"}}}\n                    </p>\n                  {{/each}}\n                </blockquote>\n              </div>\n            </div>\n            {{#if (eq this.session.user.id 1)}}\n            <div class=\"modal fade metadata-modal\" id=\"metadata-{{hit.id}}\" tabindex=\"-1\" aria-labelledby=\"metadata-modal-heading-{{hit.id}}\" aria-hidden=\"true\">\n              <div class=\"modal-dialog modal-xl\" role=\"document\">\n                <div class=\"modal-content\">\n                  <div class=\"modal-header\">\n                    <h5 class=\"modal-title\" id=\"metadata-modal-heading-{{hit.id}}\">Raw Result Data</h5>\n                    <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n                  </div>\n                  <div class=\"modal-body\">\n                    <pre>{{hit.json}}</pre>\n                  </div>\n                </div>\n              </div>\n            </div>\n            {{/if}}\n          </li>\n          {{/each}}\n        </ol>\n      </div>\n      <div id=\"pagination\" class=\"mt-3\"></div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"48fO3V4z\",\n    \"block\": \"[[[10,\\\"h1\\\"],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"Call Transcript Search\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[15,0,[29,[\\\"row mb-2 \\\",[52,[28,[37,3],[[30,0,[\\\"hasAccess\\\"]],[27]],null],\\\"d-none\\\",\\\"\\\"]]]],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"col-lg-3 d-none d-lg-block\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h2\\\"],[14,0,\\\"fs-4\\\"],[12],[1,\\\"Filters\\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,1,\\\"searchbox\\\"],[14,0,\\\"col-lg mb-2 mb-lg-0\\\"],[12],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,1,\\\"sort-by\\\"],[14,0,\\\"col-lg-auto col\\\"],[12],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,1,\\\"hits-per-page\\\"],[14,0,\\\"col-lg-auto col\\\"],[12],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,1,\\\"option-buttons\\\"],[14,0,\\\"col-md-auto d-flex justify-content-end\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary d-lg-none\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#filters\\\"],[14,\\\"aria-controls\\\",\\\"filters\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"Filters\\\"],[13],[1,\\\"\\\\n      \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"filter\\\"]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"hasAccess\\\"]],[[[41,[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"features\\\",\\\"transcript_notifications\\\"]],[[[1,\\\"    \\\"],[8,[39,8],[[24,\\\"target\\\",\\\"_blank\\\"],[24,\\\"rel\\\",\\\"noopener noreferrer\\\"],[24,0,\\\"btn btn-info text-bg-info\\\"]],[[\\\"@route\\\"],[\\\"notifications\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"Notify Me\\\"],[13],[1,\\\"\\\\n      \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"bell\\\"]],null],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,0],[14,1,\\\"refresh-buttons\\\"],[14,0,\\\"btn-group\\\"],[14,\\\"role\\\",\\\"group\\\"],[14,\\\"aria-label\\\",\\\"Refresh buttons\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-primary\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[30,0,[\\\"refresh\\\"]]],null],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"Refresh\\\"],[13],[1,\\\"\\\\n        \\\"],[8,[39,7],[[16,0,[29,[[52,[30,0,[\\\"autoRefreshInterval\\\"]],\\\"spin\\\",\\\"\\\"]]]]],[[\\\"@icon\\\"],[\\\"redo\\\"]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-outline-primary \\\",[52,[30,0,[\\\"autoRefreshInterval\\\"]],\\\"active\\\",\\\"\\\"]]]],[24,\\\"data-bs-toggle\\\",\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[30,0,[\\\"toggleAutoRefresh\\\"]]],null],[12],[1,\\\"\\\\n        Auto-Refresh\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-secondary\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#settings\\\"],[14,\\\"aria-controls\\\",\\\"settings\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"Settings\\\"],[13],[1,\\\"\\\\n      \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"gear\\\"]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-primary\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[30,0,[\\\"saveSearch\\\"]]],null],[12],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"Save\\\"],[13],[1,\\\"\\\\n      \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"save\\\"]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,3],[[30,0,[\\\"hasAccess\\\"]],[27]],null],[[[11,2],[4,[38,11],[[30,0,[\\\"setupSearch\\\"]]],null],[12],[1,\\\"Logging in...\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[15,0,[29,[\\\"search-panel row \\\",[52,[28,[37,3],[[30,0,[\\\"hasAccess\\\"]],[27]],null],\\\"d-none\\\",\\\"\\\"]]]],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"search-panel__filters col-lg-3\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[30,0,[\\\"indexName\\\"]],[30,0,[\\\"demoIndexName\\\"]]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"alert alert-danger\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"session\\\",\\\"isAuthenticated\\\"]],[[[1,\\\"      \\\"],[10,2],[12],[1,\\\"\\\\n        You are currently using a demo version with old transmissions. To search the latest scanner traffic, please upgrade your membership on Patreon to the\\\\n\\\"],[41,[28,[37,12],[[30,0,[\\\"onTranscriptMapPage\\\"]],[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"features\\\",\\\"transcript_geosearch\\\"]]],null]],null],[[[1,\\\"        Captain ($20/mo)\\\\n\\\"]],[]],[[[1,\\\"        Sergeant ($5/mo)\\\\n\\\"]],[]]],[1,\\\"        tier or above to access.\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[10,2],[12],[1,\\\"You are currently using a demo version with old transmissions. To search the latest scanner traffic, become a patron of at least $5/mo and then \\\"],[10,3],[15,6,[29,[[30,0,[\\\"config\\\",\\\"ENV\\\",\\\"API_BASE_URL\\\"]],\\\"/auth/redirect\\\"]]],[14,\\\"referrerpolicy\\\",\\\"unsafe-url\\\"],[12],[1,\\\"login\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[14,0,\\\"mt-2\\\"],[12],[10,3],[14,6,\\\"https://www.patreon.com/bePatron?u=4805116\\\"],[14,\\\"referrerpolicy\\\",\\\"unsafe-url\\\"],[14,0,\\\"ptrn-button\\\"],[12],[10,\\\"img\\\"],[14,0,\\\"img-fluid\\\"],[14,\\\"src\\\",\\\"/img/become-a-patron.png\\\"],[14,\\\"alt\\\",\\\"Become a Patron!\\\"],[12],[13],[13],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[51,[28,[37,3],[[30,0,[\\\"indexName\\\"]],[30,0,[\\\"latestIndexName\\\"]]],null]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"alert alert-warning\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"You are using an old search index (\\\"],[1,[30,0,[\\\"indexName\\\"]]],[1,\\\"). To search the latest scanner traffic, please switch to the \\\"],[11,3],[24,6,\\\"javascript:;\\\"],[4,[38,9],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"setIndexName\\\"]],[30,0,[\\\"latestIndexName\\\"]]],null]],null],[12],[1,\\\"latest index\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"    \\\"],[10,0],[14,1,\\\"filters\\\"],[14,0,\\\"collapse\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"filtersHeading\\\"],[14,0,\\\"d-lg-none\\\"],[12],[1,\\\"Filters\\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"row mb-4\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,1,\\\"clear-refinements\\\"],[14,0,\\\"col\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,1,\\\"reset-refinements\\\"],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n          \\\"],[11,\\\"button\\\"],[24,0,\\\"ais-ClearRefinements-button\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[30,0,[\\\"resetFilters\\\"]]],null],[12],[10,1],[12],[1,\\\"Default filters\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,1,\\\"chicago-refinements\\\"],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n          \\\"],[11,\\\"button\\\"],[24,0,\\\"ais-ClearRefinements-button\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[30,0,[\\\"setChicagoFilters\\\"]]],null],[12],[10,1],[12],[1,\\\"Chicago only\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"accordion accordion-flush\\\"],[14,1,\\\"filterOptionsAccordion\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"saved-h-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#saved-h-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"tg-h-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Saved Searches\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"saved-h-collapse\\\"],[14,0,\\\"accordion-collapse collapse show\\\"],[14,\\\"aria-labelledby\\\",\\\"saved-h-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"saved-h-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[30,0,[\\\"savedSearches\\\"]]],[[[1,\\\"              No saved searches.\\\\n\\\"]],[]],null],[42,[28,[37,20],[[28,[37,20],[[30,0,[\\\"savedSearches\\\"]]],null]],null],null,[[[1,\\\"              \\\"],[10,\\\"ul\\\"],[14,0,\\\"list-group list-group-horizontal pb-2\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[15,6,[29,[[30,1,[\\\"latestUrl\\\"]]]]],[14,0,\\\"list-group-item list-group-item-action\\\"],[12],[1,\\\"\\\\n                  \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"is_global\\\"]],[[[1,\\\"                \\\"],[10,\\\"li\\\"],[14,0,\\\"list-group-item\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"earth-americas\\\"]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,3],[[30,1,[\\\"user_id\\\"]],[30,0,[\\\"session\\\",\\\"user\\\",\\\"id\\\"]]],null],[[[1,\\\"                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-secondary btn-sm list-group-item\\\"],[24,\\\"aria-label\\\",\\\"Update\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"updateSavedSearch\\\"]],[30,1]],null]],null],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"pencil\\\"]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-danger btn-sm list-group-item\\\"],[24,\\\"aria-label\\\",\\\"Delete\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"deleteSavedSearch\\\"]],[30,1]],null]],null],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"trash-alt\\\"]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"              \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"tg-h-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#tg-h-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"tg-h-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              System / Department / Talkgroup\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"tg-h-collapse\\\"],[14,0,\\\"accordion-collapse collapse show\\\"],[14,\\\"aria-labelledby\\\",\\\"tg-h-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"tg-h-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"system-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#system-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"system-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Radio System\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"system-collapse\\\"],[14,0,\\\"accordion-collapse collapse show\\\"],[14,\\\"aria-labelledby\\\",\\\"system-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"system-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"dept-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#dept-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"dept-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Departments\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"dept-collapse\\\"],[14,0,\\\"accordion-collapse collapse show\\\"],[14,\\\"aria-labelledby\\\",\\\"dept-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"dept-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"tg-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#tg-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"tg-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Talkgroups\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"tg-collapse\\\"],[14,0,\\\"accordion-collapse collapse show\\\"],[14,\\\"aria-labelledby\\\",\\\"tg-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"tg-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"tg-type-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#tg-type-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"tg-type-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Talkgroup Type\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"tg-type-collapse\\\"],[14,0,\\\"accordion-collapse collapse show\\\"],[14,\\\"aria-labelledby\\\",\\\"tg-type-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"tg-type-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"units-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button collapsed\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#units-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"units-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Units\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"units-collapse\\\"],[14,0,\\\"accordion-collapse collapse\\\"],[14,\\\"aria-labelledby\\\",\\\"units-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"units-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"radios-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button collapsed\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#radios-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"radios-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Radio IDs\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"radios-collapse\\\"],[14,0,\\\"accordion-collapse collapse\\\"],[14,\\\"aria-labelledby\\\",\\\"radios-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"radios-menu\\\"],[14,0,\\\"accordion-body\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,0],[14,0,\\\"accordion-item\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[14,0,\\\"accordion-header\\\"],[14,1,\\\"calltime-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"accordion-button\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[14,\\\"data-bs-target\\\",\\\"#time-input-collapse\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,\\\"aria-controls\\\",\\\"time-input-collapse\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n              Call Time\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,1,\\\"time-input-collapse\\\"],[14,0,\\\"accordion-collapse collapse show\\\"],[14,\\\"aria-labelledby\\\",\\\"calltime-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"time-input\\\"],[14,0,\\\"accordion-body\\\"],[12],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"minStartTime\\\"],[12],[1,\\\"From Time\\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"input-group date\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[39,24],[[24,3,\\\"minStartTime\\\"],[24,0,\\\"form-control\\\"]],[[\\\"@id\\\",\\\"@allowInput\\\",\\\"@defaultDate\\\",\\\"@enableTime\\\",\\\"@dateFormat\\\",\\\"@date\\\",\\\"@onChange\\\",\\\"@onClose\\\",\\\"@altInput\\\",\\\"@altFormat\\\"],[\\\"minStartTime\\\",true,[30,0,[\\\"flatpickrOptions\\\",\\\"minDefaultDate\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"enableTime\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"dateFormat\\\"]],[30,0,[\\\"minStartTime\\\"]],null,[30,0,[\\\"setStartTimeRange\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"altInput\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"altFormat\\\"]]]],null],[1,\\\"\\\\n                  \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"calendar\\\"]],null],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"maxStartTime\\\"],[12],[1,\\\"To Time\\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"input-group date\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[39,24],[[24,3,\\\"maxStartTime\\\"],[24,0,\\\"form-control\\\"]],[[\\\"@id\\\",\\\"@allowInput\\\",\\\"@defaultDate\\\",\\\"@enableTime\\\",\\\"@dateFormat\\\",\\\"@date\\\",\\\"@onChange\\\",\\\"@onClose\\\",\\\"@altInput\\\",\\\"@altFormat\\\"],[\\\"maxStartTime\\\",true,[30,0,[\\\"flatpickrOptions\\\",\\\"maxDefaultDate\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"enableTime\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"dateFormat\\\"]],[30,0,[\\\"maxStartTime\\\"]],null,[30,0,[\\\"setStartTimeRange\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"altInput\\\"]],[30,0,[\\\"flatpickrOptions\\\",\\\"altFormat\\\"]]]],null],[1,\\\"\\\\n                  \\\"],[10,1],[14,0,\\\"input-group-text\\\"],[12],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"calendar\\\"]],null],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"alert alert-warning mt-3\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n                You can only search one month at a time due to system limitations. Please limit your search to a month or less. Archives go back to January 2023.\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"search-panel__results col\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,1,\\\"settings\\\"],[14,0,\\\"collapse row justify-content-between mb-1\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"col-md-auto\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"form-check form-switch mt-2 mb-1\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[39,25],[[24,0,\\\"form-check-input\\\"],[24,\\\"role\\\",\\\"switch\\\"],[24,1,\\\"waveform-toggle\\\"],[16,\\\"aria-checked\\\",[29,[[30,0,[\\\"useMediaPlayerComponent\\\"]]]]]],[[\\\"@type\\\",\\\"@checked\\\"],[\\\"checkbox\\\",[30,0,[\\\"useMediaPlayerComponent\\\"]]]],null],[1,\\\"\\\\n          \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[14,\\\"for\\\",\\\"waveform-toggle\\\"],[12],[1,\\\"Show waveform when playing audio\\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,1,\\\"current-refinements\\\"],[14,0,\\\"mt-2\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,1,\\\"stats\\\"],[14,0,\\\"mb-1\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"onTranscriptMapPage\\\"]],[[[1,\\\"    \\\"],[10,\\\"h5\\\"],[12],[1,\\\"Experimental map of radio calls\\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,12],[[30,0,[\\\"hasAccess\\\"]],[28,[37,13],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"patreon_tier\\\",\\\"features\\\",\\\"transcript_geosearch\\\"]]],null]],null],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"text-danger\\\"],[12],[1,\\\"Sorry, you must be at the Captain tier or above on Patreon to access the map of calls (currently an experimental feature).\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,0],[14,1,\\\"geo-search\\\"],[14,0,\\\"ais-GeoSearch-map mb-1\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,0],[14,1,\\\"hits\\\"],[14,0,\\\"ais-Hits\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"ol\\\"],[14,0,\\\"ais-Hits-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,20],[[28,[37,20],[[30,0,[\\\"hits\\\"]]],null]],null],\\\"id\\\",[[[1,\\\"        \\\"],[11,\\\"li\\\"],[16,1,[29,[\\\"hit-\\\",[30,2,[\\\"id\\\"]]]]],[16,0,[29,[\\\"ais-Hits-item\\\",[52,[28,[37,3],[[30,2,[\\\"id\\\"]],[30,0,[\\\"selectedHit\\\"]]],null],\\\" selected\\\",\\\"\\\"]]]],[4,[38,11],[[30,0,[\\\"didInsertHit\\\"]]],null],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"col-lg-5 collapse d-md-block order-lg-2\\\"],[15,1,[29,[\\\"hit-\\\",[30,2,[\\\"id\\\"]],\\\"-metadata-col\\\"]]],[12],[1,\\\"\\\\n              \\\"],[10,2],[14,0,\\\"d-none d-md-block\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"strong\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,3],[15,6,[29,[[30,2,[\\\"permalink\\\"]]]]],[12],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"link\\\"]],null],[1,\\\" \\\"],[1,[30,2,[\\\"start_time_string\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[1,[30,2,[\\\"time_warning\\\"]]],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"fst-italic fs-7\\\"],[12],[1,\\\"(\\\"],[1,[30,2,[\\\"relative_time\\\"]]],[1,\\\")\\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,2],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"badge text-bg-light me-1\\\"],[12],[1,\\\"\\\\n                  Duration: \\\"],[1,[30,2,[\\\"call_length\\\"]]],[1,\\\"s\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,3],[15,6,[29,[\\\"https://openmhz.com/system/\\\",[30,2,[\\\"short_name\\\"]],\\\"?filter-type=talkgroup&filter-code=\\\",[30,2,[\\\"talkgroup\\\"]],\\\"&time=\\\",[30,2,[\\\"start_time_ms\\\"]]]]],[14,0,\\\"badge text-bg-secondary me-1\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"\\\\n                  TG \\\"],[1,[30,2,[\\\"talkgroup\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"badge text-bg-secondary me-1\\\"],[12],[1,\\\"\\\\n                  \\\"],[1,[30,2,[\\\"audio_type\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"encrypted\\\"]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"badge text-bg-warning me-1\\\"],[14,\\\"data-bs-toggle\\\",\\\"tooltip\\\"],[14,\\\"title\\\",\\\"From an official Broadcastify.com stream of an encrypted channel\\\"],[12],[1,\\\"\\\\n                  Encrypted / Delayed 30mins\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,3],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"id\\\"]],1],null],[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"badge text-bg-light btn btn-sm btn-light\\\"],[14,\\\"data-bs-toggle\\\",\\\"modal\\\"],[15,\\\"data-bs-target\\\",[29,[\\\"#metadata-\\\",[30,2,[\\\"id\\\"]]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                  Raw Data\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,2],[14,0,\\\"fst-italic\\\"],[12],[1,[30,2,[\\\"talkgroup_group\\\"]]],[1,\\\" / \\\"],[10,\\\"strong\\\"],[12],[1,[30,2,[\\\"talkgroup_description\\\"]]],[13],[13],[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"showPlayer\\\"]],[[[41,[30,0,[\\\"useMediaPlayerComponent\\\"]],[[[1,\\\"                \\\"],[8,[39,29],null,[[\\\"@src\\\",\\\"@type\\\",\\\"@idSuffix\\\",\\\"@hideZoom\\\",\\\"@autoplay\\\"],[[29,[[30,2,[\\\"raw_audio_url\\\"]]]],\\\"audio/mpeg\\\",[29,[\\\"-\\\",[30,2,[\\\"id\\\"]]]],\\\"true\\\",\\\"true\\\"]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"audio\\\"],[15,1,[29,[\\\"call-audio-\\\",[30,2,[\\\"id\\\"]]]]],[14,0,\\\"call-audio\\\"],[15,\\\"src\\\",[29,[[30,2,[\\\"raw_audio_url\\\"]]]]],[14,\\\"controls\\\",\\\"\\\"],[14,\\\"autoplay\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[10,3],[15,6,[29,[[30,2,[\\\"raw_audio_url\\\"]]]]],[14,0,\\\"btn btn-sm btn-primary mt-2\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"download\\\"]],null],[1,\\\" Download Audio\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"col\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"h4\\\"],[14,0,\\\"fs-6\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-sm btn-success\\\"],[24,4,\\\"button\\\"],[4,[38,9],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"playAudio\\\"]],[30,2]],null]],null],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"play\\\"]],null],[10,1],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"Play Audio\\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[30,2,[\\\"id\\\"]],[30,0,[\\\"selectedHit\\\"]]],null],[[[1,\\\"                \\\"],[11,3],[24,0,\\\"btn btn-sm btn-warning\\\"],[16,6,[29,[[30,2,[\\\"contextUrl\\\"]]]]],[4,[38,9],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"getContext\\\"]],[30,2]],null]],null],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"star\\\"]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[11,3],[24,0,\\\"btn btn-sm btn-primary\\\"],[16,6,[29,[[30,2,[\\\"contextUrl\\\"]]]]],[4,[38,9],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"getContext\\\"]],[30,2]],null]],null],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"filter\\\"]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-sm btn-info d-md-none\\\"],[14,\\\"data-bs-toggle\\\",\\\"collapse\\\"],[15,\\\"data-bs-target\\\",[29,[\\\"#hit-\\\",[30,2,[\\\"id\\\"]],\\\"-metadata-col\\\"]]],[14,\\\"aria-expanded\\\",\\\"false\\\"],[15,\\\"aria-controls\\\",[29,[\\\"hit-\\\",[30,2,[\\\"id\\\"]],\\\"-metadata-col\\\"]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"circle-info\\\"]],null],[10,1],[14,0,\\\"visually-hidden\\\"],[12],[1,\\\"More Details\\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[1,[30,2,[\\\"talkgroup_tag\\\"]]],[1,\\\"\\\\n                \\\"],[10,1],[15,0,[29,[\\\"badge text-bg-\\\",[30,2,[\\\"talkgroup_group_tag_color\\\"]],\\\" ms-1 me-1\\\"]]],[12],[1,\\\"\\\\n                  \\\"],[1,[30,2,[\\\"talkgroup_group_tag\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"onTranscriptMapPage\\\"]],[[[1,\\\"              \\\"],[10,2],[12],[10,1],[14,0,\\\"badge text-bg-light fs-6\\\"],[12],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"location-dot\\\"]],null],[1,\\\" \\\"],[1,[30,2,[\\\"geo_formatted_address\\\"]]],[13],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"              \\\"],[10,2],[14,0,\\\"text-small d-md-none\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"strong\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,3],[15,6,[29,[[30,2,[\\\"permalink\\\"]]]]],[12],[1,[30,2,[\\\"start_time_string\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[1,[30,2,[\\\"time_warning\\\"]]],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"fst-italic fs-7\\\"],[12],[1,\\\"(\\\"],[1,[30,2,[\\\"relative_time\\\"]]],[1,\\\")\\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"blockquote\\\"],[14,0,\\\"blockquote\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,20],[[28,[37,20],[[30,2,[\\\"raw_transcript\\\"]]],null]],null],null,[[[1,\\\"                  \\\"],[10,2],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,33],[[30,3],\\\"0\\\"],null],[[[1,\\\"                    \\\"],[11,3],[16,6,[29,[[28,[37,33],[[30,3],\\\"0.filter_link\\\"],null]]]],[16,\\\"title\\\",[29,[\\\"Radio ID \\\",[28,[37,33],[[30,3],\\\"0.src\\\"],null]]]],[4,[38,9],[\\\"click\\\",[28,[37,17],[[30,0,[\\\"filterSrc\\\"]],[28,[37,33],[[30,3],\\\"0\\\"],null],[30,2]],null]],null],[12],[2,[28,[37,33],[[30,3],\\\"0.label\\\"],null]],[13],[41,[28,[37,33],[[30,3],\\\"0.address\\\"],null],[[[1,\\\" \\\"],[10,3],[14,6,\\\"javascript:;\\\"],[14,\\\"data-bs-toggle\\\",\\\"tooltip\\\"],[15,\\\"data-bs-title\\\",[29,[[28,[37,33],[[30,3],\\\"0.address\\\"],null]]]],[12],[8,[39,7],null,[[\\\"@icon\\\"],[\\\"map-marker-alt\\\"]],null],[13]],[]],null],[1,\\\":\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[2,[28,[37,33],[[30,3],\\\"1\\\"],null]],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[30,0,[\\\"session\\\",\\\"user\\\",\\\"id\\\"]],1],null],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"modal fade metadata-modal\\\"],[15,1,[29,[\\\"metadata-\\\",[30,2,[\\\"id\\\"]]]]],[14,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"aria-labelledby\\\",[29,[\\\"metadata-modal-heading-\\\",[30,2,[\\\"id\\\"]]]]],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"modal-dialog modal-xl\\\"],[14,\\\"role\\\",\\\"document\\\"],[12],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"modal-content\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"modal-header\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"h5\\\"],[14,0,\\\"modal-title\\\"],[15,1,[29,[\\\"metadata-modal-heading-\\\",[30,2,[\\\"id\\\"]]]]],[12],[1,\\\"Raw Result Data\\\"],[13],[1,\\\"\\\\n                  \\\"],[10,\\\"button\\\"],[14,0,\\\"btn-close\\\"],[14,\\\"data-bs-dismiss\\\",\\\"modal\\\"],[14,\\\"aria-label\\\",\\\"Close\\\"],[14,4,\\\"button\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"modal-body\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"pre\\\"],[12],[1,[30,2,[\\\"json\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,1,\\\"pagination\\\"],[14,0,\\\"mt-3\\\"],[12],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"search\\\",\\\"hit\\\",\\\"segment\\\"],false,[\\\"h1\\\",\\\"div\\\",\\\"if\\\",\\\"eq\\\",\\\"h2\\\",\\\"button\\\",\\\"span\\\",\\\"fa-icon\\\",\\\"link-to\\\",\\\"on\\\",\\\"p\\\",\\\"did-insert\\\",\\\"and\\\",\\\"not\\\",\\\"a\\\",\\\"img\\\",\\\"unless\\\",\\\"fn\\\",\\\"h3\\\",\\\"each\\\",\\\"-track-array\\\",\\\"ul\\\",\\\"li\\\",\\\"label\\\",\\\"ember-flatpickr\\\",\\\"input\\\",\\\"h5\\\",\\\"ol\\\",\\\"strong\\\",\\\"media-player\\\",\\\"audio\\\",\\\"h4\\\",\\\"blockquote\\\",\\\"get\\\",\\\"pre\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/transcript-search.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/components/virtual-scanner\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h3>Live streaming from CrimeIsDown</h3>\n  <Alert @key=\"bcfy-enc-disclaimer\" @type=\"info\">\n    <img class=\"bcfy-favicon\" src=\"https://s.broadcastify.com/icons/favicon-96x96.png\" title=\"Audio provided by Broadcastify.com\" alt=\"Broadcastify.com\" /> streams are provided by Broadcastify.com, for encrypted radio channels (marked with [ENC]). Radio traffic is delayed 30-35 minutes. CrimeIsDown.com has no control over these streams and is not affiliated with Broadcastify.\n  </Alert>\n  <div class=\"row\">\n    <div class=\"col-md-6\">\n      <div class=\"form-group\">\n        <fieldset {{on \"change\" this.changeStreams}} id=\"streamlist\">\n          <legend>Check the streams to play</legend>\n          <div class=\"stream-options mb-3\">\n          {{#if this.streams.length}}\n            {{#each this.streams as |streamOption|}}\n              <div class=\"form-check\">\n                <input class=\"form-check-input\" id=\"checkbox-{{streamOption.name}}\" type=\"checkbox\" name=\"stream\" value={{streamOption.name}} disabled={{if streamOption.disabled \"disabled\" \"\"}}>\n                <label class=\"form-check-label\" for=\"checkbox-{{streamOption.name}}\">{{streamOption.desc}}</label>\n                <LinkTo @route=\"audio-live\" @model={{streamOption.name}} target=\"_blank\" title={{concat \"Listen to only \" streamOption.desc}}><FaIcon @icon=\"external-link\" /></LinkTo>\n                {{#if streamOption.broadcastify}}\n                <a href=\"{{ streamOption.broadcastifyUrl }}\" target=\"_blank\" rel=\"noopener noreferrer\"><img class=\"bcfy-favicon\" src=\"https://s.broadcastify.com/icons/favicon-96x96.png\" title=\"Audio provided by Broadcastify.com\" alt=\"Broadcastify.com\" /></a>\n                {{/if}}\n              </div>\n            {{/each}}\n          {{else}}\n            <p class=\"text-danger\">Sorry, all streams are currently offline due to technical difficulties. Please try again later.</p>\n          {{/if}}\n          </div>\n        </fieldset>\n      </div>\n    </div>\n    <div class=\"col-md-6\">\n      <h4>Spatial Scanner Audio</h4>\n      <p>Drag <FaIcon @icon=\"volume-up\" /> to move stereo channels, put on <FaIcon @icon=\"headphones\" /> for surround sound</p>\n      <div class=\"draggable-parent\" {{did-insert this.setupDraggable}}>\n        <FaIcon @icon=\"user\" />\n        {{#each this.enabledStreams as |stream|}}\n          {{!-- template-lint-disable no-inline-styles --}}\n          <div id=\"drag-{{stream.name}}\" title=\"{{stream.desc}}\" class=\"draggable\" style=\"color: rgb(0, 0, 0);\"><FaIcon @icon=\"volume-high\" />{{stream.name}}</div>\n        {{/each}}\n      </div>\n    </div>\n    <div class=\"col-md-12\">\n      <div class=\"row\">\n        {{#each this.enabledStreams as |stream|}}\n        <div class=\"stream col-sm-6\" id=\"stream-{{stream.name}}\">\n          <p class=\"title\">\n            <LinkTo @route=\"audio-live\" @model={{stream.name}} title={{concat \"Listen to only \" stream.desc}}>\n              {{stream.desc}}\n            </LinkTo>\n            {{#if stream.broadcastify}}\n            <a href=\"{{ stream.broadcastifyUrl }}\" target=\"_blank\" rel=\"noopener noreferrer\"><img class=\"bcfy-favicon\" src=\"https://s.broadcastify.com/icons/favicon-96x96.png\" title=\"Audio provided by Broadcastify.com\" alt=\"Broadcastify.com\" /></a>\n            {{/if}}\n          </p>\n          <audio id=\"audio-player-{{stream.name}}\" class=\"stream-player\" preload=\"none\" crossorigin=\"anonymous\" {{did-insert (fn this.startStream stream.name)}}></audio>\n        </div>\n        {{/each}}\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"WA104c7s\",\n    \"block\": \"[[[10,\\\"h3\\\"],[12],[1,\\\"Live streaming from CrimeIsDown\\\"],[13],[1,\\\"\\\\n\\\"],[8,[39,1],null,[[\\\"@key\\\",\\\"@type\\\"],[\\\"bcfy-enc-disclaimer\\\",\\\"info\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[10,\\\"img\\\"],[14,0,\\\"bcfy-favicon\\\"],[14,\\\"src\\\",\\\"https://s.broadcastify.com/icons/favicon-96x96.png\\\"],[14,\\\"title\\\",\\\"Audio provided by Broadcastify.com\\\"],[14,\\\"alt\\\",\\\"Broadcastify.com\\\"],[12],[13],[1,\\\" streams are provided by Broadcastify.com, for encrypted radio channels (marked with [ENC]). Radio traffic is delayed 30-35 minutes. CrimeIsDown.com has no control over these streams and is not affiliated with Broadcastify.\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"fieldset\\\"],[24,1,\\\"streamlist\\\"],[4,[38,5],[\\\"change\\\",[30,0,[\\\"changeStreams\\\"]]],null],[12],[1,\\\"\\\\n        \\\"],[10,\\\"legend\\\"],[12],[1,\\\"Check the streams to play\\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"stream-options mb-3\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"streams\\\",\\\"length\\\"]],[[[42,[28,[37,9],[[28,[37,9],[[30,0,[\\\"streams\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[10,0],[14,0,\\\"form-check\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[15,1,[29,[\\\"checkbox-\\\",[30,1,[\\\"name\\\"]]]]],[14,3,\\\"stream\\\"],[15,2,[30,1,[\\\"name\\\"]]],[15,\\\"disabled\\\",[52,[30,1,[\\\"disabled\\\"]],\\\"disabled\\\",\\\"\\\"]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n              \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[15,\\\"for\\\",[29,[\\\"checkbox-\\\",[30,1,[\\\"name\\\"]]]]],[12],[1,[30,1,[\\\"desc\\\"]]],[13],[1,\\\"\\\\n              \\\"],[8,[39,12],[[24,\\\"target\\\",\\\"_blank\\\"],[16,\\\"title\\\",[28,[37,13],[\\\"Listen to only \\\",[30,1,[\\\"desc\\\"]]],null]]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"audio-live\\\",[30,1,[\\\"name\\\"]]]],[[\\\"default\\\"],[[[[8,[39,14],null,[[\\\"@icon\\\"],[\\\"external-link\\\"]],null]],[]]]]],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"broadcastify\\\"]],[[[1,\\\"              \\\"],[10,3],[15,6,[29,[[30,1,[\\\"broadcastifyUrl\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[10,\\\"img\\\"],[14,0,\\\"bcfy-favicon\\\"],[14,\\\"src\\\",\\\"https://s.broadcastify.com/icons/favicon-96x96.png\\\"],[14,\\\"title\\\",\\\"Audio provided by Broadcastify.com\\\"],[14,\\\"alt\\\",\\\"Broadcastify.com\\\"],[12],[13],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null]],[]],[[[1,\\\"          \\\"],[10,2],[14,0,\\\"text-danger\\\"],[12],[1,\\\"Sorry, all streams are currently offline due to technical difficulties. Please try again later.\\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Spatial Scanner Audio\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Drag \\\"],[8,[39,14],null,[[\\\"@icon\\\"],[\\\"volume-up\\\"]],null],[1,\\\" to move stereo channels, put on \\\"],[8,[39,14],null,[[\\\"@icon\\\"],[\\\"headphones\\\"]],null],[1,\\\" for surround sound\\\"],[13],[1,\\\"\\\\n    \\\"],[11,0],[24,0,\\\"draggable-parent\\\"],[4,[38,18],[[30,0,[\\\"setupDraggable\\\"]]],null],[12],[1,\\\"\\\\n      \\\"],[8,[39,14],null,[[\\\"@icon\\\"],[\\\"user\\\"]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[30,0,[\\\"enabledStreams\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[10,0],[15,1,[29,[\\\"drag-\\\",[30,2,[\\\"name\\\"]]]]],[15,\\\"title\\\",[29,[[30,2,[\\\"desc\\\"]]]]],[14,0,\\\"draggable\\\"],[14,5,\\\"color: rgb(0, 0, 0);\\\"],[12],[8,[39,14],null,[[\\\"@icon\\\"],[\\\"volume-high\\\"]],null],[1,[30,2,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"col-md-12\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[30,0,[\\\"enabledStreams\\\"]]],null]],null],null,[[[1,\\\"      \\\"],[10,0],[14,0,\\\"stream col-sm-6\\\"],[15,1,[29,[\\\"stream-\\\",[30,3,[\\\"name\\\"]]]]],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[39,12],[[16,\\\"title\\\",[28,[37,13],[\\\"Listen to only \\\",[30,3,[\\\"desc\\\"]]],null]]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"audio-live\\\",[30,3,[\\\"name\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[1,[30,3,[\\\"desc\\\"]]],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n\\\"],[41,[30,3,[\\\"broadcastify\\\"]],[[[1,\\\"          \\\"],[10,3],[15,6,[29,[[30,3,[\\\"broadcastifyUrl\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[10,\\\"img\\\"],[14,0,\\\"bcfy-favicon\\\"],[14,\\\"src\\\",\\\"https://s.broadcastify.com/icons/favicon-96x96.png\\\"],[14,\\\"title\\\",\\\"Audio provided by Broadcastify.com\\\"],[14,\\\"alt\\\",\\\"Broadcastify.com\\\"],[12],[13],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[11,\\\"audio\\\"],[16,1,[29,[\\\"audio-player-\\\",[30,3,[\\\"name\\\"]]]]],[24,0,\\\"stream-player\\\"],[24,\\\"preload\\\",\\\"none\\\"],[24,\\\"crossorigin\\\",\\\"anonymous\\\"],[4,[38,18],[[28,[37,20],[[30,0,[\\\"startStream\\\"]],[30,3,[\\\"name\\\"]]],null]],null],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"streamOption\\\",\\\"stream\\\",\\\"stream\\\"],false,[\\\"h3\\\",\\\"alert\\\",\\\"img\\\",\\\"div\\\",\\\"fieldset\\\",\\\"on\\\",\\\"legend\\\",\\\"if\\\",\\\"each\\\",\\\"-track-array\\\",\\\"input\\\",\\\"label\\\",\\\"link-to\\\",\\\"concat\\\",\\\"fa-icon\\\",\\\"a\\\",\\\"p\\\",\\\"h4\\\",\\\"did-insert\\\",\\\"audio\\\",\\\"fn\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/components/virtual-scanner.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/directives\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Police Directive Changes\"}}\n  <div class=\"container-fluid\">\n    <div class=\"row\">\n      <DirectivesList />\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"VaMHz7MN\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Police Directive Changes\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container-fluid\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"directives-list\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/directives.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/guide\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Scanner Guide\"}}\n  <div class=\"container\">\n    <div class=\"row\">\n      <div class=\"col-sm-12 col-md-6\">\n        <SearchRadioids />\n        <h4>Relevant links</h4>\n        <ul>\n          <li><a href=\"http://www.chicagofiremap.net/p/ems.html\">EMS Triage Codes (Green/Yellow/Red/Black)</a></li>\n          <li><a href=\"http://chicagoareafire.com/blog/wp-content/uploads/2016/05/Battalion-Map.pdf\">CFD Fire Districts/Battalions map</a></li>\n          <li><a href=\"http://chicagoareafire.com/blog/wp-content/uploads/2016/05/Field-Chief-Map.pdf\">CFD EMS Districts map</a></li>\n          <li><a href=\"https://en.wikipedia.org/wiki/Chicago_Fire_Department#Alarm_assignments\">CFD Response Types</a> (<a href=\"https://news.wttw.com/sites/default/files/article/file-attachments/C.F.D._STRUCTURE_FIRE_ASSIGNMENTS_.pdf\">additional info, may be outdated</a>)</li>\n        </ul>\n      </div>\n      <div class=\"col-sm-12 col-md-6\">\n        <SearchUcrcodes />\n      </div>\n    </div>\n  \n    <div class=\"row\">\n      <div class=\"col-sm-12\">\n        <h2>Scanner Guide</h2>\n        <iframe id=\"scanner-guide\" title=\"Scanner guide viewer\" src=\"https://docs.google.com/document/d/e/2PACX-1vQ07P-9ZP8VoohZCQQlmjahhbmgMZ33z5PGeOkckPbG4KOzxWg9CIkGK2cxEzb3ql3ZfFKt7fSSkO6m/pub?embedded=true\"></iframe>\n        <p>Or <a href=\"https://docs.google.com/document/d/1J09YjR3XaQqu1gIu1Oyz1lpRjr73NThK_fGb8D3wmsU/edit?usp=sharing\">view on Google Docs</a></p>\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"+hDoWu07\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Scanner Guide\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm-12 col-md-6\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n      \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Relevant links\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.chicagofiremap.net/p/ems.html\\\"],[12],[1,\\\"EMS Triage Codes (Green/Yellow/Red/Black)\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://chicagoareafire.com/blog/wp-content/uploads/2016/05/Battalion-Map.pdf\\\"],[12],[1,\\\"CFD Fire Districts/Battalions map\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://chicagoareafire.com/blog/wp-content/uploads/2016/05/Field-Chief-Map.pdf\\\"],[12],[1,\\\"CFD EMS Districts map\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"https://en.wikipedia.org/wiki/Chicago_Fire_Department#Alarm_assignments\\\"],[12],[1,\\\"CFD Response Types\\\"],[13],[1,\\\" (\\\"],[10,3],[14,6,\\\"https://news.wttw.com/sites/default/files/article/file-attachments/C.F.D._STRUCTURE_FIRE_ASSIGNMENTS_.pdf\\\"],[12],[1,\\\"additional info, may be outdated\\\"],[13],[1,\\\")\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm-12 col-md-6\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,7],null,null,null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-sm-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[12],[1,\\\"Scanner Guide\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"iframe\\\"],[14,1,\\\"scanner-guide\\\"],[14,\\\"title\\\",\\\"Scanner guide viewer\\\"],[14,\\\"src\\\",\\\"https://docs.google.com/document/d/e/2PACX-1vQ07P-9ZP8VoohZCQQlmjahhbmgMZ33z5PGeOkckPbG4KOzxWg9CIkGK2cxEzb3ql3ZfFKt7fSSkO6m/pub?embedded=true\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Or \\\"],[10,3],[14,6,\\\"https://docs.google.com/document/d/1J09YjR3XaQqu1gIu1Oyz1lpRjr73NThK_fGb8D3wmsU/edit?usp=sharing\\\"],[12],[1,\\\"view on Google Docs\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"search-radioids\\\",\\\"h4\\\",\\\"ul\\\",\\\"li\\\",\\\"a\\\",\\\"search-ucrcodes\\\",\\\"h2\\\",\\\"iframe\\\",\\\"p\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/guide.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"container\">\n    <h1 id=\"title\">Welcome to CrimeIsDown.com!</h1>\n    <div class=\"row\">\n      <div class=\"col-md-12\">\n        <h2>Our Tools</h2>\n        <p>We offer various tools to help monitor crime in Chicago. Check out some of them below, or read on to learn more about the site.</p>\n      </div>\n      <div class=\"col-md-3 col-sm-6\">\n        <LinkTo @route=\"map\"><h3 class=\"fs-4\">Chicago Map</h3></LinkTo>\n        <figure class=\"figure\">\n          <LinkTo @route=\"map\"><img src=\"/img/incident_map.png\" alt=\"Chicago map page screenshot\" class=\"img-fluid figure-img\"></LinkTo>\n          <figcaption class=\"figure-caption\"><span class=\"badge text-bg-primary me-1\">Free</span> Search for an address and listen to the scanner feed for that area</figcaption>\n        </figure>\n      </div>\n      <div class=\"col-md-3 col-sm-6\">\n        <LinkTo @route=\"audio\"><h3 class=\"fs-4\">Scanner Audio</h3></LinkTo>\n        <figure class=\"figure\">\n          <LinkTo @route=\"audio\"><img src=\"/img/scanner_audio.png\" alt=\"Scanner audio page screenshot\" class=\"img-fluid figure-img\"></LinkTo>\n          <figcaption class=\"figure-caption\"><span class=\"badge text-bg-primary me-1\">Free</span> Listen to live police/fire radio traffic and access recordings from all CPD radio channels</figcaption>\n        </figure>\n      </div>\n      <div class=\"col-md-3 col-sm-6\">\n        <LinkTo @route=\"search-transcripts\"><h3 class=\"fs-4\">Scanner Transcripts</h3></LinkTo>\n        <figure class=\"figure\">\n          <LinkTo @route=\"search-transcripts\"><img src=\"/img/transcript_search.png\" alt=\"Transcript search page screenshot\" class=\"img-fluid figure-img\"></LinkTo>\n          <figcaption class=\"figure-caption\"><span class=\"badge text-bg-secondary me-1\">Paid</span> Search thru transcripts of radio traffic to quickly find what happened (Patrons only)</figcaption>\n        </figure>\n      </div>\n      <div class=\"col-md-3 col-sm-6\">\n        <LinkTo @route=\"guide\"><h3 class=\"fs-4\">Scanner Guide</h3></LinkTo>\n        <figure class=\"figure\">\n          <LinkTo @route=\"guide\"><img src=\"/img/scanner_guide.png\" alt=\"Scanner guide page screenshot\" class=\"img-fluid figure-img\"></LinkTo>\n          <figcaption class=\"figure-caption\"><span class=\"badge text-bg-primary me-1\">Free</span> Learn the lingo of #ChicagoScanner on our comprehensive scanner guide</figcaption>\n        </figure>\n      </div>\n    </div>\n    <div class=\"row\" id=\"about\">\n      <div class=\"col-md-12\">\n        <h2 id=\"about-crimeisdown\">About CrimeIsDown.com</h2>\n      </div>\n      <div class=\"col-md-12\">\n        <section>\n          <h3>Our Mission</h3>\n          <p>The purpose of CrimeIsDown.com is to provide police scanner listeners in the Chicago area an easy way to lookup information quickly pertaining to what they hear. Journalists use the site to quickly know what neighborhood and police district an incident is happening in. Scanner enthusiasts use the site to find out what radio zone they should listen to. Average citizens use the site to find out what crime is happening around them and to tune in live.</p>\n          <p>We hope to let people decide for themselves whether or not crime is down, based on independent statistics and listening to breaking news.</p>\n          <h3>Why the name &ldquo;CrimeIsDown&rdquo;?</h3>\n          <p>The name CrimeIsDown comes from a hashtag of the same name that was popular starting in 2013 among those in the #ChicagoScanner community. City leadership often said how crime was down, but that seemed to conflict with the number of shootings. In 2014, <a href=\"https://www.chicagomag.com/Chicago-Magazine/May-2014/Chicago-crime-rates/\" target=\"_blank\" rel=\"noopener noreferrer\">Chicago Magazine had published a story</a> about how Chicago Police was reclassifying crimes to make crime stats appear lower than they really were. The hashtag #CrimeIsDown is used in a sarcastic fashion to challenge the narrative that crime is/was down. On CrimeIsDown.com, someone can listen to police radio themselves and come up with their own conclusions.</p>\n        </section>\n        <section>\n          <h3>Why Should You Care About Crime In Chicago?</h3>\n          <p>\n            We could explain why but there are much better writers out there. Read a piece from the Chicago Tribune entitled <a href=\"http://www.chicagotribune.com/news/opinion/plan/ct-edit-xproject4a-crime-1027-20131027-story.html\">\"Curb Crime, Save Chicago\"</a> as part of their \"New Plan of Chicago\" series.\n          </p>\n          <h4>Organizations Making a Difference</h4>\n          <p>\n            Check out the organizations below and donate, volunteer, or find other ways to support these organizations. These organizations are being a part of the solution to Chicago's massive [violent] crime problem - join them and accelerate that change. There are many more like these out there - let us know if you want your organization added to this list.\n          </p>\n          <div class=\"row\">\n            <div class=\"col-md-6\">\n              <ul>\n                <li><a href=\"http://cureviolence.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Cure Violence</a></li>\n                <li><a href=\"http://www.change4childreninc.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Change 4 Children Inc</a></li>\n                <li><a href=\"http://www.chicagoscitizensforchange.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Chicago Citizens for Change</a></li>\n                <li><a href=\"http://embarcchicago.org/\" target=\"_blank\" rel=\"noopener noreferrer\">EMBARC</a></li>\n                <li><a href=\"http://fmsupreme.com/\" target=\"_blank\" rel=\"noopener noreferrer\">FM Supreme</a></li>\n                <li><a href=\"http://www.igniteone.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Ignite One</a></li>\n              </ul>\n            </div>\n            <div class=\"col-md-6\">\n              <ul>\n                <li><a href=\"http://moran-center.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Moran Center for Youth Advocacy</a></li>\n                <li><a href=\"http://thekleocenter.org/\" target=\"_blank\" rel=\"noopener noreferrer\">The K.L.E.O. Center</a></li>\n                <li><a href=\"http://ragenglewood.org/\" target=\"_blank\" rel=\"noopener noreferrer\">R.A.G.E.</a></li>\n                <li><a href=\"http://www.scy-chicago.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Strengthening Chicago's Youth</a></li>\n                <li><a href=\"http://youngchicagoauthors.org/blog/\" target=\"_blank\" rel=\"noopener noreferrer\">Young Chicago Authors</a></li>\n                <li>And many more!</li>\n              </ul>\n            </div>\n          </div>\n        </section>\n        <section>\n          <h3>Thank You</h3>\n          <p>\n            Mapping data comes from the <a href=\"https://data.cityofchicago.org/\">City of Chicago Data Portal</a> and other generous sources which prefer not to be named.\n          </p>\n          <p>\n            We make use of a variety of sources for the information used on the radio ID, online streams, and map pages. The sources are as follows:\n          </p>\n          <ul>\n            <li><a href=\"http://www.carmachicago.com/\">CARMA Chicago</a></li>\n            <li><a href=\"http://www.radioreference.com/\">RadioReference Databases</a></li>\n            <li><a href=\"http://www.broadcastify.com/\">Broadcastify.com</a></li>\n          </ul>\n          <p>\n            Social media updates come from a variety of hardworking folks, some crime/breaking news reporters and photographers, some news editors, but most importantly hobbyists who listen to the scanners in their free time. Check out some of their Twitter profiles and follow them.\n          </p>\n          <p>\n            <a href=\"https://twitter.com/i/lists/97978215\">View the #CrimeIsDown list on Twitter</a>\n          </p>\n        </section>\n        <section>\n          <h3 id=\"contact-us\">Contact Us</h3>\n          <p>\n            <a href=\"https://twitter.com/CrimeIsDown\">Follow @CrimeIsDown on Twitter</a> to get crime news and updates from CrimeIsDown.com.\n          </p>\n          <p>\n            Contact <a href=\"https://twitter.com/EricTendian\">Eric Tendian</a> (eric [at] crimeisdown.com) for support with the website and other inquiries. Please consider\n            clicking the Donate button at the bottom of the page and donating a small sum of money to keep the site up and running.\n          </p>\n          <h3>Support Us</h3>\n          <p>The best way to support us is thru Patreon, where you can get exclusive features for becoming a patron. PayPal donations are also accepted, any donation amount is appreciated! We use the money to pay for web hosting, scanners used for live streaming, and other activities to continue adding features. Those who donate may get to try out exclusive features of the site and get access to all our scanner recordings.</p>\n          <ul>\n            <li><a href=\"https://www.patreon.com/EricTendian\" target=\"_blank\" rel=\"noopener noreferrer\">Become a Patron on Patreon</a></li>\n            <li><a href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4SHEMCHJPV8KY&lc=US&item_name=CrimeIsDown%2ecom&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted\" target=\"_blank\" rel=\"noopener noreferrer\">Send us a donation via PayPal</a></li>\n          </ul>\n        </section>\n      </div>\n    </div>\n  \n    <div class=\"row\">\n      <div class=\"col-md-12\">\n        <h2>So is crime really down?</h2>\n        <h3>Find out for yourself:</h3>\n      </div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-md-4\">\n        <a class=\"twitter-timeline\" data-height=\"500\" href=\"https://twitter.com/EricTendian/lists/crimeisdown?ref_src=twsrc%5Etfw\">Tweets from twitter.com/EricTendian/lists/CrimeIsDown</a>\n        {{!-- template-lint-disable no-forbidden-elements --}}\n        <script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n      </div>\n      <div class=\"col-md-4\">\n        <h4><a href=\"https://cwbchicago.com/\">CWBChicago</a></h4>\n        <p>Unlike major news media, CWBChicago is exclusively focused on Chicago crime and tells the story of crimes from start to finish. Many larger media outlets often pick up news that was originally reported by CWBChicago. Many of our followers use them as their go-to source for crime news in their neighborhoods, and CWB is a big supporter and user of CrimeIsDown.com.</p>\n        <h4><a href=\"http://heyjackass.com/\" target=\"_blank\" rel=\"noopener noreferrer\">HeyJackass.com</a> Crime Stats</h4>\n        <p>These are very reliable (but unofficial) crime stats, gathered from scanner reports as well as media. The publisher has zero affiliation with CPD.</p>\n      </div>\n      <div class=\"col-md-4\">\n        <h4>Chicago Media</h4>\n        <p>Various links from Chicago-area media covering crime in the city:</p>\n        <ul>\n  \n          <li><a href=\"https://chicago.suntimes.com/crime\">Chicago Sun-Times Crime News</a></li>\n          <li><a href=\"https://blockclubchicago.org/tag/crime/\">Block Club Chicago Crime News</a></li>\n          <li><a href=\"https://www.chicagotribune.com/news/breaking/\">Chicago Tribune Breaking News</a></li>\n          <li><a href=\"http://graphics.chicagotribune.com/under-the-gun/2014/\">Chicago Under The Gun - Chicago Tribune</a></li>\n          <li><a href=\"http://www.chicagomag.com/Chicago-Magazine/May-2014/Chicago-crime-rates/\">The Truth About Chicago’s Crime Rates</a> (also check out subsequent articles)</li>\n        </ul>\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"8bzV14hM\",\n    \"block\": \"[[[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h1\\\"],[14,1,\\\"title\\\"],[12],[1,\\\"Welcome to CrimeIsDown.com!\\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[12],[1,\\\"Our Tools\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"We offer various tools to help monitor crime in Chicago. Check out some of them below, or read on to learn more about the site.\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-3 col-sm-6\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"map\\\"]],[[\\\"default\\\"],[[[[10,\\\"h3\\\"],[14,0,\\\"fs-4\\\"],[12],[1,\\\"Chicago Map\\\"],[13]],[]]]]],[1,\\\"\\\\n      \\\"],[10,\\\"figure\\\"],[14,0,\\\"figure\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"map\\\"]],[[\\\"default\\\"],[[[[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/img/incident_map.png\\\"],[14,\\\"alt\\\",\\\"Chicago map page screenshot\\\"],[14,0,\\\"img-fluid figure-img\\\"],[12],[13]],[]]]]],[1,\\\"\\\\n        \\\"],[10,\\\"figcaption\\\"],[14,0,\\\"figure-caption\\\"],[12],[10,1],[14,0,\\\"badge text-bg-primary me-1\\\"],[12],[1,\\\"Free\\\"],[13],[1,\\\" Search for an address and listen to the scanner feed for that area\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-3 col-sm-6\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"audio\\\"]],[[\\\"default\\\"],[[[[10,\\\"h3\\\"],[14,0,\\\"fs-4\\\"],[12],[1,\\\"Scanner Audio\\\"],[13]],[]]]]],[1,\\\"\\\\n      \\\"],[10,\\\"figure\\\"],[14,0,\\\"figure\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"audio\\\"]],[[\\\"default\\\"],[[[[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/img/scanner_audio.png\\\"],[14,\\\"alt\\\",\\\"Scanner audio page screenshot\\\"],[14,0,\\\"img-fluid figure-img\\\"],[12],[13]],[]]]]],[1,\\\"\\\\n        \\\"],[10,\\\"figcaption\\\"],[14,0,\\\"figure-caption\\\"],[12],[10,1],[14,0,\\\"badge text-bg-primary me-1\\\"],[12],[1,\\\"Free\\\"],[13],[1,\\\" Listen to live police/fire radio traffic and access recordings from all CPD radio channels\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-3 col-sm-6\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"search-transcripts\\\"]],[[\\\"default\\\"],[[[[10,\\\"h3\\\"],[14,0,\\\"fs-4\\\"],[12],[1,\\\"Scanner Transcripts\\\"],[13]],[]]]]],[1,\\\"\\\\n      \\\"],[10,\\\"figure\\\"],[14,0,\\\"figure\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"search-transcripts\\\"]],[[\\\"default\\\"],[[[[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/img/transcript_search.png\\\"],[14,\\\"alt\\\",\\\"Transcript search page screenshot\\\"],[14,0,\\\"img-fluid figure-img\\\"],[12],[13]],[]]]]],[1,\\\"\\\\n        \\\"],[10,\\\"figcaption\\\"],[14,0,\\\"figure-caption\\\"],[12],[10,1],[14,0,\\\"badge text-bg-secondary me-1\\\"],[12],[1,\\\"Paid\\\"],[13],[1,\\\" Search thru transcripts of radio traffic to quickly find what happened (Patrons only)\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-3 col-sm-6\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"guide\\\"]],[[\\\"default\\\"],[[[[10,\\\"h3\\\"],[14,0,\\\"fs-4\\\"],[12],[1,\\\"Scanner Guide\\\"],[13]],[]]]]],[1,\\\"\\\\n      \\\"],[10,\\\"figure\\\"],[14,0,\\\"figure\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,4],null,[[\\\"@route\\\"],[\\\"guide\\\"]],[[\\\"default\\\"],[[[[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/img/scanner_guide.png\\\"],[14,\\\"alt\\\",\\\"Scanner guide page screenshot\\\"],[14,0,\\\"img-fluid figure-img\\\"],[12],[13]],[]]]]],[1,\\\"\\\\n        \\\"],[10,\\\"figcaption\\\"],[14,0,\\\"figure-caption\\\"],[12],[10,1],[14,0,\\\"badge text-bg-primary me-1\\\"],[12],[1,\\\"Free\\\"],[13],[1,\\\" Learn the lingo of #ChicagoScanner on our comprehensive scanner guide\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[14,1,\\\"about\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"about-crimeisdown\\\"],[12],[1,\\\"About CrimeIsDown.com\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"section\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,\\\"Our Mission\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"The purpose of CrimeIsDown.com is to provide police scanner listeners in the Chicago area an easy way to lookup information quickly pertaining to what they hear. Journalists use the site to quickly know what neighborhood and police district an incident is happening in. Scanner enthusiasts use the site to find out what radio zone they should listen to. Average citizens use the site to find out what crime is happening around them and to tune in live.\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"We hope to let people decide for themselves whether or not crime is down, based on independent statistics and listening to breaking news.\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,\\\"Why the name “CrimeIsDown”?\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"The name CrimeIsDown comes from a hashtag of the same name that was popular starting in 2013 among those in the #ChicagoScanner community. City leadership often said how crime was down, but that seemed to conflict with the number of shootings. In 2014, \\\"],[10,3],[14,6,\\\"https://www.chicagomag.com/Chicago-Magazine/May-2014/Chicago-crime-rates/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Chicago Magazine had published a story\\\"],[13],[1,\\\" about how Chicago Police was reclassifying crimes to make crime stats appear lower than they really were. The hashtag #CrimeIsDown is used in a sarcastic fashion to challenge the narrative that crime is/was down. On CrimeIsDown.com, someone can listen to police radio themselves and come up with their own conclusions.\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"section\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,\\\"Why Should You Care About Crime In Chicago?\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          We could explain why but there are much better writers out there. Read a piece from the Chicago Tribune entitled \\\"],[10,3],[14,6,\\\"http://www.chicagotribune.com/news/opinion/plan/ct-edit-xproject4a-crime-1027-20131027-story.html\\\"],[12],[1,\\\"\\\\\\\"Curb Crime, Save Chicago\\\\\\\"\\\"],[13],[1,\\\" as part of their \\\\\\\"New Plan of Chicago\\\\\\\" series.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Organizations Making a Difference\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          Check out the organizations below and donate, volunteer, or find other ways to support these organizations. These organizations are being a part of the solution to Chicago's massive [violent] crime problem - join them and accelerate that change. There are many more like these out there - let us know if you want your organization added to this list.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://cureviolence.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Cure Violence\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.change4childreninc.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Change 4 Children Inc\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.chicagoscitizensforchange.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Chicago Citizens for Change\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://embarcchicago.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"EMBARC\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://fmsupreme.com/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"FM Supreme\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.igniteone.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Ignite One\\\"],[13],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"col-md-6\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://moran-center.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Moran Center for Youth Advocacy\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://thekleocenter.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"The K.L.E.O. Center\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://ragenglewood.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"R.A.G.E.\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.scy-chicago.org/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Strengthening Chicago's Youth\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://youngchicagoauthors.org/blog/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Young Chicago Authors\\\"],[13],[13],[1,\\\"\\\\n              \\\"],[10,\\\"li\\\"],[12],[1,\\\"And many more!\\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"section\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,\\\"Thank You\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          Mapping data comes from the \\\"],[10,3],[14,6,\\\"https://data.cityofchicago.org/\\\"],[12],[1,\\\"City of Chicago Data Portal\\\"],[13],[1,\\\" and other generous sources which prefer not to be named.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          We make use of a variety of sources for the information used on the radio ID, online streams, and map pages. The sources are as follows:\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.carmachicago.com/\\\"],[12],[1,\\\"CARMA Chicago\\\"],[13],[13],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.radioreference.com/\\\"],[12],[1,\\\"RadioReference Databases\\\"],[13],[13],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.broadcastify.com/\\\"],[12],[1,\\\"Broadcastify.com\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          Social media updates come from a variety of hardworking folks, some crime/breaking news reporters and photographers, some news editors, but most importantly hobbyists who listen to the scanners in their free time. Check out some of their Twitter profiles and follow them.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          \\\"],[10,3],[14,6,\\\"https://twitter.com/i/lists/97978215\\\"],[12],[1,\\\"View the #CrimeIsDown list on Twitter\\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"section\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[14,1,\\\"contact-us\\\"],[12],[1,\\\"Contact Us\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          \\\"],[10,3],[14,6,\\\"https://twitter.com/CrimeIsDown\\\"],[12],[1,\\\"Follow @CrimeIsDown on Twitter\\\"],[13],[1,\\\" to get crime news and updates from CrimeIsDown.com.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n          Contact \\\"],[10,3],[14,6,\\\"https://twitter.com/EricTendian\\\"],[12],[1,\\\"Eric Tendian\\\"],[13],[1,\\\" (eric [at] crimeisdown.com) for support with the website and other inquiries. Please consider\\\\n          clicking the Donate button at the bottom of the page and donating a small sum of money to keep the site up and running.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,\\\"Support Us\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"The best way to support us is thru Patreon, where you can get exclusive features for becoming a patron. PayPal donations are also accepted, any donation amount is appreciated! We use the money to pay for web hosting, scanners used for live streaming, and other activities to continue adding features. Those who donate may get to try out exclusive features of the site and get access to all our scanner recordings.\\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"https://www.patreon.com/EricTendian\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Become a Patron on Patreon\\\"],[13],[13],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4SHEMCHJPV8KY&lc=US&item_name=CrimeIsDown%2ecom&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"Send us a donation via PayPal\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[12],[1,\\\"So is crime really down?\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"h3\\\"],[12],[1,\\\"Find out for yourself:\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,3],[14,0,\\\"twitter-timeline\\\"],[14,\\\"data-height\\\",\\\"500\\\"],[14,6,\\\"https://twitter.com/EricTendian/lists/crimeisdown?ref_src=twsrc%5Etfw\\\"],[12],[1,\\\"Tweets from twitter.com/EricTendian/lists/CrimeIsDown\\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"      \\\"],[10,\\\"script\\\"],[14,\\\"async\\\",\\\"\\\"],[14,\\\"src\\\",\\\"https://platform.twitter.com/widgets.js\\\"],[14,\\\"charset\\\",\\\"utf-8\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h4\\\"],[12],[10,3],[14,6,\\\"https://cwbchicago.com/\\\"],[12],[1,\\\"CWBChicago\\\"],[13],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Unlike major news media, CWBChicago is exclusively focused on Chicago crime and tells the story of crimes from start to finish. Many larger media outlets often pick up news that was originally reported by CWBChicago. Many of our followers use them as their go-to source for crime news in their neighborhoods, and CWB is a big supporter and user of CrimeIsDown.com.\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"h4\\\"],[12],[10,3],[14,6,\\\"http://heyjackass.com/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"HeyJackass.com\\\"],[13],[1,\\\" Crime Stats\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"These are very reliable (but unofficial) crime stats, gathered from scanner reports as well as media. The publisher has zero affiliation with CPD.\\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Chicago Media\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Various links from Chicago-area media covering crime in the city:\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"https://chicago.suntimes.com/crime\\\"],[12],[1,\\\"Chicago Sun-Times Crime News\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"https://blockclubchicago.org/tag/crime/\\\"],[12],[1,\\\"Block Club Chicago Crime News\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"https://www.chicagotribune.com/news/breaking/\\\"],[12],[1,\\\"Chicago Tribune Breaking News\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://graphics.chicagotribune.com/under-the-gun/2014/\\\"],[12],[1,\\\"Chicago Under The Gun - Chicago Tribune\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[12],[10,3],[14,6,\\\"http://www.chicagomag.com/Chicago-Magazine/May-2014/Chicago-crime-rates/\\\"],[12],[1,\\\"The Truth About Chicago’s Crime Rates\\\"],[13],[1,\\\" (also check out subsequent articles)\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"div\\\",\\\"h1\\\",\\\"h2\\\",\\\"p\\\",\\\"link-to\\\",\\\"h3\\\",\\\"figure\\\",\\\"img\\\",\\\"figcaption\\\",\\\"span\\\",\\\"section\\\",\\\"a\\\",\\\"h4\\\",\\\"ul\\\",\\\"li\\\",\\\"script\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/index.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/map-transcripts\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Search Scanner Transcripts\"}}\n  <div class=\"container-fluid\">\n    <Alert @key=\"scanner-transcript-disclaimer\" @type=\"warning\">\n      Disclaimer: Transcripts are generated by AI and are not guaranteed to be correct. This is an experimental project so not every transmission may be available.\n    </Alert>\n    <TranscriptSearch />\n  </div>\n  \n  */\n  {\n    \"id\": \"GuQLfOGh\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Search Scanner Transcripts\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container-fluid\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[39,2],null,[[\\\"@key\\\",\\\"@type\\\"],[\\\"scanner-transcript-disclaimer\\\",\\\"warning\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Disclaimer: Transcripts are generated by AI and are not guaranteed to be correct. This is an experimental project so not every transmission may be available.\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[39,3],null,null,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"alert\\\",\\\"transcript-search\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/map-transcripts.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/map\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Incident Map\"}}\n  <div class=\"container-fluid\">\n    <IncidentMap />\n  </div>\n  \n  */\n  {\n    \"id\": \"jUdBp70+\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Incident Map\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container-fluid\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"incident-map\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/map.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/not-found\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h1>Page Not Found</h1>\n  <p>Sorry, but the page you were trying to view does not exist.</p>\n  \n  */\n  {\n    \"id\": \"+Qg5P3yZ\",\n    \"block\": \"[[[10,\\\"h1\\\"],[12],[1,\\\"Page Not Found\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Sorry, but the page you were trying to view does not exist.\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"h1\\\",\\\"p\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/not-found.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/notifications\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Notifications\"}}\n  <div class=\"container\">\n    <h1 class=\"fs-2\">Notification Settings</h1>\n    <NotificationSettings @channels={{@model}} />\n  </div>\n  \n  */\n  {\n    \"id\": \"ZfYykBgc\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Notifications\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h1\\\"],[14,0,\\\"fs-2\\\"],[12],[1,\\\"Notification Settings\\\"],[13],[1,\\\"\\\\n  \\\"],[8,[39,3],null,[[\\\"@channels\\\"],[[30,1]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@model\\\"],false,[\\\"page-title\\\",\\\"div\\\",\\\"h1\\\",\\\"notification-settings\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/notifications.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/sandbox\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Sandbox\"}}\n  <div class=\"container\">\n      <Sandbox />\n  </div>\n  \n  */\n  {\n    \"id\": \"/ju6D61/\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Sandbox\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"sandbox\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/sandbox.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/search-transcripts\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Search Scanner Transcripts\"}}\n  <div class=\"container-fluid\">\n    <Alert @key=\"scanner-transcript-disclaimer\" @type=\"warning\">\n      Disclaimer: Transcripts are generated by AI and are not guaranteed to be correct. This is an experimental project so not every transmission may be available.\n    </Alert>\n    <TranscriptSearch />\n  </div>\n  \n  */\n  {\n    \"id\": \"5denPaOl\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Search Scanner Transcripts\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container-fluid\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[39,2],null,[[\\\"@key\\\",\\\"@type\\\"],[\\\"scanner-transcript-disclaimer\\\",\\\"warning\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Disclaimer: Transcripts are generated by AI and are not guaranteed to be correct. This is an experimental project so not every transmission may be available.\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[39,3],null,null,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"alert\\\",\\\"transcript-search\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/search-transcripts.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/settings\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Settings\"}}\n  <div class=\"container\">\n    <Settings />\n  </div>\n  \n  */\n  {\n    \"id\": \"oHMtHETL\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Settings\\\"],null]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"settings\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/settings.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/templates/sirens\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{page-title \"Why do I hear sirens?\"}}\n  \n  <div class=\"container\">\n  \n    <div class=\"row\">\n      <div class=\"col-md-12\">\n        <form>\n          <h1 id=\"title\">Why do I hear sirens?</h1>\n          <div class=\"form-group\">\n            <label for=\"whereInput\" class=\"h2\">Where?</label>\n            <input type=\"text\" class=\"form-control\" id=\"whereInput\" aria-describedby=\"whereHelp\" placeholder=\"Enter address\">\n            <small id=\"whereHelp\" class=\"form-text text-muted\">Enter an address or place name</small>\n          </div>\n          <div class=\"form-group\">\n            <label for=\"whenInput\" class=\"h2\">When?</label>\n            <input type=\"text\" class=\"form-control\" id=\"whenInput\" aria-describedby=\"whenHelp\" placeholder=\"This should be a datepicker\">\n            <small id=\"whenHelp\" class=\"form-text text-muted\">Now, 20 minutes ago, etc</small>\n          </div>\n          <div class=\"form-group\">\n            <label class=\"h2\">Who is responding?</label>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" value=\"cpd\" id=\"whoPolice\">\n              <label class=\"form-check-label\" for=\"whoPolice\">Police (CPD)</label>\n            </div>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" value=\"cfd-fire\" id=\"whoFire\">\n              <label class=\"form-check-label\" for=\"whoPolice\">Fire truck (CFD)</label>\n            </div>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" value=\"cfd-ems\" id=\"whoEms\">\n              <label class=\"form-check-label\" for=\"whoPolice\">Ambulance (CFD)</label>\n            </div>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" value=\"other\" id=\"whoOther\">\n              <label class=\"form-check-label\" for=\"whoOther\">Other agency, or I don't know</label>\n            </div>\n          </div>\n          <div class=\"form-group\">\n            <label for=\"specialDetails\">Special Details</label>\n            <select id=\"specialDetails\" class=\"form-control\">\n              <option selected>No special details</option>\n              <option>On an expressway/interstate</option>\n              <option>On public transit (CTA)</option>\n              <option>On the river or lake</option>\n              <option>Crime scene tape up</option>\n            </select>\n          </div>\n          <button type=\"submit\" class=\"btn btn-primary\">Find out!</button>\n        </form>\n      </div>\n    </div>\n  </div>\n  \n  */\n  {\n    \"id\": \"gGeLjLWK\",\n    \"block\": \"[[[1,[28,[35,0],[\\\"Why do I hear sirens?\\\"],null]],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"container\\\"],[12],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"col-md-12\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"form\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h1\\\"],[14,1,\\\"title\\\"],[12],[1,\\\"Why do I hear sirens?\\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"whereInput\\\"],[14,0,\\\"h2\\\"],[12],[1,\\\"Where?\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"whereInput\\\"],[14,\\\"aria-describedby\\\",\\\"whereHelp\\\"],[14,\\\"placeholder\\\",\\\"Enter address\\\"],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[10,\\\"small\\\"],[14,1,\\\"whereHelp\\\"],[14,0,\\\"form-text text-muted\\\"],[12],[1,\\\"Enter an address or place name\\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"whenInput\\\"],[14,0,\\\"h2\\\"],[12],[1,\\\"When?\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control\\\"],[14,1,\\\"whenInput\\\"],[14,\\\"aria-describedby\\\",\\\"whenHelp\\\"],[14,\\\"placeholder\\\",\\\"This should be a datepicker\\\"],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[10,\\\"small\\\"],[14,1,\\\"whenHelp\\\"],[14,0,\\\"form-text text-muted\\\"],[12],[1,\\\"Now, 20 minutes ago, etc\\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"label\\\"],[14,0,\\\"h2\\\"],[12],[1,\\\"Who is responding?\\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"form-check\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[14,2,\\\"cpd\\\"],[14,1,\\\"whoPolice\\\"],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[14,\\\"for\\\",\\\"whoPolice\\\"],[12],[1,\\\"Police (CPD)\\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"form-check\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[14,2,\\\"cfd-fire\\\"],[14,1,\\\"whoFire\\\"],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[14,\\\"for\\\",\\\"whoPolice\\\"],[12],[1,\\\"Fire truck (CFD)\\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"form-check\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[14,2,\\\"cfd-ems\\\"],[14,1,\\\"whoEms\\\"],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[14,\\\"for\\\",\\\"whoPolice\\\"],[12],[1,\\\"Ambulance (CFD)\\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"form-check\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,0,\\\"form-check-input\\\"],[14,2,\\\"other\\\"],[14,1,\\\"whoOther\\\"],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"form-check-label\\\"],[14,\\\"for\\\",\\\"whoOther\\\"],[12],[1,\\\"Other agency, or I don't know\\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"specialDetails\\\"],[12],[1,\\\"Special Details\\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"select\\\"],[14,1,\\\"specialDetails\\\"],[14,0,\\\"form-control\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"option\\\"],[14,\\\"selected\\\",\\\"\\\"],[12],[1,\\\"No special details\\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"option\\\"],[12],[1,\\\"On an expressway/interstate\\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"option\\\"],[12],[1,\\\"On public transit (CTA)\\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"option\\\"],[12],[1,\\\"On the river or lake\\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"option\\\"],[12],[1,\\\"Crime scene tape up\\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-primary\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"Find out!\\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"page-title\\\",\\\"div\\\",\\\"form\\\",\\\"h1\\\",\\\"label\\\",\\\"input\\\",\\\"small\\\",\\\"select\\\",\\\"option\\\",\\\"button\\\"]]\",\n    \"moduleName\": \"crimeisdown/templates/sirens.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"crimeisdown/transforms/boolean\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  class DeprecatedBooleanTransform extends _transform.BooleanTransform {\n    constructor(...args) {\n      super(...args);\n      (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the BooleanTransform. Use `export { BooleanTransform as default } from '@ember-data/serializer/transform';` in app/transforms/boolean.js instead\", false, {\n        id: 'ember-data:deprecate-legacy-imports',\n        for: 'ember-data',\n        until: '6.0',\n        since: {\n          enabled: '5.2',\n          available: '4.13'\n        }\n      }));\n    }\n  }\n  _exports.default = DeprecatedBooleanTransform;\n});","define(\"crimeisdown/transforms/date\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  class DeprecatedDateTransform extends _transform.DateTransform {\n    constructor(...args) {\n      super(...args);\n      (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the DateTransform. Use `export { DateTransform as default } from '@ember-data/serializer/transform';` in app/transforms/date.js instead\", false, {\n        id: 'ember-data:deprecate-legacy-imports',\n        for: 'ember-data',\n        until: '6.0',\n        since: {\n          enabled: '5.2',\n          available: '4.13'\n        }\n      }));\n    }\n  }\n  _exports.default = DeprecatedDateTransform;\n});","define(\"crimeisdown/transforms/number\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  class DeprecatedNumberTransform extends _transform.NumberTransform {\n    constructor(...args) {\n      super(...args);\n      (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the NumberTransform. Use `export { NumberTransform as default } from '@ember-data/serializer/transform';` in app/transforms/number.js instead\", false, {\n        id: 'ember-data:deprecate-legacy-imports',\n        for: 'ember-data',\n        until: '6.0',\n        since: {\n          enabled: '5.2',\n          available: '4.13'\n        }\n      }));\n    }\n  }\n  _exports.default = DeprecatedNumberTransform;\n});","define(\"crimeisdown/transforms/string\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  class DeprecatedStringTransform extends _transform.StringTransform {\n    constructor(...args) {\n      super(...args);\n      (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the StringTransform. Use `export { StringTransform as default } from '@ember-data/serializer/transform';` in app/transforms/string.js instead\", false, {\n        id: 'ember-data:deprecate-legacy-imports',\n        for: 'ember-data',\n        until: '6.0',\n        since: {\n          enabled: '5.2',\n          available: '4.13'\n        }\n      }));\n    }\n  }\n  _exports.default = DeprecatedStringTransform;\n});","define(\"crimeisdown/utils/audio-feed-config\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.feeds = _exports.encryptedZones = void 0;\n  0; //eaimeta@70e063a35619d71feaimeta@70e063a35619d71f\n  const encryptedZones = _exports.encryptedZones = {\n    zone1: '2023-01-30 06:00:00',\n    zone2: '2023-01-03 06:00:00',\n    zone3: '2022-09-02 00:00:00',\n    zone4: '2023-03-07 06:00:00',\n    zone5: '2022-06-30 12:00:00',\n    zone6: '2022-08-12 00:00:00',\n    zone7: '2022-06-30 12:00:00',\n    zone8: '2022-05-25 00:00:00',\n    zone9: '2022-05-12 12:00:00',\n    zone10: '2022-10-25 06:00:00',\n    zone11: '2023-04-04 12:00:00',\n    zone12: '2022-11-15 07:00:00',\n    zone13: '2022-10-04 06:00:00'\n  };\n  const feeds = _exports.feeds = [{\n    value: 'citywide1',\n    label: 'Citywide 1'\n  }, {\n    value: 'citywide2',\n    label: 'Citywide 2'\n  }, {\n    value: 'citywide3',\n    label: 'Citywide 3'\n  }, {\n    value: 'citywide4',\n    label: 'Citywide 4'\n  }, {\n    value: 'citywide5',\n    label: 'Citywide 5'\n  }, {\n    value: 'citywide6',\n    label: 'Citywide 6'\n  }, {\n    value: 'citywide7',\n    label: 'Citywide 7'\n  }, {\n    value: 'zone1',\n    label: 'Zone 1 (016/017)'\n  }, {\n    value: 'zone2',\n    label: 'Zone 2 (019)'\n  }, {\n    value: 'zone3',\n    label: 'Zone 3 (012/014)'\n  }, {\n    value: 'zone4',\n    label: 'Zone 4 (001/018)'\n  }, {\n    value: 'zone5',\n    label: 'Zone 5 (002) - no longer in use'\n  }, {\n    value: 'zone6',\n    label: 'Zone 6 (007/008)'\n  }, {\n    value: 'zone7',\n    label: 'Zone 7 (002/003)'\n  }, {\n    value: 'zone8',\n    label: 'Zone 8 (004/006)'\n  }, {\n    value: 'zone9',\n    label: 'Zone 9 (005/022)'\n  }, {\n    value: 'zone10',\n    label: 'Zone 10 (010/011)'\n  }, {\n    value: 'zone11',\n    label: 'Zone 11 (020/024)'\n  }, {\n    value: 'zone12',\n    label: 'Zone 12 (015/025)'\n  }, {\n    value: 'zone13',\n    label: 'Zone 13 (009)'\n  }, {\n    value: 'fire_main',\n    label: 'CFD Fire Main (North)'\n  }, {\n    value: 'fire_englewood',\n    label: 'CFD Fire Englewood (South)'\n  }, {\n    value: 'ems_main',\n    label: 'CFD EMS Main (North)'\n  }, {\n    value: 'ems_englewood',\n    label: 'CFD EMS Englewood (South)'\n  }];\n});","\n","define('crimeisdown/config/environment', [], function() {\n  var prefix = 'crimeisdown';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(decodeURIComponent(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","\n          if (!runningTests) {\n            require(\"crimeisdown/app\")[\"default\"].create({\"API_BASE_URL\":\"https://api.cmh2.nerdfest.dev\",\"API_AUTH_TOKEN\":null,\"MEILISEARCH_URL\":\"https://search.cmh.nerdfest.dev\",\"MEILISEARCH_KEY\":\"qSS2NBRuEt_pNRu0SWk-Q_zoy534AOu46RujkRT41HE\",\"TYPESENSE_URL\":null,\"TYPESENSE_KEY\":null,\"SEARCH_INDEX\":\"calls\",\"name\":\"crimeisdown\",\"version\":\"3.0.0+8c5f72ca\"});\n          }\n        \n"],"names":[],"mappings":"AAAA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1jCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;","file":"crimeisdown.js"}