From ed6df5efbe264a9c38a4766b1ef517efbaedf344 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 17 Feb 2026 03:56:54 +0100 Subject: [PATCH] Upload of project source code files. --- .formatter.exs | 6 + assets/css/app.css | 19 + assets/js/app.js | 45 + assets/tailwind.config.js | 134 + assets/vendor/topbar.js | 165 + config/config.exs | 70 + config/dev.exs | 85 + config/prod.exs | 20 + config/runtime.exs | 117 + config/test.exs | 37 + lib/vishnya.ex | 9 + lib/vishnya/accounts.ex | 58 + lib/vishnya/accounts/user.ex | 25 + lib/vishnya/application.ex | 68 + lib/vishnya/mailer.ex | 3 + lib/vishnya/repo.ex | 5 + lib/vishnya/user.ex | 23 + lib/vishnya_web.ex | 113 + lib/vishnya_web/components/core_components.ex | 694 ++ lib/vishnya_web/components/layouts.ex | 14 + .../components/layouts/app.html.heex | 56 + .../components/layouts/root.html.heex | 17 + .../controllers/auth_controller.ex | 38 + lib/vishnya_web/controllers/error_html.ex | 24 + lib/vishnya_web/controllers/error_json.ex | 21 + .../controllers/message_controller.ex | 15 + .../controllers/page_controller.ex | 19 + lib/vishnya_web/controllers/page_html.ex | 10 + .../controllers/page_html/dashboard.html.heex | 176 + .../controllers/page_html/home.html.heex | 17 + .../controllers/page_html/sign_in.html.heex | 38 + .../controllers/plugs/authenticate.ex | 31 + lib/vishnya_web/endpoint.ex | 54 + lib/vishnya_web/gettext.ex | 24 + lib/vishnya_web/router.ex | 54 + lib/vishnya_web/telemetry.ex | 92 + mix.exs | 88 + mix.lock | 44 + priv/gettext/en/LC_MESSAGES/errors.po | 112 + priv/gettext/errors.pot | 109 + priv/repo/migrations/.formatter.exs | 4 + .../20241103165448_create_users.exs | 18 + .../20241107202537_create_discord_users.exs | 22 + .../20241107202548_create_discord_servers.exs | 19 + ...20241107202557_create_discord_channels.exs | 18 + ...20241107202606_create_discord_messages.exs | 20 + ...826_create_discord_message_change_logs.exs | 20 + ...3842_create_discord_server_change_logs.exs | 19 + ...203849_create_discord_user_change_logs.exs | 23 + ...856_create_discord_channel_change_logs.exs | 18 + priv/repo/seeds.exs | 11 + priv/static/assets/app.css | 2227 ++++++ priv/static/assets/app.js | 7084 +++++++++++++++++ priv/static/favicon.ico | Bin 0 -> 152 bytes priv/static/images/^^.jpg | Bin 0 -> 50290 bytes priv/static/images/leet.jpg | Bin 0 -> 68789 bytes priv/static/images/logo.svg | 6 + priv/static/images/love.png | Bin 0 -> 125653 bytes priv/static/images/meow.png | Bin 0 -> 102069 bytes priv/static/images/miau.jpg | Bin 0 -> 55115 bytes priv/static/images/rawr.png | Bin 0 -> 135358 bytes priv/static/images/sex.png | Bin 0 -> 84923 bytes priv/static/images/ssh.jpeg | Bin 0 -> 6096 bytes priv/static/robots.txt | 5 + test/support/conn_case.ex | 38 + test/support/data_case.ex | 58 + test/test_helper.exs | 2 + .../controllers/error_html_test.exs | 14 + .../controllers/error_json_test.exs | 12 + .../controllers/page_controller_test.exs | 8 + 70 files changed, 12395 insertions(+) create mode 100644 .formatter.exs create mode 100644 assets/css/app.css create mode 100644 assets/js/app.js create mode 100644 assets/tailwind.config.js create mode 100644 assets/vendor/topbar.js create mode 100644 config/config.exs create mode 100644 config/dev.exs create mode 100644 config/prod.exs create mode 100644 config/runtime.exs create mode 100644 config/test.exs create mode 100644 lib/vishnya.ex create mode 100644 lib/vishnya/accounts.ex create mode 100644 lib/vishnya/accounts/user.ex create mode 100644 lib/vishnya/application.ex create mode 100644 lib/vishnya/mailer.ex create mode 100644 lib/vishnya/repo.ex create mode 100644 lib/vishnya/user.ex create mode 100644 lib/vishnya_web.ex create mode 100644 lib/vishnya_web/components/core_components.ex create mode 100644 lib/vishnya_web/components/layouts.ex create mode 100644 lib/vishnya_web/components/layouts/app.html.heex create mode 100644 lib/vishnya_web/components/layouts/root.html.heex create mode 100644 lib/vishnya_web/controllers/auth_controller.ex create mode 100644 lib/vishnya_web/controllers/error_html.ex create mode 100644 lib/vishnya_web/controllers/error_json.ex create mode 100644 lib/vishnya_web/controllers/message_controller.ex create mode 100644 lib/vishnya_web/controllers/page_controller.ex create mode 100644 lib/vishnya_web/controllers/page_html.ex create mode 100644 lib/vishnya_web/controllers/page_html/dashboard.html.heex create mode 100644 lib/vishnya_web/controllers/page_html/home.html.heex create mode 100644 lib/vishnya_web/controllers/page_html/sign_in.html.heex create mode 100644 lib/vishnya_web/controllers/plugs/authenticate.ex create mode 100644 lib/vishnya_web/endpoint.ex create mode 100644 lib/vishnya_web/gettext.ex create mode 100644 lib/vishnya_web/router.ex create mode 100644 lib/vishnya_web/telemetry.ex create mode 100644 mix.exs create mode 100644 mix.lock create mode 100644 priv/gettext/en/LC_MESSAGES/errors.po create mode 100644 priv/gettext/errors.pot create mode 100644 priv/repo/migrations/.formatter.exs create mode 100644 priv/repo/migrations/20241103165448_create_users.exs create mode 100644 priv/repo/migrations/20241107202537_create_discord_users.exs create mode 100644 priv/repo/migrations/20241107202548_create_discord_servers.exs create mode 100644 priv/repo/migrations/20241107202557_create_discord_channels.exs create mode 100644 priv/repo/migrations/20241107202606_create_discord_messages.exs create mode 100644 priv/repo/migrations/20241107203826_create_discord_message_change_logs.exs create mode 100644 priv/repo/migrations/20241107203842_create_discord_server_change_logs.exs create mode 100644 priv/repo/migrations/20241107203849_create_discord_user_change_logs.exs create mode 100644 priv/repo/migrations/20241107203856_create_discord_channel_change_logs.exs create mode 100644 priv/repo/seeds.exs create mode 100644 priv/static/assets/app.css create mode 100644 priv/static/assets/app.js create mode 100644 priv/static/favicon.ico create mode 100644 priv/static/images/^^.jpg create mode 100644 priv/static/images/leet.jpg create mode 100644 priv/static/images/logo.svg create mode 100644 priv/static/images/love.png create mode 100644 priv/static/images/meow.png create mode 100644 priv/static/images/miau.jpg create mode 100644 priv/static/images/rawr.png create mode 100644 priv/static/images/sex.png create mode 100644 priv/static/images/ssh.jpeg create mode 100644 priv/static/robots.txt create mode 100644 test/support/conn_case.ex create mode 100644 test/support/data_case.ex create mode 100644 test/test_helper.exs create mode 100644 test/vishnya_web/controllers/error_html_test.exs create mode 100644 test/vishnya_web/controllers/error_json_test.exs create mode 100644 test/vishnya_web/controllers/page_controller_test.exs diff --git a/.formatter.exs b/.formatter.exs new file mode 100644 index 0000000..ef8840c --- /dev/null +++ b/.formatter.exs @@ -0,0 +1,6 @@ +[ + import_deps: [:ecto, :ecto_sql, :phoenix], + subdirectories: ["priv/*/migrations"], + plugins: [Phoenix.LiveView.HTMLFormatter], + inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"] +] diff --git a/assets/css/app.css b/assets/css/app.css new file mode 100644 index 0000000..cc202cd --- /dev/null +++ b/assets/css/app.css @@ -0,0 +1,19 @@ +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; +@import url("https://fonts.googleapis.com/css2?family=Jolly+Lodger&family=Kumar+One&family=Modak&family=Rubik+Distressed&display=swap"); + +html, +body { + background-color: #1a1a1a !important; + height: 100%; + margin: 0; + padding: 0; +} + +.rotate-0 { + transform: rotate(0deg); +} +.rotate-90 { + transform: rotate(90deg); +} diff --git a/assets/js/app.js b/assets/js/app.js new file mode 100644 index 0000000..b11b340 --- /dev/null +++ b/assets/js/app.js @@ -0,0 +1,45 @@ +// If you want to use Phoenix channels, run `mix help phx.gen.channel` +// to get started and then uncomment the line below. +// import "./user_socket.js" + +// You can include dependencies in two ways. +// +// The simplest option is to put them in assets/vendor and +// import them using relative paths: +// +// import "../vendor/some-package.js" +// +// Alternatively, you can `npm install some-package --prefix assets` and import +// them using a path starting with the package name: +// +// import "some-package" +// + +// Include phoenix_html to handle method=PUT/DELETE in forms and buttons. +import "phoenix_html"; +// Establish Phoenix Socket and LiveView configuration. +import { Socket } from "phoenix"; +import { LiveSocket } from "phoenix_live_view"; +import topbar from "../vendor/topbar"; + +let csrfToken = document + .querySelector("meta[name='csrf-token']") + .getAttribute("content"); +let liveSocket = new LiveSocket("/live", Socket, { + longPollFallbackMs: 2500, + params: { _csrf_token: csrfToken }, +}); + +// Show progress bar on live navigation and form submits +topbar.config({ barColors: { 0: "#29d" }, shadowColor: "rgba(0, 0, 0, .3)" }); +window.addEventListener("phx:page-loading-start", (_info) => topbar.show(300)); +window.addEventListener("phx:page-loading-stop", (_info) => topbar.hide()); + +// connect if there are any LiveViews on the page +liveSocket.connect(); + +// expose liveSocket on window for web console debug logs and latency simulation: +// >> liveSocket.enableDebug() +// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session +// >> liveSocket.disableLatencySim() +window.liveSocket = liveSocket; diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js new file mode 100644 index 0000000..06f1ee8 --- /dev/null +++ b/assets/tailwind.config.js @@ -0,0 +1,134 @@ +// See the Tailwind configuration guide for advanced usage +// https://tailwindcss.com/docs/configuration + +const plugin = require("tailwindcss/plugin"); +const fs = require("fs"); +const path = require("path"); + +module.exports = { + content: [ + "./js/**/*.js", + "../lib/vishnya_web.ex", + "../lib/vishnya_web/**/*.*ex", + ], + theme: { + fontFamily: { + rubik: ['"Rubik Distressed"', "system-ui"], + modak: ["Modak", "serif"], + kumar: ['"Kumar One"', "serif"], + jolly: ['"Jolly Lodger"', "serif"], + }, + extend: { + colors: { + vish: "#ff99ff", + }, + animation: { + brightGlow: "brightGlow 2s infinite alternate", + glowText: "glowText 2s infinite alternate", + slideIn: "slideIn 0.2s ease-out", + slideOut: "slideOut 0.2s ease-in forwards", + }, + keyframes: { + brightGlow: { + "0%": { textShadow: "0px 0px 8px rgba(255, 255, 255, 0.9)" }, + "100%": { + textShadow: + "0px 0px 25px rgba(255, 255, 255, 1), 0px 0px 35px rgba(255, 255, 255, 1)", + }, + }, + glowText: { + "0%": { + textShadow: + "0px 0px 8px rgba(255, 255, 255, 0.8), 0px 0px 15px rgba(255, 153, 255, 0.5)", + }, + "100%": { + textShadow: + "0px 0px 20px rgba(255, 255, 255, 1), 0px 0px 30px rgba(255, 153, 255, 0.8)", + }, + }, + slideIn: { + "0%": { transform: "translateX(100%)", opacity: "0" }, + "100%": { transform: "translateX(0)", opacity: "1" }, + }, + slideOut: { + "0%": { transform: "translateX(0)", opacity: "1" }, + "100%": { transform: "translateX(100%)", opacity: "0" }, + }, + }, + }, + }, + plugins: [ + require("@tailwindcss/forms"), + // Allows prefixing tailwind classes with LiveView classes to add rules + // only when LiveView classes are applied, for example: + // + //
+ // + plugin(({ addVariant }) => + addVariant("phx-click-loading", [ + ".phx-click-loading&", + ".phx-click-loading &", + ]), + ), + plugin(({ addVariant }) => + addVariant("phx-submit-loading", [ + ".phx-submit-loading&", + ".phx-submit-loading &", + ]), + ), + plugin(({ addVariant }) => + addVariant("phx-change-loading", [ + ".phx-change-loading&", + ".phx-change-loading &", + ]), + ), + + // Embeds Heroicons (https://heroicons.com) into your app.css bundle + // See your `CoreComponents.icon/1` for more information. + // + plugin(function ({ matchComponents, theme }) { + let iconsDir = path.join(__dirname, "../deps/heroicons/optimized"); + let values = {}; + let icons = [ + ["", "/24/outline"], + ["-solid", "/24/solid"], + ["-mini", "/20/solid"], + ["-micro", "/16/solid"], + ]; + icons.forEach(([suffix, dir]) => { + fs.readdirSync(path.join(iconsDir, dir)).forEach((file) => { + let name = path.basename(file, ".svg") + suffix; + values[name] = { name, fullPath: path.join(iconsDir, dir, file) }; + }); + }); + matchComponents( + { + hero: ({ name, fullPath }) => { + let content = fs + .readFileSync(fullPath) + .toString() + .replace(/\r?\n|\r/g, ""); + let size = theme("spacing.6"); + if (name.endsWith("-mini")) { + size = theme("spacing.5"); + } else if (name.endsWith("-micro")) { + size = theme("spacing.4"); + } + return { + [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, + "-webkit-mask": `var(--hero-${name})`, + mask: `var(--hero-${name})`, + "mask-repeat": "no-repeat", + "background-color": "currentColor", + "vertical-align": "middle", + display: "inline-block", + width: size, + height: size, + }; + }, + }, + { values }, + ); + }), + ], +}; diff --git a/assets/vendor/topbar.js b/assets/vendor/topbar.js new file mode 100644 index 0000000..4195727 --- /dev/null +++ b/assets/vendor/topbar.js @@ -0,0 +1,165 @@ +/** + * @license MIT + * topbar 2.0.0, 2023-02-04 + * https://buunguyen.github.io/topbar + * Copyright (c) 2021 Buu Nguyen + */ +(function (window, document) { + "use strict"; + + // https://gist.github.com/paulirish/1579671 + (function () { + var lastTime = 0; + var vendors = ["ms", "moz", "webkit", "o"]; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = + window[vendors[x] + "RequestAnimationFrame"]; + window.cancelAnimationFrame = + window[vendors[x] + "CancelAnimationFrame"] || + window[vendors[x] + "CancelRequestAnimationFrame"]; + } + if (!window.requestAnimationFrame) + window.requestAnimationFrame = function (callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + if (!window.cancelAnimationFrame) + window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; + })(); + + var canvas, + currentProgress, + showing, + progressTimerId = null, + fadeTimerId = null, + delayTimerId = null, + addEvent = function (elem, type, handler) { + if (elem.addEventListener) elem.addEventListener(type, handler, false); + else if (elem.attachEvent) elem.attachEvent("on" + type, handler); + else elem["on" + type] = handler; + }, + options = { + autoRun: true, + barThickness: 3, + barColors: { + 0: "rgba(26, 188, 156, .9)", + ".25": "rgba(52, 152, 219, .9)", + ".50": "rgba(241, 196, 15, .9)", + ".75": "rgba(230, 126, 34, .9)", + "1.0": "rgba(211, 84, 0, .9)", + }, + shadowBlur: 10, + shadowColor: "rgba(0, 0, 0, .6)", + className: null, + }, + repaint = function () { + canvas.width = window.innerWidth; + canvas.height = options.barThickness * 5; // need space for shadow + + var ctx = canvas.getContext("2d"); + ctx.shadowBlur = options.shadowBlur; + ctx.shadowColor = options.shadowColor; + + var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); + for (var stop in options.barColors) + lineGradient.addColorStop(stop, options.barColors[stop]); + ctx.lineWidth = options.barThickness; + ctx.beginPath(); + ctx.moveTo(0, options.barThickness / 2); + ctx.lineTo( + Math.ceil(currentProgress * canvas.width), + options.barThickness / 2 + ); + ctx.strokeStyle = lineGradient; + ctx.stroke(); + }, + createCanvas = function () { + canvas = document.createElement("canvas"); + var style = canvas.style; + style.position = "fixed"; + style.top = style.left = style.right = style.margin = style.padding = 0; + style.zIndex = 100001; + style.display = "none"; + if (options.className) canvas.classList.add(options.className); + document.body.appendChild(canvas); + addEvent(window, "resize", repaint); + }, + topbar = { + config: function (opts) { + for (var key in opts) + if (options.hasOwnProperty(key)) options[key] = opts[key]; + }, + show: function (delay) { + if (showing) return; + if (delay) { + if (delayTimerId) return; + delayTimerId = setTimeout(() => topbar.show(), delay); + } else { + showing = true; + if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId); + if (!canvas) createCanvas(); + canvas.style.opacity = 1; + canvas.style.display = "block"; + topbar.progress(0); + if (options.autoRun) { + (function loop() { + progressTimerId = window.requestAnimationFrame(loop); + topbar.progress( + "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) + ); + })(); + } + } + }, + progress: function (to) { + if (typeof to === "undefined") return currentProgress; + if (typeof to === "string") { + to = + (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 + ? currentProgress + : 0) + parseFloat(to); + } + currentProgress = to > 1 ? 1 : to; + repaint(); + return currentProgress; + }, + hide: function () { + clearTimeout(delayTimerId); + delayTimerId = null; + if (!showing) return; + showing = false; + if (progressTimerId != null) { + window.cancelAnimationFrame(progressTimerId); + progressTimerId = null; + } + (function loop() { + if (topbar.progress("+.1") >= 1) { + canvas.style.opacity -= 0.05; + if (canvas.style.opacity <= 0.05) { + canvas.style.display = "none"; + fadeTimerId = null; + return; + } + } + fadeTimerId = window.requestAnimationFrame(loop); + })(); + }, + }; + + if (typeof module === "object" && typeof module.exports === "object") { + module.exports = topbar; + } else if (typeof define === "function" && define.amd) { + define(function () { + return topbar; + }); + } else { + this.topbar = topbar; + } +}.call(this, window, document)); diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..4903d7b --- /dev/null +++ b/config/config.exs @@ -0,0 +1,70 @@ +# This file is responsible for configuring your application +# and its dependencies with the aid of the Config module. +# +# This configuration file is loaded before any dependency and +# is restricted to this project. + +# General application configuration +import Config + +config :vishnya, + ecto_repos: [Vishnya.Repo], + generators: [timestamp_type: :utc_datetime] + +config :vishnya, :admin_credentials, + username: "admin", + password: "admin" + +# Configures the endpoint +config :vishnya, VishnyaWeb.Endpoint, + url: [host: "localhost"], + adapter: Bandit.PhoenixAdapter, + render_errors: [ + formats: [html: VishnyaWeb.ErrorHTML, json: VishnyaWeb.ErrorJSON], + layout: false + ], + pubsub_server: Vishnya.PubSub, + live_view: [signing_salt: "VkEZypnm"] + +# Configures the mailer +# +# By default it uses the "Local" adapter which stores the emails +# locally. You can see the emails in your browser, at "/dev/mailbox". +# +# For production it's recommended to configure a different adapter +# at the `config/runtime.exs`. +config :vishnya, Vishnya.Mailer, adapter: Swoosh.Adapters.Local + +# Configure esbuild (the version is required) +config :esbuild, + version: "0.17.11", + vishnya: [ + args: + ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*), + cd: Path.expand("../assets", __DIR__), + env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)} + ] + +# Configure tailwind (the version is required) +config :tailwind, + version: "3.4.3", + vishnya: [ + args: ~w( + --config=tailwind.config.js + --input=css/app.css + --output=../priv/static/assets/app.css + ), + cd: Path.expand("../assets", __DIR__) + ] + +# Configures Elixir's Logger +config :logger, :console, + format: "$time $metadata[$level] $message\n", + metadata: [:request_id] + +# Use Jason for JSON parsing in Phoenix +config :phoenix, :json_library, Jason + +# Import environment specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "#{config_env()}.exs" diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 0000000..95b0ad1 --- /dev/null +++ b/config/dev.exs @@ -0,0 +1,85 @@ +import Config + +# Configure your database +config :vishnya, Vishnya.Repo, + username: "postgres", + password: "postgres", + hostname: "localhost", + database: "vishnya_dev", + stacktrace: true, + show_sensitive_data_on_connection_error: true, + pool_size: 10 + +# For development, we disable any cache and enable +# debugging and code reloading. +# +# The watchers configuration can be used to run external +# watchers to your application. For example, we can use it +# to bundle .js and .css sources. +config :vishnya, VishnyaWeb.Endpoint, + # Binding to loopback ipv4 address prevents access from other machines. + # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. + http: [ip: {127, 0, 0, 1}, port: 4000], + check_origin: false, + code_reloader: true, + debug_errors: true, + secret_key_base: "/OiTtqlB4NvMj5pmVzyAbbK7Ufem1qOzocgZK5fZDcnBJExwA8G9w/HwGnFAOdY5", + watchers: [ + esbuild: {Esbuild, :install_and_run, [:vishnya, ~w(--sourcemap=inline --watch)]}, + tailwind: {Tailwind, :install_and_run, [:vishnya, ~w(--watch)]} + ] + +# ## SSL Support +# +# In order to use HTTPS in development, a self-signed +# certificate can be generated by running the following +# Mix task: +# +# mix phx.gen.cert +# +# Run `mix help phx.gen.cert` for more information. +# +# The `http:` config above can be replaced with: +# +# https: [ +# port: 4001, +# cipher_suite: :strong, +# keyfile: "priv/cert/selfsigned_key.pem", +# certfile: "priv/cert/selfsigned.pem" +# ], +# +# If desired, both `http:` and `https:` keys can be +# configured to run both http and https servers on +# different ports. + +# Watch static and templates for browser reloading. +config :vishnya, VishnyaWeb.Endpoint, + live_reload: [ + patterns: [ + ~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg)$", + ~r"priv/gettext/.*(po)$", + ~r"lib/vishnya_web/(controllers|live|components)/.*(ex|heex)$" + ] + ] + +# Enable dev routes for dashboard and mailbox +config :vishnya, dev_routes: true + +# Do not include metadata nor timestamps in development logs +config :logger, :console, format: "[$level] $message\n" + +# Set a higher stacktrace during development. Avoid configuring such +# in production as building large stacktraces may be expensive. +config :phoenix, :stacktrace_depth, 20 + +# Initialize plugs at runtime for faster development compilation +config :phoenix, :plug_init_mode, :runtime + +config :phoenix_live_view, + # Include HEEx debug annotations as HTML comments in rendered markup + debug_heex_annotations: true, + # Enable helpful, but potentially expensive runtime checks + enable_expensive_runtime_checks: true + +# Disable swoosh api client as it is only required for production adapters. +config :swoosh, :api_client, false diff --git a/config/prod.exs b/config/prod.exs new file mode 100644 index 0000000..5b9321c --- /dev/null +++ b/config/prod.exs @@ -0,0 +1,20 @@ +import Config + +# Note we also include the path to a cache manifest +# containing the digested version of static files. This +# manifest is generated by the `mix assets.deploy` task, +# which you should run after static files are built and +# before starting your production server. +config :vishnya, VishnyaWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json" + +# Configures Swoosh API Client +config :swoosh, api_client: Swoosh.ApiClient.Finch, finch_name: Vishnya.Finch + +# Disable Swoosh Local Memory Storage +config :swoosh, local: false + +# Do not print debug messages in production +config :logger, level: :info + +# Runtime production configuration, including reading +# of environment variables, is done on config/runtime.exs. diff --git a/config/runtime.exs b/config/runtime.exs new file mode 100644 index 0000000..4babb9e --- /dev/null +++ b/config/runtime.exs @@ -0,0 +1,117 @@ +import Config + +# config/runtime.exs is executed for all environments, including +# during releases. It is executed after compilation and before the +# system starts, so it is typically used to load production configuration +# and secrets from environment variables or elsewhere. Do not define +# any compile-time configuration in here, as it won't be applied. +# The block below contains prod specific runtime configuration. + +# ## Using releases +# +# If you use `mix release`, you need to explicitly enable the server +# by passing the PHX_SERVER=true when you start it: +# +# PHX_SERVER=true bin/vishnya start +# +# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server` +# script that automatically sets the env var above. +if System.get_env("PHX_SERVER") do + config :vishnya, VishnyaWeb.Endpoint, server: true +end + +if config_env() == :prod do + database_url = + System.get_env("DATABASE_URL") || + raise """ + environment variable DATABASE_URL is missing. + For example: ecto://USER:PASS@HOST/DATABASE + """ + + maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: [] + + config :vishnya, Vishnya.Repo, + # ssl: true, + url: database_url, + pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"), + socket_options: maybe_ipv6 + + # The secret key base is used to sign/encrypt cookies and other secrets. + # A default value is used in config/dev.exs and config/test.exs but you + # want to use a different value for prod and you most likely don't want + # to check this value into version control, so we use an environment + # variable instead. + secret_key_base = + System.get_env("SECRET_KEY_BASE") || + raise """ + environment variable SECRET_KEY_BASE is missing. + You can generate one by calling: mix phx.gen.secret + """ + + host = System.get_env("PHX_HOST") || "example.com" + port = String.to_integer(System.get_env("PORT") || "4000") + + config :vishnya, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY") + + config :vishnya, VishnyaWeb.Endpoint, + url: [host: host, port: 443, scheme: "https"], + http: [ + # Enable IPv6 and bind on all interfaces. + # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. + # See the documentation on https://hexdocs.pm/bandit/Bandit.html#t:options/0 + # for details about using IPv6 vs IPv4 and loopback vs public addresses. + ip: {0, 0, 0, 0, 0, 0, 0, 0}, + port: port + ], + secret_key_base: secret_key_base + + # ## SSL Support + # + # To get SSL working, you will need to add the `https` key + # to your endpoint configuration: + # + # config :vishnya, VishnyaWeb.Endpoint, + # https: [ + # ..., + # port: 443, + # cipher_suite: :strong, + # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), + # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") + # ] + # + # The `cipher_suite` is set to `:strong` to support only the + # latest and more secure SSL ciphers. This means old browsers + # and clients may not be supported. You can set it to + # `:compatible` for wider support. + # + # `:keyfile` and `:certfile` expect an absolute path to the key + # and cert in disk or a relative path inside priv, for example + # "priv/ssl/server.key". For all supported SSL configuration + # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 + # + # We also recommend setting `force_ssl` in your config/prod.exs, + # ensuring no data is ever sent via http, always redirecting to https: + # + # config :vishnya, VishnyaWeb.Endpoint, + # force_ssl: [hsts: true] + # + # Check `Plug.SSL` for all available options in `force_ssl`. + + # ## Configuring the mailer + # + # In production you need to configure the mailer to use a different adapter. + # Also, you may need to configure the Swoosh API client of your choice if you + # are not using SMTP. Here is an example of the configuration: + # + # config :vishnya, Vishnya.Mailer, + # adapter: Swoosh.Adapters.Mailgun, + # api_key: System.get_env("MAILGUN_API_KEY"), + # domain: System.get_env("MAILGUN_DOMAIN") + # + # For this example you need include a HTTP client required by Swoosh API client. + # Swoosh supports Hackney and Finch out of the box: + # + # config :swoosh, :api_client, Swoosh.ApiClient.Hackney + # + # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details. +end diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 0000000..0b2a0f9 --- /dev/null +++ b/config/test.exs @@ -0,0 +1,37 @@ +import Config + +# Configure your database +# +# The MIX_TEST_PARTITION environment variable can be used +# to provide built-in test partitioning in CI environment. +# Run `mix help test` for more information. +config :vishnya, Vishnya.Repo, + username: "postgres", + password: "postgres", + hostname: "localhost", + database: "vishnya_test#{System.get_env("MIX_TEST_PARTITION")}", + pool: Ecto.Adapters.SQL.Sandbox, + pool_size: System.schedulers_online() * 2 + +# We don't run a server during test. If one is required, +# you can enable the server option below. +config :vishnya, VishnyaWeb.Endpoint, + http: [ip: {127, 0, 0, 1}, port: 4002], + secret_key_base: "LP73RPMYMj3jLhMaqMGE+QTFLK5tdU/JFUuXpfIOFSh5/XQhV2kcEDvDKuWh2UaU", + server: false + +# In test we don't send emails +config :vishnya, Vishnya.Mailer, adapter: Swoosh.Adapters.Test + +# Disable swoosh api client as it is only required for production adapters +config :swoosh, :api_client, false + +# Print only warnings and errors during test +config :logger, level: :warning + +# Initialize plugs at runtime for faster test compilation +config :phoenix, :plug_init_mode, :runtime + +# Enable helpful, but potentially expensive runtime checks +config :phoenix_live_view, + enable_expensive_runtime_checks: true diff --git a/lib/vishnya.ex b/lib/vishnya.ex new file mode 100644 index 0000000..200b1b9 --- /dev/null +++ b/lib/vishnya.ex @@ -0,0 +1,9 @@ +defmodule Vishnya do + @moduledoc """ + Vishnya keeps the contexts that define your domain + and business logic. + + Contexts are also responsible for managing your data, regardless + if it comes from the database, an external API or others. + """ +end diff --git a/lib/vishnya/accounts.ex b/lib/vishnya/accounts.ex new file mode 100644 index 0000000..9d6c1d6 --- /dev/null +++ b/lib/vishnya/accounts.ex @@ -0,0 +1,58 @@ +defmodule Vishnya.Accounts do + alias Vishnya.Repo + alias Vishnya.Accounts.User + import Bcrypt, only: [hash_pwd_salt: 1, verify_pass: 2] + import :crypto, only: [strong_rand_bytes: 1] + + @token_length 18 + + def create_user(%{"username" => username, "password" => password}) do + user_id = generate_user_id() + password_hash = hash_pwd_salt(password) + token = generate_token(user_id, password_hash) + IO.inspect(token) + + %User{} + |> User.changeset(%{username: username, password_hash: password_hash, user_id: user_id, token: token}) + |> Repo.insert() + end + + def authenticate_user(username, password) do + user = Repo.get_by(User, username: username) + + if user && verify_pass(password, user.password_hash) do + {:ok, user} + else + :error + end + end + + def delete_user(identifier) when is_binary(identifier) do + user = Repo.get_by(User, username: identifier) || Repo.get_by(User, user_id: identifier) + + case user do + nil -> + {:error, "User not found"} + _user -> + Repo.delete(user) + {:ok, "User deleted successfully"} + end + end + + def authenticate_user(token) do + Repo.get_by(User, token: token) + end + + defp generate_user_id do + :crypto.strong_rand_bytes(18) + |> Base.url_encode64() + |> binary_part(0, 18) + end + + defp generate_token(user_id, password_hash) do + random_string = :crypto.strong_rand_bytes(9) |> Base.url_encode64() + last_half_hash = binary_part(password_hash, div(byte_size(password_hash), 2), byte_size(password_hash) - div(byte_size(password_hash), 2)) + + user_id <> last_half_hash <> random_string |> Base.encode16(case: :lower) + end +end diff --git a/lib/vishnya/accounts/user.ex b/lib/vishnya/accounts/user.ex new file mode 100644 index 0000000..b1594af --- /dev/null +++ b/lib/vishnya/accounts/user.ex @@ -0,0 +1,25 @@ +defmodule Vishnya.Accounts.User do + use Ecto.Schema + import Ecto.Changeset + + schema "users" do + field :username, :string + field :password_hash, :string + field :user_id, :string + field :token, :string + + timestamps() + end + + @doc false + def changeset(user, attrs) do + user + |> cast(attrs, [:username, :password_hash, :user_id, :token]) + |> validate_required([:username, :password_hash, :user_id, :token]) + |> validate_length(:username, max: 12) + |> validate_format(:username, ~r/^[a-z0-9]+$/, message: "must be lowercase letters and numbers") + |> unique_constraint(:username) + |> unique_constraint(:user_id) + |> unique_constraint(:token) + end +end diff --git a/lib/vishnya/application.ex b/lib/vishnya/application.ex new file mode 100644 index 0000000..53b3e72 --- /dev/null +++ b/lib/vishnya/application.ex @@ -0,0 +1,68 @@ +defmodule Vishnya.Application do + # See https://hexdocs.pm/elixir/Application.html + # for more information on OTP Applications + @moduledoc false + + use Application + + @impl true + def start(_type, _args) do + children = [ + VishnyaWeb.Telemetry, + Vishnya.Repo, + {DNSCluster, query: Application.get_env(:vishnya, :dns_cluster_query) || :ignore}, + {Phoenix.PubSub, name: Vishnya.PubSub}, + # Start the Finch HTTP client for sending emails + {Finch, name: Vishnya.Finch}, + # Start a worker by calling: Vishnya.Worker.start_link(arg) + # {Vishnya.Worker, arg}, + # Start to serve requests, typically the last entry + VishnyaWeb.Endpoint + ] + + # See https://hexdocs.pm/elixir/Supervisor.html + # for other strategies and supported options + opts = [strategy: :one_for_one, name: Vishnya.Supervisor] + #Supervisor.start_link(children, opts) + case Supervisor.start_link(children, opts) do + {:ok, pid} -> + Task.start(fn -> create_default_admin_user() end) + {:ok, pid} + {:error, reason} -> + IO.puts("Failed to start supervisor: #{inspect(reason)}") + {:stop, reason} + end + end + + # Tell Phoenix to update the endpoint configuration + # whenever the application is updated. + @impl true + def config_change(changed, _new, removed) do + VishnyaWeb.Endpoint.config_change(changed, removed) + :ok + end + + defp create_default_admin_user do + admin_credentials = Application.get_env(:vishnya, :admin_credentials) + + username = Keyword.get(admin_credentials, :username) + password = Keyword.get(admin_credentials, :password) + + if !user_exists?(username) do + Vishnya.Accounts.create_user(%{ + "username" => username, + "password" => password + }) + IO.puts("Default admin user created.") + else + IO.puts("Default admin user already exists.") + end + end + + defp user_exists?(username) do + case Vishnya.Repo.get_by(Vishnya.Accounts.User, username: username) do + nil -> false + _user -> true + end + end +end diff --git a/lib/vishnya/mailer.ex b/lib/vishnya/mailer.ex new file mode 100644 index 0000000..3d5d67b --- /dev/null +++ b/lib/vishnya/mailer.ex @@ -0,0 +1,3 @@ +defmodule Vishnya.Mailer do + use Swoosh.Mailer, otp_app: :vishnya +end diff --git a/lib/vishnya/repo.ex b/lib/vishnya/repo.ex new file mode 100644 index 0000000..cba2598 --- /dev/null +++ b/lib/vishnya/repo.ex @@ -0,0 +1,5 @@ +defmodule Vishnya.Repo do + use Ecto.Repo, + otp_app: :vishnya, + adapter: Ecto.Adapters.Postgres +end diff --git a/lib/vishnya/user.ex b/lib/vishnya/user.ex new file mode 100644 index 0000000..972e960 --- /dev/null +++ b/lib/vishnya/user.ex @@ -0,0 +1,23 @@ +defmodule Vishnya.User do + use Ecto.Schema + import Ecto.Changeset + + schema "users" do + field :password_hash, :string + field :token, :string + field :user_id, :string + field :username, :string + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(user, attrs) do + user + |> cast(attrs, [:username, :password_hash, :user_id, :token]) + |> validate_required([:username, :password_hash, :user_id, :token]) + |> unique_constraint(:token) + |> unique_constraint(:user_id) + |> unique_constraint(:username) + end +end diff --git a/lib/vishnya_web.ex b/lib/vishnya_web.ex new file mode 100644 index 0000000..7055c83 --- /dev/null +++ b/lib/vishnya_web.ex @@ -0,0 +1,113 @@ +defmodule VishnyaWeb do + @moduledoc """ + The entrypoint for defining your web interface, such + as controllers, components, channels, and so on. + + This can be used in your application as: + + use VishnyaWeb, :controller + use VishnyaWeb, :html + + The definitions below will be executed for every controller, + component, etc, so keep them short and clean, focused + on imports, uses and aliases. + + Do NOT define functions inside the quoted expressions + below. Instead, define additional modules and import + those modules here. + """ + + def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) + + def router do + quote do + use Phoenix.Router, helpers: false + + # Import common connection and controller functions to use in pipelines + import Plug.Conn + import Phoenix.Controller + import Phoenix.LiveView.Router + end + end + + def channel do + quote do + use Phoenix.Channel + end + end + + def controller do + quote do + use Phoenix.Controller, + formats: [:html, :json], + layouts: [html: VishnyaWeb.Layouts] + + import Plug.Conn + import VishnyaWeb.Gettext + + unquote(verified_routes()) + end + end + + def live_view do + quote do + use Phoenix.LiveView, + layout: {VishnyaWeb.Layouts, :app} + + unquote(html_helpers()) + end + end + + def live_component do + quote do + use Phoenix.LiveComponent + + unquote(html_helpers()) + end + end + + def html do + quote do + use Phoenix.Component + + # Import convenience functions from controllers + import Phoenix.Controller, + only: [get_csrf_token: 0, view_module: 1, view_template: 1] + + # Include general helpers for rendering HTML + unquote(html_helpers()) + end + end + + defp html_helpers do + quote do + # HTML escaping functionality + import Phoenix.HTML + # Core UI components and translation + import VishnyaWeb.CoreComponents + import VishnyaWeb.Gettext + + # Shortcut for generating JS commands + alias Phoenix.LiveView.JS + + # Routes generation with the ~p sigil + unquote(verified_routes()) + end + end + + def verified_routes do + quote do + use Phoenix.VerifiedRoutes, + endpoint: VishnyaWeb.Endpoint, + router: VishnyaWeb.Router, + statics: VishnyaWeb.static_paths() + end + end + + @doc """ + When used, dispatch to the appropriate controller/live_view/etc. + """ + defmacro __using__(which) when is_atom(which) do + apply(__MODULE__, which, []) + end +end diff --git a/lib/vishnya_web/components/core_components.ex b/lib/vishnya_web/components/core_components.ex new file mode 100644 index 0000000..3ddf506 --- /dev/null +++ b/lib/vishnya_web/components/core_components.ex @@ -0,0 +1,694 @@ +defmodule VishnyaWeb.CoreComponents do + @moduledoc """ + Provides core UI components. + + At first glance, this module may seem daunting, but its goal is to provide + core building blocks for your application, such as modals, tables, and + forms. The components consist mostly of markup and are well-documented + with doc strings and declarative assigns. You may customize and style + them in any way you want, based on your application growth and needs. + + The default components use Tailwind CSS, a utility-first CSS framework. + See the [Tailwind CSS documentation](https://tailwindcss.com) to learn + how to customize them or feel free to swap in another framework altogether. + + Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage. + """ + use Phoenix.Component + + alias Phoenix.LiveView.JS + import VishnyaWeb.Gettext + + @doc """ + Renders a modal. + + ## Examples + + <.modal id="confirm-modal"> + This is a modal. + + + JS commands may be passed to the `:on_cancel` to configure + the closing/cancel event, for example: + + <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}> + This is another modal. + + + """ + attr :id, :string, required: true + attr :show, :boolean, default: false + attr :on_cancel, JS, default: %JS{} + slot :inner_block, required: true + + def modal(assigns) do + ~H""" + + """ + end + + def input(%{type: "select"} = assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + def input(%{type: "textarea"} = assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + # All other inputs text, datetime-local, url, password, etc. are handled here... + def input(assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + @doc """ + Renders a label. + """ + attr :for, :string, default: nil + slot :inner_block, required: true + + def label(assigns) do + ~H""" + + """ + end + + @doc """ + Generates a generic error message. + """ + slot :inner_block, required: true + + def error(assigns) do + ~H""" +

+ <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" /> + <%= render_slot(@inner_block) %> +

+ """ + end + + @doc """ + Renders a header with title. + """ + attr :class, :string, default: nil + + slot :inner_block, required: true + slot :subtitle + slot :actions + + def header(assigns) do + ~H""" +
+
+

+ <%= render_slot(@inner_block) %> +

+

+ <%= render_slot(@subtitle) %> +

+
+
<%= render_slot(@actions) %>
+
+ """ + end + + @doc ~S""" + Renders a table with generic styling. + + ## Examples + + <.table id="users" rows={@users}> + <:col :let={user} label="id"><%= user.id %> + <:col :let={user} label="username"><%= user.username %> + + """ + attr :id, :string, required: true + attr :rows, :list, required: true + attr :row_id, :any, default: nil, doc: "the function for generating the row id" + attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row" + + attr :row_item, :any, + default: &Function.identity/1, + doc: "the function for mapping each row before calling the :col and :action slots" + + slot :col, required: true do + attr :label, :string + end + + slot :action, doc: "the slot for showing user actions in the last table column" + + def table(assigns) do + assigns = + with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do + assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end) + end + + ~H""" +
+ + + + + + + + + + + + + +
<%= col[:label] %> + <%= gettext("Actions") %> +
+
+ + + <%= render_slot(col, @row_item.(row)) %> + +
+
+
+ + + <%= render_slot(action, @row_item.(row)) %> + +
+
+
+ """ + end + + @doc """ + Renders a data list. + + ## Examples + + <.list> + <:item title="Title"><%= @post.title %> + <:item title="Views"><%= @post.views %> + + """ + slot :item, required: true do + attr :title, :string, required: true + end + + def list(assigns) do + ~H""" +
+
+
+
<%= item.title %>
+
<%= render_slot(item) %>
+
+
+
+ """ + end + + @doc """ + Renders a back navigation link. + + ## Examples + + <.back navigate={~p"/posts"}>Back to posts + """ + attr :navigate, :any, required: true + slot :inner_block, required: true + + def back(assigns) do + ~H""" +
+ <.link + navigate={@navigate} + class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700" + > + <.icon name="hero-arrow-left-solid" class="h-3 w-3" /> + <%= render_slot(@inner_block) %> + +
+ """ + end + + @doc """ + Renders a [Heroicon](https://heroicons.com). + + Heroicons come in three styles – outline, solid, and mini. + By default, the outline style is used, but solid and mini may + be applied by using the `-solid` and `-mini` suffix. + + You can customize the size and colors of the icons by setting + width, height, and background color classes. + + Icons are extracted from the `deps/heroicons` directory and bundled within + your compiled app.css by the plugin in your `assets/tailwind.config.js`. + + ## Examples + + <.icon name="hero-x-mark-solid" /> + <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" /> + """ + attr :name, :string, required: true + attr :class, :string, default: nil + + def icon(%{name: "hero-" <> _} = assigns) do + ~H""" + + """ + end + + ## JS Commands + + def show(js \\ %JS{}, selector) do + JS.show(js, + to: selector, + time: 300, + transition: + {"transition-all transform ease-out duration-300", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", + "opacity-100 translate-y-0 sm:scale-100"} + ) + end + + def hide(js \\ %JS{}, selector) do + JS.hide(js, + to: selector, + time: 200, + transition: + {"transition-all transform ease-in duration-200", + "opacity-100 translate-y-0 sm:scale-100", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"} + ) + end + + def show_modal(js \\ %JS{}, id) when is_binary(id) do + js + |> JS.show(to: "##{id}") + |> JS.show( + to: "##{id}-bg", + time: 300, + transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"} + ) + |> show("##{id}-container") + |> JS.add_class("overflow-hidden", to: "body") + |> JS.focus_first(to: "##{id}-content") + end + + def hide_modal(js \\ %JS{}, id) do + js + |> JS.hide( + to: "##{id}-bg", + transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"} + ) + |> hide("##{id}-container") + |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"}) + |> JS.remove_class("overflow-hidden", to: "body") + |> JS.pop_focus() + end + + @doc """ + Translates an error message using gettext. + """ + def translate_error({msg, opts}) do + # When using gettext, we typically pass the strings we want + # to translate as a static argument: + # + # # Translate the number of files with plural rules + # dngettext("errors", "1 file", "%{count} files", count) + # + # However the error messages in our forms and APIs are generated + # dynamically, so we need to translate them by calling Gettext + # with our gettext backend as first argument. Translations are + # available in the errors.po file (as we use the "errors" domain). + if count = opts[:count] do + Gettext.dngettext(VishnyaWeb.Gettext, "errors", msg, msg, count, opts) + else + Gettext.dgettext(VishnyaWeb.Gettext, "errors", msg, opts) + end + end + + @doc """ + Translates the errors for a field from a keyword list of errors. + """ + def translate_errors(errors, field) when is_list(errors) do + for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts}) + end +end diff --git a/lib/vishnya_web/components/layouts.ex b/lib/vishnya_web/components/layouts.ex new file mode 100644 index 0000000..e188863 --- /dev/null +++ b/lib/vishnya_web/components/layouts.ex @@ -0,0 +1,14 @@ +defmodule VishnyaWeb.Layouts do + @moduledoc """ + This module holds different layouts used by your application. + + See the `layouts` directory for all templates available. + The "root" layout is a skeleton rendered as part of the + application router. The "app" layout is set as the default + layout on both `use VishnyaWeb, :controller` and + `use VishnyaWeb, :live_view`. + """ + use VishnyaWeb, :html + + embed_templates "layouts/*" +end diff --git a/lib/vishnya_web/components/layouts/app.html.heex b/lib/vishnya_web/components/layouts/app.html.heex new file mode 100644 index 0000000..ca83831 --- /dev/null +++ b/lib/vishnya_web/components/layouts/app.html.heex @@ -0,0 +1,56 @@ +
+
+
+ + + +

+ v<%= Application.spec(:vishnya, :vsn) %> +

+
+ <%= if Phoenix.Controller.current_path(@conn) == "/" do %> + + <% else %> + <%= if Phoenix.Controller.current_path(@conn) == "/dashboard" do %> + + + <% end %> + <% end %> +
+
+
+
+ <.flash_group flash={@flash} /> + <%= @inner_content %> +
+
diff --git a/lib/vishnya_web/components/layouts/root.html.heex b/lib/vishnya_web/components/layouts/root.html.heex new file mode 100644 index 0000000..d8f2ab4 --- /dev/null +++ b/lib/vishnya_web/components/layouts/root.html.heex @@ -0,0 +1,17 @@ + + + + + + + <.live_title suffix=" · Меридиан"> + <%= assigns[:page_title] || "Vishnya" %> + + + + + + <%= @inner_content %> + + diff --git a/lib/vishnya_web/controllers/auth_controller.ex b/lib/vishnya_web/controllers/auth_controller.ex new file mode 100644 index 0000000..7f02b37 --- /dev/null +++ b/lib/vishnya_web/controllers/auth_controller.ex @@ -0,0 +1,38 @@ +defmodule VishnyaWeb.AuthController do + use VishnyaWeb, :controller + alias Vishnya.Accounts + + def authenticate_user(conn, %{"username" => username, "password" => password} = params) do + remember = Map.get(params, "remember") == "on" + + IO.inspect(remember) + + case Accounts.authenticate_user(username, password) do + {:ok, user} -> + conn + |> put_flash(:info, "Signed in successfully!") + |> put_resp_cookie("auth_token", user.token, max_age: if(remember, do: 60 * 60 * 24 * 30, else: nil)) + |> redirect(to: "/dashboard") + + :error -> + conn + |> put_flash(:error, "Invalid username or password.") + |> redirect(to: "/sign_in") + end + end + + def authenticate_user(conn, %{"token" => token}) do + case Accounts.authenticate_user(token) do + nil -> + conn + |> put_flash(:error, "Invalid session token.") + |> redirect(to: "/sign_in") + + user -> + conn + |> put_flash(:info, "Loaded session token.") + |> put_resp_cookie("auth_token", user.token, max_age: 60 * 60 * 24 * 30) + |> redirect(to: "/dashboard") + end + end +end diff --git a/lib/vishnya_web/controllers/error_html.ex b/lib/vishnya_web/controllers/error_html.ex new file mode 100644 index 0000000..9358f2a --- /dev/null +++ b/lib/vishnya_web/controllers/error_html.ex @@ -0,0 +1,24 @@ +defmodule VishnyaWeb.ErrorHTML do + @moduledoc """ + This module is invoked by your endpoint in case of errors on HTML requests. + + See config/config.exs. + """ + use VishnyaWeb, :html + + # If you want to customize your error pages, + # uncomment the embed_templates/1 call below + # and add pages to the error directory: + # + # * lib/vishnya_web/controllers/error_html/404.html.heex + # * lib/vishnya_web/controllers/error_html/500.html.heex + # + # embed_templates "error_html/*" + + # The default is to render a plain text page based on + # the template name. For example, "404.html" becomes + # "Not Found". + def render(template, _assigns) do + Phoenix.Controller.status_message_from_template(template) + end +end diff --git a/lib/vishnya_web/controllers/error_json.ex b/lib/vishnya_web/controllers/error_json.ex new file mode 100644 index 0000000..9c999c1 --- /dev/null +++ b/lib/vishnya_web/controllers/error_json.ex @@ -0,0 +1,21 @@ +defmodule VishnyaWeb.ErrorJSON do + @moduledoc """ + This module is invoked by your endpoint in case of errors on JSON requests. + + See config/config.exs. + """ + + # If you want to customize a particular status code, + # you may add your own clauses, such as: + # + # def render("500.json", _assigns) do + # %{errors: %{detail: "Internal Server Error"}} + # end + + # By default, Phoenix returns the status message from + # the template name. For example, "404.json" becomes + # "Not Found". + def render(template, _assigns) do + %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}} + end +end diff --git a/lib/vishnya_web/controllers/message_controller.ex b/lib/vishnya_web/controllers/message_controller.ex new file mode 100644 index 0000000..b11be7a --- /dev/null +++ b/lib/vishnya_web/controllers/message_controller.ex @@ -0,0 +1,15 @@ +defmodule VishnyaWeb.MessageController do + use VishnyaWeb, :controller + + def messages(conn, params) do + #user = conn.assigns[:user] + + #if user do + # json(conn, %{name: "meow"}) + #else + # send_resp(conn, 401, "Incorrect token") + #end + id = params["id"] + json(conn, %{name: "meow", id: id}) + end +end diff --git a/lib/vishnya_web/controllers/page_controller.ex b/lib/vishnya_web/controllers/page_controller.ex new file mode 100644 index 0000000..59ed746 --- /dev/null +++ b/lib/vishnya_web/controllers/page_controller.ex @@ -0,0 +1,19 @@ +defmodule VishnyaWeb.PageController do + use VishnyaWeb, :controller + + #def authenticate_user(username, password) do + # username == "admin" and password == "admin" + #end + + def home(conn, _params) do + render(conn, :home) + end + + def sign_in(conn, _params) do + render(conn, :sign_in) + end + + def dashboard(conn, _params) do + render(conn, :dashboard) #, layout: false) + end +end diff --git a/lib/vishnya_web/controllers/page_html.ex b/lib/vishnya_web/controllers/page_html.ex new file mode 100644 index 0000000..2346e94 --- /dev/null +++ b/lib/vishnya_web/controllers/page_html.ex @@ -0,0 +1,10 @@ +defmodule VishnyaWeb.PageHTML do + @moduledoc """ + This module contains pages rendered by PageController. + + See the `page_html` directory for all templates available. + """ + use VishnyaWeb, :html + + embed_templates "page_html/*" +end diff --git a/lib/vishnya_web/controllers/page_html/dashboard.html.heex b/lib/vishnya_web/controllers/page_html/dashboard.html.heex new file mode 100644 index 0000000..c552ce7 --- /dev/null +++ b/lib/vishnya_web/controllers/page_html/dashboard.html.heex @@ -0,0 +1,176 @@ +<% auth_token = Map.get(@conn.cookies, "auth_token", "") %> +
+ + +
+<%= if auth_token == "" do %> + +<% end %> + +
+

Vishnya Database

+
+ + +
+
+
+ Profile Picture +
+

Username: killcomgrls - gumbobrot., hackermen187

+

Display names: 3xc, rawr, lewd gamer 1, skibid rizzlington

+

User ID: 1283531827688247371

+

Created: Wed, 11 Sep 2024 20:57:14 UTC

+

Banner: #d8d8d8

+
+
+ +
+
+
+ Profile Picture

Dating central

+
+
+
+ + 210 +
+
+ + 698 +
+
+
+
+
+ + 125 +
+
+ + 76 +
+
+
+ +
+
+
+ +
+
+ Profile Picture

IDA Pro Chinese

+
+
+
+ + 1238 +
+
+ + 11069 +
+
+
+
+
+ + 24 +
+
+ + 3 +
+
+
+ +
+
+
+
+
+
+
+

November 3, 2024: 163 captured messages, 0 videos, 3 pictures, 9 voice messages

+ + + +
+ +
+
+
+

November 4, 2024: 12 captured messages, 2 videos, 1 pictures, 0 voice messages

+ + + +
+ +
+
+
+
+ + diff --git a/lib/vishnya_web/controllers/page_html/home.html.heex b/lib/vishnya_web/controllers/page_html/home.html.heex new file mode 100644 index 0000000..17e29e4 --- /dev/null +++ b/lib/vishnya_web/controllers/page_html/home.html.heex @@ -0,0 +1,17 @@ +<% + images = ["rawr.png", "love.png", "meow.png"] + random_image = Enum.random(images) +%> + +
+
+ Logo +
+
+ Vishnya +
+
+ Cyber reconnaissance & Intelligence-Gathering network +
+
+ diff --git a/lib/vishnya_web/controllers/page_html/sign_in.html.heex b/lib/vishnya_web/controllers/page_html/sign_in.html.heex new file mode 100644 index 0000000..9d05cc3 --- /dev/null +++ b/lib/vishnya_web/controllers/page_html/sign_in.html.heex @@ -0,0 +1,38 @@ +<% auth_token = Map.get(@conn.cookies, "auth_token", "") %> +
+ + +
+<%= if auth_token != "" do %> + +<% end %> + +
+

Sign In

+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+
+ diff --git a/lib/vishnya_web/controllers/plugs/authenticate.ex b/lib/vishnya_web/controllers/plugs/authenticate.ex new file mode 100644 index 0000000..6728642 --- /dev/null +++ b/lib/vishnya_web/controllers/plugs/authenticate.ex @@ -0,0 +1,31 @@ +defmodule VishnyaWeb.Plugs.Authenticate do + import Plug.Conn + alias Vishnya.Repo + alias Vishnya.Accounts.User + + def init(default), do: default + + def call(conn, _default) do + case get_req_header(conn, "authorization") do + ["Bearer " <> token] -> + case authenticate_token(token) do + nil -> + conn + |> send_resp(401, "Unauthorized") + |> halt() + + user -> + assign(conn, :user, user) + end + + _ -> + conn + |> send_resp(401, "Unauthorized") + |> halt() + end + end + + defp authenticate_token(token) do + Repo.get_by(User, token: token) + end +end diff --git a/lib/vishnya_web/endpoint.ex b/lib/vishnya_web/endpoint.ex new file mode 100644 index 0000000..d779d7c --- /dev/null +++ b/lib/vishnya_web/endpoint.ex @@ -0,0 +1,54 @@ +defmodule VishnyaWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :vishnya + + # The session will be stored in the cookie and signed, + # this means its contents can be read but not tampered with. + # Set :encryption_salt if you would also like to encrypt it. + @session_options [ + store: :cookie, + key: "_vishnya_key", + signing_salt: "mm7*J8*ci@7h<73:V&v;T[8k:f<>TxH43V.Gu+tN!Z/NUeAv6{eT5FT`+~kHuHi", + encryption_salt: "HcUq4R32h9ayxwE.fr7ARueb0n.}.4OmIHDFY@e%oAnKe-`4V1VvYw3ltyK@yWc", + same_site: "Lax" + ] + + socket "/live", Phoenix.LiveView.Socket, + websocket: [connect_info: [session: @session_options]], + longpoll: [connect_info: [session: @session_options]] + + # Serve at "/" the static files from "priv/static" directory. + # + # You should set gzip to true if you are running phx.digest + # when deploying your static files in production. + plug Plug.Static, + at: "/", + from: :vishnya, + gzip: false, + only: VishnyaWeb.static_paths() + + # Code reloading can be explicitly enabled under the + # :code_reloader configuration of your endpoint. + if code_reloading? do + socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket + plug Phoenix.LiveReloader + plug Phoenix.CodeReloader + plug Phoenix.Ecto.CheckRepoStatus, otp_app: :vishnya + end + + plug Phoenix.LiveDashboard.RequestLogger, + param_key: "request_logger", + cookie_key: "request_logger" + + plug Plug.RequestId + plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] + + plug Plug.Parsers, + parsers: [:urlencoded, :multipart, :json], + pass: ["*/*"], + json_decoder: Phoenix.json_library() + + plug Plug.MethodOverride + plug Plug.Head + plug Plug.Session, @session_options + plug VishnyaWeb.Router +end diff --git a/lib/vishnya_web/gettext.ex b/lib/vishnya_web/gettext.ex new file mode 100644 index 0000000..6d33e13 --- /dev/null +++ b/lib/vishnya_web/gettext.ex @@ -0,0 +1,24 @@ +defmodule VishnyaWeb.Gettext do + @moduledoc """ + A module providing Internationalization with a gettext-based API. + + By using [Gettext](https://hexdocs.pm/gettext), + your module gains a set of macros for translations, for example: + + import VishnyaWeb.Gettext + + # Simple translation + gettext("Here is the string to translate") + + # Plural translation + ngettext("Here is the string to translate", + "Here are the strings to translate", + 3) + + # Domain-based translation + dgettext("errors", "Here is the error message to translate") + + See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. + """ + use Gettext, otp_app: :vishnya +end diff --git a/lib/vishnya_web/router.ex b/lib/vishnya_web/router.ex new file mode 100644 index 0000000..13d8b47 --- /dev/null +++ b/lib/vishnya_web/router.ex @@ -0,0 +1,54 @@ +defmodule VishnyaWeb.Router do + use VishnyaWeb, :router + + pipeline :browser do + plug :accepts, ["html"] + plug :fetch_session + plug :fetch_live_flash + plug :put_root_layout, html: {VishnyaWeb.Layouts, :root} + plug :protect_from_forgery + plug :put_secure_browser_headers + end + + pipeline :api do + plug :accepts, ["json"] + plug VishnyaWeb.Plugs.Authenticate + end + + scope "/api", VishnyaWeb do + pipe_through :api + + get "/messages", MessageController, :messages + end + + scope "/", VishnyaWeb do + pipe_through :browser + + get "/", PageController, :home + get "/sign_in", PageController, :sign_in + post "/sign_in", AuthController, :authenticate_user + get "/dashboard", PageController, :dashboard + end + + # Other scopes may use custom stacks. + # scope "/api", VishnyaWeb do + # pipe_through :api + # end + + # Enable LiveDashboard and Swoosh mailbox preview in development + if Application.compile_env(:vishnya, :dev_routes) do + # If you want to use the LiveDashboard in production, you should put + # it behind authentication and allow only admins to access it. + # If your application does not have an admins-only section yet, + # you can use Plug.BasicAuth to set up some basic authentication + # as long as you are also using SSL (which you should anyway). + import Phoenix.LiveDashboard.Router + + scope "/dev" do + pipe_through :browser + + live_dashboard "/dashboard", metrics: VishnyaWeb.Telemetry + forward "/mailbox", Plug.Swoosh.MailboxPreview + end + end +end diff --git a/lib/vishnya_web/telemetry.ex b/lib/vishnya_web/telemetry.ex new file mode 100644 index 0000000..7d3b355 --- /dev/null +++ b/lib/vishnya_web/telemetry.ex @@ -0,0 +1,92 @@ +defmodule VishnyaWeb.Telemetry do + use Supervisor + import Telemetry.Metrics + + def start_link(arg) do + Supervisor.start_link(__MODULE__, arg, name: __MODULE__) + end + + @impl true + def init(_arg) do + children = [ + # Telemetry poller will execute the given period measurements + # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics + {:telemetry_poller, measurements: periodic_measurements(), period: 10_000} + # Add reporters as children of your supervision tree. + # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + def metrics do + [ + # Phoenix Metrics + summary("phoenix.endpoint.start.system_time", + unit: {:native, :millisecond} + ), + summary("phoenix.endpoint.stop.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.start.system_time", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.exception.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.stop.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.socket_connected.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.channel_joined.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.channel_handled_in.duration", + tags: [:event], + unit: {:native, :millisecond} + ), + + # Database Metrics + summary("vishnya.repo.query.total_time", + unit: {:native, :millisecond}, + description: "The sum of the other measurements" + ), + summary("vishnya.repo.query.decode_time", + unit: {:native, :millisecond}, + description: "The time spent decoding the data received from the database" + ), + summary("vishnya.repo.query.query_time", + unit: {:native, :millisecond}, + description: "The time spent executing the query" + ), + summary("vishnya.repo.query.queue_time", + unit: {:native, :millisecond}, + description: "The time spent waiting for a database connection" + ), + summary("vishnya.repo.query.idle_time", + unit: {:native, :millisecond}, + description: + "The time the connection spent waiting before being checked out for the query" + ), + + # VM Metrics + summary("vm.memory.total", unit: {:byte, :kilobyte}), + summary("vm.total_run_queue_lengths.total"), + summary("vm.total_run_queue_lengths.cpu"), + summary("vm.total_run_queue_lengths.io") + ] + end + + defp periodic_measurements do + [ + # A module, function and arguments to be invoked periodically. + # This function must call :telemetry.execute/3 and a metric must be added above. + # {VishnyaWeb, :count_users, []} + ] + end +end diff --git a/mix.exs b/mix.exs new file mode 100644 index 0000000..7ad1390 --- /dev/null +++ b/mix.exs @@ -0,0 +1,88 @@ +defmodule Vishnya.MixProject do + use Mix.Project + + def project do + [ + app: :vishnya, + version: "0.1.0", + elixir: "~> 1.14", + elixirc_paths: elixirc_paths(Mix.env()), + start_permanent: Mix.env() == :prod, + aliases: aliases(), + deps: deps() + ] + end + + # Configuration for the OTP application. + # + # Type `mix help compile.app` for more information. + def application do + [ + mod: {Vishnya.Application, []}, + extra_applications: [:logger, :runtime_tools] + ] + end + + # Specifies which paths to compile per environment. + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + + # Specifies your project dependencies. + # + # Type `mix help deps` for examples and options. + defp deps do + [ + {:phoenix, "~> 1.7.14"}, + {:phoenix_ecto, "~> 4.5"}, + {:ecto_sql, "~> 3.10"}, + {:postgrex, ">= 0.0.0"}, + {:phoenix_html, "~> 4.1"}, + {:phoenix_live_reload, "~> 1.2", only: :dev}, + # TODO bump on release to {:phoenix_live_view, "~> 1.0.0"}, + {:phoenix_live_view, "~> 1.0.0-rc.1", override: true}, + {:floki, ">= 0.30.0", only: :test}, + {:phoenix_live_dashboard, "~> 0.8.3"}, + {:esbuild, "~> 0.8", runtime: Mix.env() == :dev}, + {:tailwind, "~> 0.2", runtime: Mix.env() == :dev}, + {:heroicons, + github: "tailwindlabs/heroicons", + tag: "v2.1.1", + sparse: "optimized", + app: false, + compile: false, + depth: 1}, + {:swoosh, "~> 1.5"}, + {:finch, "~> 0.13"}, + {:telemetry_metrics, "~> 1.0"}, + {:telemetry_poller, "~> 1.0"}, + {:gettext, "~> 0.20"}, + {:jason, "~> 1.2"}, + {:dns_cluster, "~> 0.1.1"}, + {:bandit, "~> 1.5"}, + {:comeonin, "~> 5.5"}, + {:bcrypt_elixir, "~> 3.2"} + ] + end + + # Aliases are shortcuts or tasks specific to the current project. + # For example, to install project dependencies and perform other setup tasks, run: + # + # $ mix setup + # + # See the documentation for `Mix` for more info on aliases. + defp aliases do + [ + setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"], + "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], + "ecto.reset": ["ecto.drop", "ecto.setup"], + test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], + "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], + "assets.build": ["tailwind vishnya", "esbuild vishnya"], + "assets.deploy": [ + "tailwind vishnya --minify", + "esbuild vishnya --minify", + "phx.digest" + ] + ] + end +end diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..c08bd9f --- /dev/null +++ b/mix.lock @@ -0,0 +1,44 @@ +%{ + "bandit": {:hex, :bandit, "1.5.7", "6856b1e1df4f2b0cb3df1377eab7891bec2da6a7fd69dc78594ad3e152363a50", [:mix], [{:hpax, "~> 1.0.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "f2dd92ae87d2cbea2fa9aa1652db157b6cba6c405cb44d4f6dd87abba41371cd"}, + "bcrypt_elixir": {:hex, :bcrypt_elixir, "3.2.0", "feab711974beba4cb348147170346fe097eea2e840db4e012a145e180ed4ab75", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "563e92a6c77d667b19c5f4ba17ab6d440a085696bdf4c68b9b0f5b30bc5422b8"}, + "castore": {:hex, :castore, "1.0.9", "5cc77474afadf02c7c017823f460a17daa7908e991b0cc917febc90e466a375c", [:mix], [], "hexpm", "5ea956504f1ba6f2b4eb707061d8e17870de2bee95fb59d512872c2ef06925e7"}, + "comeonin": {:hex, :comeonin, "5.5.0", "364d00df52545c44a139bad919d7eacb55abf39e86565878e17cebb787977368", [:mix], [], "hexpm", "6287fc3ba0aad34883cbe3f7949fc1d1e738e5ccdce77165bc99490aa69f47fb"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, + "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, + "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, + "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, + "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, + "elixir_make": {:hex, :elixir_make, "0.8.4", "4960a03ce79081dee8fe119d80ad372c4e7badb84c493cc75983f9d3bc8bde0f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "6e7f1d619b5f61dfabd0a20aa268e575572b542ac31723293a4c1a567d5ef040"}, + "esbuild": {:hex, :esbuild, "0.8.2", "5f379dfa383ef482b738e7771daf238b2d1cfb0222bef9d3b20d4c8f06c7a7ac", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "558a8a08ed78eb820efbfda1de196569d8bfa9b51e8371a1934fbb31345feda7"}, + "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, + "file_system": {:hex, :file_system, "1.0.1", "79e8ceaddb0416f8b8cd02a0127bdbababe7bf4a23d2a395b983c1f8b3f73edd", [:mix], [], "hexpm", "4414d1f38863ddf9120720cd976fce5bdde8e91d8283353f0e31850fa89feb9e"}, + "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, + "floki": {:hex, :floki, "0.36.3", "1102f93b16a55bc5383b85ae3ec470f82dee056eaeff9195e8afdf0ef2a43c30", [:mix], [], "hexpm", "fe0158bff509e407735f6d40b3ee0d7deb47f3f3ee7c6c182ad28599f9f6b27a"}, + "gettext": {:hex, :gettext, "0.26.1", "38e14ea5dcf962d1fc9f361b63ea07c0ce715a8ef1f9e82d3dfb8e67e0416715", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "01ce56f188b9dc28780a52783d6529ad2bc7124f9744e571e1ee4ea88bf08734"}, + "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]}, + "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"}, + "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.4", "4508e481f791ce62ec6a096e13b061387158cbeefacca68c6c1928e1305e23ed", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "2984aae96994fbc5c61795a73b8fb58153b41ff934019cfb522343d2d3817d59"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.0-rc.7", "d2abca526422adea88896769529addb6443390b1d4f1ff9cbe694312d8875fb2", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b82a4575f6f3eb5b97922ec6874b0c52b3ca0cc5dcb4b14ddc478cbfa135dd01"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, + "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, + "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, + "postgrex": {:hex, :postgrex, "0.19.2", "34d6884a332c7bf1e367fc8b9a849d23b43f7da5c6e263def92784d03f9da468", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "618988886ab7ae8561ebed9a3c7469034bf6a88b8995785a3378746a4b9835ec"}, + "swoosh": {:hex, :swoosh, "1.17.3", "5cda7bff6bc1121cc5b58db8ed90ef33261b373425ae3e32dd599688037a0482", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "14ad57cfbb70af57323e17f569f5840a33c01f8ebc531dd3846beef3c9c95e55"}, + "tailwind": {:hex, :tailwind, "0.2.4", "5706ec47182d4e7045901302bf3a333e80f3d1af65c442ba9a9eed152fb26c2e", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "c6e4a82b8727bab593700c998a4d98cf3d8025678bfde059aed71d0000c3e463"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, + "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, + "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.7", "65fa74042530064ef0570b75b43f5c49bb8b235d6515671b3d250022cb8a1f9e", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d0f478ee64deddfec64b800673fd6e0c8888b079d9f3444dd96d2a98383bdbd1"}, +} diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po new file mode 100644 index 0000000..844c4f5 --- /dev/null +++ b/priv/gettext/en/LC_MESSAGES/errors.po @@ -0,0 +1,112 @@ +## `msgid`s in this file come from POT (.pot) files. +## +## Do not add, change, or remove `msgid`s manually here as +## they're tied to the ones in the corresponding POT file +## (with the same domain). +## +## Use `mix gettext.extract --merge` or `mix gettext.merge` +## to merge POT files into PO files. +msgid "" +msgstr "" +"Language: en\n" + +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_acceptance/3 +msgid "must be accepted" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} byte(s)" +msgid_plural "should be %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} byte(s)" +msgid_plural "should be at least %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} byte(s)" +msgid_plural "should be at most %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot new file mode 100644 index 0000000..eef2de2 --- /dev/null +++ b/priv/gettext/errors.pot @@ -0,0 +1,109 @@ +## This is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here has no +## effect: edit them in PO (`.po`) files instead. +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_acceptance/3 +msgid "must be accepted" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} byte(s)" +msgid_plural "should be %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} byte(s)" +msgid_plural "should be at least %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} byte(s)" +msgid_plural "should be at most %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" diff --git a/priv/repo/migrations/.formatter.exs b/priv/repo/migrations/.formatter.exs new file mode 100644 index 0000000..49f9151 --- /dev/null +++ b/priv/repo/migrations/.formatter.exs @@ -0,0 +1,4 @@ +[ + import_deps: [:ecto_sql], + inputs: ["*.exs"] +] diff --git a/priv/repo/migrations/20241103165448_create_users.exs b/priv/repo/migrations/20241103165448_create_users.exs new file mode 100644 index 0000000..5bea750 --- /dev/null +++ b/priv/repo/migrations/20241103165448_create_users.exs @@ -0,0 +1,18 @@ +defmodule Vishnya.Repo.Migrations.CreateUsers do + use Ecto.Migration + + def change do + create table(:users) do + add :username, :string, null: false, size: 12 + add :password_hash, :string, null: false + add :user_id, :string, null: false, size: 18 + add :token, :string, null: false + + timestamps() + end + + create unique_index(:users, [:username]) + create unique_index(:users, [:user_id]) + create unique_index(:users, [:token]) + end +end diff --git a/priv/repo/migrations/20241107202537_create_discord_users.exs b/priv/repo/migrations/20241107202537_create_discord_users.exs new file mode 100644 index 0000000..202f508 --- /dev/null +++ b/priv/repo/migrations/20241107202537_create_discord_users.exs @@ -0,0 +1,22 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordUsers do + use Ecto.Migration + + def change do + create table(:discord_users) do + add :user_id, :bigint + add :username, :string + add :discriminator, :string + add :profile_picture, :string + add :bio, :text + add :pronouns, :string + add :status, :string + add :banner_color, :string + add :has_nitro, :boolean + add :badges, {:array, :string} + + timestamps() + end + + create unique_index(:discord_users, [:user_id]) + end +end diff --git a/priv/repo/migrations/20241107202548_create_discord_servers.exs b/priv/repo/migrations/20241107202548_create_discord_servers.exs new file mode 100644 index 0000000..a11aee7 --- /dev/null +++ b/priv/repo/migrations/20241107202548_create_discord_servers.exs @@ -0,0 +1,19 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordServers do + use Ecto.Migration + + def change do + create table(:servers) do + add :server_id, :bigint + add :server_name, :string + add :member_count, :integer + add :invite_links, {:array, :string} + add :vanity_url, :string + add :banner_url, :string + add :created_at, :utc_datetime + + timestamps() + end + + create unique_index(:servers, [:server_id]) + end +end diff --git a/priv/repo/migrations/20241107202557_create_discord_channels.exs b/priv/repo/migrations/20241107202557_create_discord_channels.exs new file mode 100644 index 0000000..1b9a18b --- /dev/null +++ b/priv/repo/migrations/20241107202557_create_discord_channels.exs @@ -0,0 +1,18 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordChannels do + use Ecto.Migration + + def change do + create table(:channels) do + add :channel_id, :bigint + add :server_id, references(:servers, column: :server_id, type: :bigint) + add :channel_name, :string + add :description, :text + add :type, :string # e.g., "text", "voice", etc. + add :created_at, :utc_datetime + + timestamps() + end + + create index(:channels, [:channel_id]) + end +end diff --git a/priv/repo/migrations/20241107202606_create_discord_messages.exs b/priv/repo/migrations/20241107202606_create_discord_messages.exs new file mode 100644 index 0000000..b34156c --- /dev/null +++ b/priv/repo/migrations/20241107202606_create_discord_messages.exs @@ -0,0 +1,20 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordMessages do + use Ecto.Migration + + def change do + create table(:messages) do + add :message_id, :bigint + add :user_id, references(:discord_users, column: :user_id, type: :bigint) + add :channel_id, references(:channels, column: :id, type: :bigint) + add :server_id, references(:servers, column: :id, type: :bigint) + add :content, :text + add :attachments, {:array, :string} + add :type, :string + add :sent_at, :utc_datetime + + timestamps() + end + + create unique_index(:messages, [:message_id]) + end +end diff --git a/priv/repo/migrations/20241107203826_create_discord_message_change_logs.exs b/priv/repo/migrations/20241107203826_create_discord_message_change_logs.exs new file mode 100644 index 0000000..ccb5de4 --- /dev/null +++ b/priv/repo/migrations/20241107203826_create_discord_message_change_logs.exs @@ -0,0 +1,20 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordMessageChangeLogs do + use Ecto.Migration + + def change do + create table(:message_change_logs) do + add :message_id, references(:messages, type: :bigint, on_delete: :delete_all) + add :user_id, references(:discord_users, column: :user_id, type: :bigint) + add :channel_id, references(:channels, column: :id, type: :bigint) + add :server_id, references(:servers, column: :id, type: :bigint) + add :content, :text + add :attachments, {:array, :string} + add :type, :string + add :change_timestamp, :utc_datetime + + timestamps() + end + + create unique_index(:message_change_logs, [:message_id, :change_timestamp]) + end +end diff --git a/priv/repo/migrations/20241107203842_create_discord_server_change_logs.exs b/priv/repo/migrations/20241107203842_create_discord_server_change_logs.exs new file mode 100644 index 0000000..e02b26f --- /dev/null +++ b/priv/repo/migrations/20241107203842_create_discord_server_change_logs.exs @@ -0,0 +1,19 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordServerChangeLogs do + use Ecto.Migration + + def change do + create table(:server_change_logs) do + add :server_id, references(:servers, column: :id, type: :bigint) + add :server_name, :string + add :member_count, :integer + add :invite_links, {:array, :string} + add :vanity_url, :string + add :banner_url, :string + add :change_timestamp, :utc_datetime + + timestamps() + end + + create unique_index(:server_change_logs, [:server_id, :change_timestamp]) + end +end diff --git a/priv/repo/migrations/20241107203849_create_discord_user_change_logs.exs b/priv/repo/migrations/20241107203849_create_discord_user_change_logs.exs new file mode 100644 index 0000000..50ffd43 --- /dev/null +++ b/priv/repo/migrations/20241107203849_create_discord_user_change_logs.exs @@ -0,0 +1,23 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordUserChangeLogs do + use Ecto.Migration + + def change do + create table(:user_change_logs) do + add :user_id, references(:discord_users, column: :user_id, type: :bigint) + add :username, :string + add :discriminator, :string + add :profile_picture, :string + add :bio, :text + add :pronouns, :string + add :status, :string + add :banner_color, :string + add :has_nitro, :boolean + add :badges, {:array, :string} + add :change_timestamp, :utc_datetime + + timestamps() + end + + create unique_index(:user_change_logs, [:user_id, :change_timestamp]) + end +end diff --git a/priv/repo/migrations/20241107203856_create_discord_channel_change_logs.exs b/priv/repo/migrations/20241107203856_create_discord_channel_change_logs.exs new file mode 100644 index 0000000..23a21f0 --- /dev/null +++ b/priv/repo/migrations/20241107203856_create_discord_channel_change_logs.exs @@ -0,0 +1,18 @@ +defmodule Vishnya.Repo.Migrations.CreateDiscordChannelChangeLogs do + use Ecto.Migration + + def change do + create table(:channel_change_logs) do + add :channel_id, references(:channels, column: :id, type: :bigint) + add :server_id, references(:servers, column: :id, type: :bigint) + add :channel_name, :string + add :description, :text + add :type, :string + add :change_timestamp, :utc_datetime + + timestamps() + end + + create unique_index(:channel_change_logs, [:channel_id, :change_timestamp]) + end +end diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs new file mode 100644 index 0000000..bc3ad0c --- /dev/null +++ b/priv/repo/seeds.exs @@ -0,0 +1,11 @@ +# Script for populating the database. You can run it as: +# +# mix run priv/repo/seeds.exs +# +# Inside the script, you can read and write to any of your +# repositories directly: +# +# Vishnya.Repo.insert!(%Vishnya.SomeSchema{}) +# +# We recommend using the bang functions (`insert!`, `update!` +# and so on) as they will fail if something goes wrong. diff --git a/priv/static/assets/app.css b/priv/static/assets/app.css new file mode 100644 index 0000000..c972377 --- /dev/null +++ b/priv/static/assets/app.css @@ -0,0 +1,2227 @@ +@import url("https://fonts.googleapis.com/css2?family=Jolly+Lodger&family=Kumar+One&family=Modak&family=Rubik+Distressed&display=swap"); + +/* +! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select{ + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + border-radius: 0px; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; +} + +[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus{ + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + border-color: #2563eb; +} + +input::-moz-placeholder, textarea::-moz-placeholder{ + color: #6b7280; + opacity: 1; +} + +input::placeholder,textarea::placeholder{ + color: #6b7280; + opacity: 1; +} + +::-webkit-datetime-edit-fields-wrapper{ + padding: 0; +} + +::-webkit-date-and-time-value{ + min-height: 1.5em; +} + +::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{ + padding-top: 0; + padding-bottom: 0; +} + +select{ + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +[multiple]{ + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + -webkit-print-color-adjust: unset; + print-color-adjust: unset; +} + +[type='checkbox'],[type='radio']{ + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #2563eb; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + --tw-shadow: 0 0 #0000; +} + +[type='checkbox']{ + border-radius: 0px; +} + +[type='radio']{ + border-radius: 100%; +} + +[type='checkbox']:focus,[type='radio']:focus{ + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); +} + +[type='checkbox']:checked,[type='radio']:checked{ + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:checked{ + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); +} + +[type='radio']:checked{ + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); +} + +[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus{ + border-color: transparent; + background-color: currentColor; +} + +[type='checkbox']:indeterminate{ + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus{ + border-color: transparent; + background-color: currentColor; +} + +[type='file']{ + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; +} + +[type='file']:focus{ + outline: 1px solid ButtonText; + outline: 1px auto -webkit-focus-ring-color; +} + +*, ::before, ::after{ + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop{ + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +.container{ + width: 100%; +} + +@media (min-width: 640px){ + .container{ + max-width: 640px; + } +} + +@media (min-width: 768px){ + .container{ + max-width: 768px; + } +} + +@media (min-width: 1024px){ + .container{ + max-width: 1024px; + } +} + +@media (min-width: 1280px){ + .container{ + max-width: 1280px; + } +} + +@media (min-width: 1536px){ + .container{ + max-width: 1536px; + } +} + +.hero-arrow-left-solid{ + --hero-arrow-left-solid: url('data:image/svg+xml;utf8,'); + -webkit-mask: var(--hero-arrow-left-solid); + mask: var(--hero-arrow-left-solid); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + background-color: currentColor; + vertical-align: middle; + display: inline-block; + width: 1.5rem; + height: 1.5rem; +} + +.hero-arrow-path{ + --hero-arrow-path: url('data:image/svg+xml;utf8,'); + -webkit-mask: var(--hero-arrow-path); + mask: var(--hero-arrow-path); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + background-color: currentColor; + vertical-align: middle; + display: inline-block; + width: 1.5rem; + height: 1.5rem; +} + +.hero-exclamation-circle-mini{ + --hero-exclamation-circle-mini: url('data:image/svg+xml;utf8,'); + -webkit-mask: var(--hero-exclamation-circle-mini); + mask: var(--hero-exclamation-circle-mini); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + background-color: currentColor; + vertical-align: middle; + display: inline-block; + width: 1.25rem; + height: 1.25rem; +} + +.hero-information-circle-mini{ + --hero-information-circle-mini: url('data:image/svg+xml;utf8,'); + -webkit-mask: var(--hero-information-circle-mini); + mask: var(--hero-information-circle-mini); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + background-color: currentColor; + vertical-align: middle; + display: inline-block; + width: 1.25rem; + height: 1.25rem; +} + +.hero-x-mark-solid{ + --hero-x-mark-solid: url('data:image/svg+xml;utf8,'); + -webkit-mask: var(--hero-x-mark-solid); + mask: var(--hero-x-mark-solid); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + background-color: currentColor; + vertical-align: middle; + display: inline-block; + width: 1.5rem; + height: 1.5rem; +} + +.sr-only{ + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.static{ + position: static; +} + +.fixed{ + position: fixed; +} + +.absolute{ + position: absolute; +} + +.relative{ + position: relative; +} + +.inset-0{ + inset: 0px; +} + +.-inset-y-px{ + top: -1px; + bottom: -1px; +} + +.-left-4{ + left: -1rem; +} + +.-right-4{ + right: -1rem; +} + +.bottom-4{ + bottom: 1rem; +} + +.left-0{ + left: 0px; +} + +.right-0{ + right: 0px; +} + +.right-1{ + right: 0.25rem; +} + +.right-4{ + right: 1rem; +} + +.right-5{ + right: 1.25rem; +} + +.top-1\/2{ + top: 50%; +} + +.top-6{ + top: 1.5rem; +} + +.z-50{ + z-index: 50; +} + +.-m-3{ + margin: -0.75rem; +} + +.m-0{ + margin: 0px; +} + +.m-2{ + margin: 0.5rem; +} + +.m-4{ + margin: 1rem; +} + +.-my-4{ + margin-top: -1rem; + margin-bottom: -1rem; +} + +.mx-1{ + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.mx-1\.5{ + margin-left: 0.375rem; + margin-right: 0.375rem; +} + +.mx-auto{ + margin-left: auto; + margin-right: auto; +} + +.my-6{ + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} + +.mb-3{ + margin-bottom: 0.75rem; +} + +.mb-4{ + margin-bottom: 1rem; +} + +.mb-5{ + margin-bottom: 1.25rem; +} + +.mb-6{ + margin-bottom: 1.5rem; +} + +.ml-1{ + margin-left: 0.25rem; +} + +.ml-1\.5{ + margin-left: 0.375rem; +} + +.ml-10{ + margin-left: 2.5rem; +} + +.ml-2{ + margin-left: 0.5rem; +} + +.ml-4{ + margin-left: 1rem; +} + +.ml-5{ + margin-left: 1.25rem; +} + +.mr-1{ + margin-right: 0.25rem; +} + +.mr-1\.5{ + margin-right: 0.375rem; +} + +.mr-2{ + margin-right: 0.5rem; +} + +.mr-4{ + margin-right: 1rem; +} + +.mr-5{ + margin-right: 1.25rem; +} + +.mt-0{ + margin-top: 0px; +} + +.mt-0\.5{ + margin-top: 0.125rem; +} + +.mt-1{ + margin-top: 0.25rem; +} + +.mt-10{ + margin-top: 2.5rem; +} + +.mt-11{ + margin-top: 2.75rem; +} + +.mt-14{ + margin-top: 3.5rem; +} + +.mt-16{ + margin-top: 4rem; +} + +.mt-2{ + margin-top: 0.5rem; +} + +.mt-3{ + margin-top: 0.75rem; +} + +.mt-4{ + margin-top: 1rem; +} + +.mt-5{ + margin-top: 1.25rem; +} + +.block{ + display: block; +} + +.inline-block{ + display: inline-block; +} + +.inline{ + display: inline; +} + +.flex{ + display: flex; +} + +.table{ + display: table; +} + +.contents{ + display: contents; +} + +.hidden{ + display: none; +} + +.size-4{ + width: 1rem; + height: 1rem; +} + +.h-1{ + height: 0.25rem; +} + +.h-1\.5{ + height: 0.375rem; +} + +.h-10{ + height: 2.5rem; +} + +.h-3{ + height: 0.75rem; +} + +.h-4{ + height: 1rem; +} + +.h-5{ + height: 1.25rem; +} + +.h-8{ + height: 2rem; +} + +.h-9{ + height: 2.25rem; +} + +.h-\[0\.1rem\]{ + height: 0.1rem; +} + +.h-auto{ + height: auto; +} + +.h-screen{ + height: 100vh; +} + +.min-h-\[6rem\]{ + min-height: 6rem; +} + +.min-h-full{ + min-height: 100%; +} + +.min-h-screen{ + min-height: 100vh; +} + +.w-1{ + width: 0.25rem; +} + +.w-1\.5{ + width: 0.375rem; +} + +.w-1\/4{ + width: 25%; +} + +.w-10{ + width: 2.5rem; +} + +.w-14{ + width: 3.5rem; +} + +.w-2{ + width: 0.5rem; +} + +.w-3{ + width: 0.75rem; +} + +.w-4{ + width: 1rem; +} + +.w-5{ + width: 1.25rem; +} + +.w-8{ + width: 2rem; +} + +.w-80{ + width: 20rem; +} + +.w-9{ + width: 2.25rem; +} + +.w-\[250px\]{ + width: 250px; +} + +.w-\[40rem\]{ + width: 40rem; +} + +.w-auto{ + width: auto; +} + +.w-full{ + width: 100%; +} + +.w-screen{ + width: 100vw; +} + +.max-w-3xl{ + max-width: 48rem; +} + +.max-w-lg{ + max-width: 32rem; +} + +.max-w-md{ + max-width: 28rem; +} + +.flex-none{ + flex: none; +} + +.flex-grow{ + flex-grow: 1; +} + +.-translate-y-1\/2{ + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-0{ + --tw-translate-y: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-4{ + --tw-translate-y: 1rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-0{ + --tw-rotate: 0deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-90{ + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform{ + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@keyframes brightGlow{ + 0%{ + text-shadow: 0px 0px 8px rgba(255, 255, 255, 0.9); + } + + 100%{ + text-shadow: 0px 0px 25px rgba(255, 255, 255, 1), 0px 0px 35px rgba(255, 255, 255, 1); + } +} + +.animate-brightGlow{ + animation: brightGlow 2s infinite alternate; +} + +@keyframes glowText{ + 0%{ + text-shadow: 0px 0px 8px rgba(255, 255, 255, 0.8), 0px 0px 15px rgba(255, 153, 255, 0.5); + } + + 100%{ + text-shadow: 0px 0px 20px rgba(255, 255, 255, 1), 0px 0px 30px rgba(255, 153, 255, 0.8); + } +} + +.animate-glowText{ + animation: glowText 2s infinite alternate; +} + +@keyframes slideIn{ + 0%{ + transform: translateX(100%); + opacity: 0; + } + + 100%{ + transform: translateX(0); + opacity: 1; + } +} + +.animate-slideIn{ + animation: slideIn 0.2s ease-out; +} + +@keyframes slideOut{ + 0%{ + transform: translateX(0); + opacity: 1; + } + + 100%{ + transform: translateX(100%); + opacity: 0; + } +} + +.animate-slideOut{ + animation: slideOut 0.2s ease-in forwards; +} + +@keyframes spin{ + to{ + transform: rotate(360deg); + } +} + +.animate-spin{ + animation: spin 1s linear infinite; +} + +.cursor-pointer{ + cursor: pointer; +} + +.flex-col{ + flex-direction: column; +} + +.flex-wrap{ + flex-wrap: wrap; +} + +.items-center{ + align-items: center; +} + +.justify-center{ + justify-content: center; +} + +.justify-between{ + justify-content: space-between; +} + +.gap-2{ + gap: 0.5rem; +} + +.gap-3{ + gap: 0.75rem; +} + +.gap-4{ + gap: 1rem; +} + +.gap-6{ + gap: 1.5rem; +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]){ + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-3 > :not([hidden]) ~ :not([hidden]){ + --tw-space-x-reverse: 0; + margin-right: calc(0.75rem * var(--tw-space-x-reverse)); + margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-4 > :not([hidden]) ~ :not([hidden]){ + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]){ + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]){ + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]){ + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-8 > :not([hidden]) ~ :not([hidden]){ + --tw-space-y-reverse: 0; + margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(2rem * var(--tw-space-y-reverse)); +} + +.divide-y > :not([hidden]) ~ :not([hidden]){ + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-zinc-100 > :not([hidden]) ~ :not([hidden]){ + --tw-divide-opacity: 1; + border-color: rgb(244 244 245 / var(--tw-divide-opacity)); +} + +.overflow-hidden{ + overflow: hidden; +} + +.overflow-y-auto{ + overflow-y: auto; +} + +.whitespace-nowrap{ + white-space: nowrap; +} + +.break-words{ + overflow-wrap: break-word; +} + +.rounded{ + border-radius: 0.25rem; +} + +.rounded-2xl{ + border-radius: 1rem; +} + +.rounded-full{ + border-radius: 9999px; +} + +.rounded-lg{ + border-radius: 0.5rem; +} + +.rounded-md{ + border-radius: 0.375rem; +} + +.border{ + border-width: 1px; +} + +.border-2{ + border-width: 2px; +} + +.border-b{ + border-bottom-width: 1px; +} + +.border-t{ + border-top-width: 1px; +} + +.border-\[\#ff99ff\]{ + --tw-border-opacity: 1; + border-color: rgb(255 153 255 / var(--tw-border-opacity)); +} + +.border-gray-300{ + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-gray-400{ + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity)); +} + +.border-rose-400{ + --tw-border-opacity: 1; + border-color: rgb(251 113 133 / var(--tw-border-opacity)); +} + +.border-zinc-100{ + --tw-border-opacity: 1; + border-color: rgb(244 244 245 / var(--tw-border-opacity)); +} + +.border-zinc-200{ + --tw-border-opacity: 1; + border-color: rgb(228 228 231 / var(--tw-border-opacity)); +} + +.border-zinc-300{ + --tw-border-opacity: 1; + border-color: rgb(212 212 216 / var(--tw-border-opacity)); +} + +.border-zinc-700{ + --tw-border-opacity: 1; + border-color: rgb(63 63 70 / var(--tw-border-opacity)); +} + +.bg-\[\#0d0d0d\]{ + --tw-bg-opacity: 1; + background-color: rgb(13 13 13 / var(--tw-bg-opacity)); +} + +.bg-\[\#1a1a1a\]{ + --tw-bg-opacity: 1; + background-color: rgb(26 26 26 / var(--tw-bg-opacity)); +} + +.bg-\[\#d8d8d8\]{ + --tw-bg-opacity: 1; + background-color: rgb(216 216 216 / var(--tw-bg-opacity)); +} + +.bg-\[\#ff99ff\]{ + --tw-bg-opacity: 1; + background-color: rgb(255 153 255 / var(--tw-bg-opacity)); +} + +.bg-gray-300{ + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} + +.bg-green-500{ + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity)); +} + +.bg-vish{ + --tw-bg-opacity: 1; + background-color: rgb(255 153 255 / var(--tw-bg-opacity)); +} + +.bg-vish\/5{ + background-color: rgb(255 153 255 / 0.05); +} + +.bg-white{ + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-zinc-100{ + --tw-bg-opacity: 1; + background-color: rgb(244 244 245 / var(--tw-bg-opacity)); +} + +.bg-zinc-50\/90{ + background-color: rgb(250 250 250 / 0.9); +} + +.bg-zinc-800\/90{ + background-color: rgb(39 39 42 / 0.9); +} + +.bg-zinc-900{ + --tw-bg-opacity: 1; + background-color: rgb(24 24 27 / var(--tw-bg-opacity)); +} + +.bg-gradient-to-r{ + background-image: linear-gradient(to right, var(--tw-gradient-stops)); +} + +.from-\[\#ff99ff\]{ + --tw-gradient-from: #ff99ff var(--tw-gradient-from-position); + --tw-gradient-to: rgb(255 153 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-pink-600{ + --tw-gradient-from: #db2777 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(219 39 119 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-red-600{ + --tw-gradient-from: #dc2626 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(220 38 38 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.to-\[\#ffffff\]{ + --tw-gradient-to: #ffffff var(--tw-gradient-to-position); +} + +.to-pink-400{ + --tw-gradient-to: #f472b6 var(--tw-gradient-to-position); +} + +.to-vish{ + --tw-gradient-to: #ff99ff var(--tw-gradient-to-position); +} + +.to-white{ + --tw-gradient-to: #fff var(--tw-gradient-to-position); +} + +.bg-clip-text{ + -webkit-background-clip: text; + background-clip: text; +} + +.object-cover{ + -o-object-fit: cover; + object-fit: cover; +} + +.p-0{ + padding: 0px; +} + +.p-0\.5{ + padding: 0.125rem; +} + +.p-1{ + padding: 0.25rem; +} + +.p-14{ + padding: 3.5rem; +} + +.p-2{ + padding: 0.5rem; +} + +.p-3{ + padding: 0.75rem; +} + +.p-4{ + padding: 1rem; +} + +.p-6{ + padding: 1.5rem; +} + +.px-2{ + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-3{ + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4{ + padding-left: 1rem; + padding-right: 1rem; +} + +.px-6{ + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-1{ + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-10{ + padding-top: 2.5rem; + padding-bottom: 2.5rem; +} + +.py-2{ + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-3{ + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4{ + padding-top: 1rem; + padding-bottom: 1rem; +} + +.pb-4{ + padding-bottom: 1rem; +} + +.pl-2{ + padding-left: 0.5rem; +} + +.pr-6{ + padding-right: 1.5rem; +} + +.pt-8{ + padding-top: 2rem; +} + +.text-left{ + text-align: left; +} + +.text-center{ + text-align: center; +} + +.text-right{ + text-align: right; +} + +.font-modak{ + font-family: Modak, serif; +} + +.font-rubik{ + font-family: "Rubik Distressed", system-ui; +} + +.text-2xl{ + font-size: 1.5rem; + line-height: 2rem; +} + +.text-\[1\.6rem\]{ + font-size: 1.6rem; +} + +.text-\[2\.2rem\]{ + font-size: 2.2rem; +} + +.text-lg{ + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm{ + font-size: 0.875rem; + line-height: 1.25rem; +} + +.font-bold{ + font-weight: 700; +} + +.font-extrabold{ + font-weight: 800; +} + +.font-extralight{ + font-weight: 200; +} + +.font-medium{ + font-weight: 500; +} + +.font-normal{ + font-weight: 400; +} + +.font-semibold{ + font-weight: 600; +} + +.font-thin{ + font-weight: 100; +} + +.italic{ + font-style: italic; +} + +.leading-6{ + line-height: 1.5rem; +} + +.leading-8{ + line-height: 2rem; +} + +.tracking-wide{ + letter-spacing: 0.025em; +} + +.text-\[\#ff99ff\]{ + --tw-text-opacity: 1; + color: rgb(255 153 255 / var(--tw-text-opacity)); +} + +.text-blue-500{ + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + +.text-gray-200{ + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); +} + +.text-gray-300{ + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + +.text-gray-900{ + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-pink-100{ + --tw-text-opacity: 1; + color: rgb(252 231 243 / var(--tw-text-opacity)); +} + +.text-rose-600{ + --tw-text-opacity: 1; + color: rgb(225 29 72 / var(--tw-text-opacity)); +} + +.text-transparent{ + color: transparent; +} + +.text-vish{ + --tw-text-opacity: 1; + color: rgb(255 153 255 / var(--tw-text-opacity)); +} + +.text-white{ + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-zinc-500{ + --tw-text-opacity: 1; + color: rgb(113 113 122 / var(--tw-text-opacity)); +} + +.text-zinc-600{ + --tw-text-opacity: 1; + color: rgb(82 82 91 / var(--tw-text-opacity)); +} + +.text-zinc-700{ + --tw-text-opacity: 1; + color: rgb(63 63 70 / var(--tw-text-opacity)); +} + +.text-zinc-800{ + --tw-text-opacity: 1; + color: rgb(39 39 42 / var(--tw-text-opacity)); +} + +.text-zinc-900{ + --tw-text-opacity: 1; + color: rgb(24 24 27 / var(--tw-text-opacity)); +} + +.text-opacity-75{ + --tw-text-opacity: 0.75; +} + +.placeholder-gray-400::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.placeholder-gray-400::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.opacity-0{ + opacity: 0; +} + +.opacity-100{ + opacity: 1; +} + +.opacity-20{ + opacity: 0.2; +} + +.opacity-70{ + opacity: 0.7; +} + +.shadow-2xl{ + --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg{ + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md{ + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm{ + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-xl{ + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-zinc-700\/10{ + --tw-shadow-color: rgb(63 63 70 / 0.1); + --tw-shadow: var(--tw-shadow-colored); +} + +.outline{ + outline-style: solid; +} + +.ring-1{ + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-zinc-700\/10{ + --tw-ring-color: rgb(63 63 70 / 0.1); +} + +.transition{ + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all{ + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity{ + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform{ + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-150{ + transition-duration: 150ms; +} + +.duration-200{ + transition-duration: 200ms; +} + +.duration-300{ + transition-duration: 300ms; +} + +.ease-in{ + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); +} + +.ease-in-out{ + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.ease-out{ + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.\[scrollbar-gutter\:stable\]{ + scrollbar-gutter: stable; +} + +html, +body { + background-color: #1a1a1a !important; + height: 100%; + margin: 0; + padding: 0; +} + +.rotate-0 { + transform: rotate(0deg); +} + +.rotate-90 { + transform: rotate(90deg); +} + +.placeholder\:whitespace-normal::-moz-placeholder{ + white-space: normal; +} + +.placeholder\:whitespace-normal::placeholder{ + white-space: normal; +} + +.hover\:scale-105:hover{ + --tw-scale-x: 1.05; + --tw-scale-y: 1.05; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover\:scale-110:hover{ + --tw-scale-x: 1.1; + --tw-scale-y: 1.1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover\:cursor-pointer:hover{ + cursor: pointer; +} + +.hover\:bg-\[\#e080e0\]:hover{ + --tw-bg-opacity: 1; + background-color: rgb(224 128 224 / var(--tw-bg-opacity)); +} + +.hover\:bg-zinc-200\/80:hover{ + background-color: rgb(228 228 231 / 0.8); +} + +.hover\:bg-zinc-50:hover{ + --tw-bg-opacity: 1; + background-color: rgb(250 250 250 / var(--tw-bg-opacity)); +} + +.hover\:bg-zinc-700:hover{ + --tw-bg-opacity: 1; + background-color: rgb(63 63 70 / var(--tw-bg-opacity)); +} + +.hover\:text-zinc-700:hover{ + --tw-text-opacity: 1; + color: rgb(63 63 70 / var(--tw-text-opacity)); +} + +.hover\:underline:hover{ + text-decoration-line: underline; +} + +.hover\:opacity-100:hover{ + opacity: 1; +} + +.hover\:opacity-40:hover{ + opacity: 0.4; +} + +.focus\:border-rose-400:focus{ + --tw-border-opacity: 1; + border-color: rgb(251 113 133 / var(--tw-border-opacity)); +} + +.focus\:border-zinc-400:focus{ + --tw-border-opacity: 1; + border-color: rgb(161 161 170 / var(--tw-border-opacity)); +} + +.focus\:outline-none:focus{ + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring:focus{ + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-0:focus{ + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-2:focus{ + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-4:focus{ + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-\[\#ff99ff\]:focus{ + --tw-ring-opacity: 1; + --tw-ring-color: rgb(255 153 255 / var(--tw-ring-opacity)); +} + +.focus\:ring-opacity-50:focus{ + --tw-ring-opacity: 0.5; +} + +.active\:text-white\/80:active{ + color: rgb(255 255 255 / 0.8); +} + +.group:hover .group-hover\:bg-zinc-50{ + --tw-bg-opacity: 1; + background-color: rgb(250 250 250 / var(--tw-bg-opacity)); +} + +.phx-submit-loading.phx-submit-loading\:opacity-75{ + opacity: 0.75; +} + +.phx-submit-loading .phx-submit-loading\:opacity-75{ + opacity: 0.75; +} + +@media (min-width: 640px){ + .sm\:w-96{ + width: 24rem; + } + + .sm\:w-full{ + width: 100%; + } + + .sm\:translate-y-0{ + --tw-translate-y: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .sm\:scale-100{ + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .sm\:scale-95{ + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .sm\:gap-8{ + gap: 2rem; + } + + .sm\:overflow-visible{ + overflow: visible; + } + + .sm\:rounded-l-xl{ + border-top-left-radius: 0.75rem; + border-bottom-left-radius: 0.75rem; + } + + .sm\:rounded-r-xl{ + border-top-right-radius: 0.75rem; + border-bottom-right-radius: 0.75rem; + } + + .sm\:p-6{ + padding: 1.5rem; + } + + .sm\:px-0{ + padding-left: 0px; + padding-right: 0px; + } + + .sm\:px-6{ + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .sm\:text-sm{ + font-size: 0.875rem; + line-height: 1.25rem; + } + + .sm\:leading-6{ + line-height: 1.5rem; + } +} + +@media (min-width: 1024px){ + .lg\:px-8{ + padding-left: 2rem; + padding-right: 2rem; + } + + .lg\:py-8{ + padding-top: 2rem; + padding-bottom: 2rem; + } +} diff --git a/priv/static/assets/app.js b/priv/static/assets/app.js new file mode 100644 index 0000000..c3c4a03 --- /dev/null +++ b/priv/static/assets/app.js @@ -0,0 +1,7084 @@ +(() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __defProps = Object.defineProperties; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropDescs = Object.getOwnPropertyDescriptors; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getOwnPropSymbols = Object.getOwnPropertySymbols; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __propIsEnum = Object.prototype.propertyIsEnumerable; + var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; + var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; + }; + var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); + var __objRest = (source, exclude) => { + var target = {}; + for (var prop in source) + if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) + target[prop] = source[prop]; + if (source != null && __getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(source)) { + if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) + target[prop] = source[prop]; + } + return target; + }; + var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod + )); + + // vendor/topbar.js + var require_topbar = __commonJS({ + "vendor/topbar.js"(exports, module) { + (function(window2, document2) { + "use strict"; + (function() { + var lastTime = 0; + var vendors = ["ms", "moz", "webkit", "o"]; + for (var x = 0; x < vendors.length && !window2.requestAnimationFrame; ++x) { + window2.requestAnimationFrame = window2[vendors[x] + "RequestAnimationFrame"]; + window2.cancelAnimationFrame = window2[vendors[x] + "CancelAnimationFrame"] || window2[vendors[x] + "CancelRequestAnimationFrame"]; + } + if (!window2.requestAnimationFrame) + window2.requestAnimationFrame = function(callback, element) { + var currTime = (/* @__PURE__ */ new Date()).getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window2.setTimeout(function() { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + if (!window2.cancelAnimationFrame) + window2.cancelAnimationFrame = function(id) { + clearTimeout(id); + }; + })(); + var canvas, currentProgress, showing, progressTimerId = null, fadeTimerId = null, delayTimerId = null, addEvent = function(elem, type, handler) { + if (elem.addEventListener) + elem.addEventListener(type, handler, false); + else if (elem.attachEvent) + elem.attachEvent("on" + type, handler); + else + elem["on" + type] = handler; + }, options = { + autoRun: true, + barThickness: 3, + barColors: { + 0: "rgba(26, 188, 156, .9)", + ".25": "rgba(52, 152, 219, .9)", + ".50": "rgba(241, 196, 15, .9)", + ".75": "rgba(230, 126, 34, .9)", + "1.0": "rgba(211, 84, 0, .9)" + }, + shadowBlur: 10, + shadowColor: "rgba(0, 0, 0, .6)", + className: null + }, repaint = function() { + canvas.width = window2.innerWidth; + canvas.height = options.barThickness * 5; + var ctx = canvas.getContext("2d"); + ctx.shadowBlur = options.shadowBlur; + ctx.shadowColor = options.shadowColor; + var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); + for (var stop in options.barColors) + lineGradient.addColorStop(stop, options.barColors[stop]); + ctx.lineWidth = options.barThickness; + ctx.beginPath(); + ctx.moveTo(0, options.barThickness / 2); + ctx.lineTo( + Math.ceil(currentProgress * canvas.width), + options.barThickness / 2 + ); + ctx.strokeStyle = lineGradient; + ctx.stroke(); + }, createCanvas = function() { + canvas = document2.createElement("canvas"); + var style = canvas.style; + style.position = "fixed"; + style.top = style.left = style.right = style.margin = style.padding = 0; + style.zIndex = 100001; + style.display = "none"; + if (options.className) + canvas.classList.add(options.className); + document2.body.appendChild(canvas); + addEvent(window2, "resize", repaint); + }, topbar2 = { + config: function(opts) { + for (var key in opts) + if (options.hasOwnProperty(key)) + options[key] = opts[key]; + }, + show: function(delay) { + if (showing) + return; + if (delay) { + if (delayTimerId) + return; + delayTimerId = setTimeout(() => topbar2.show(), delay); + } else { + showing = true; + if (fadeTimerId !== null) + window2.cancelAnimationFrame(fadeTimerId); + if (!canvas) + createCanvas(); + canvas.style.opacity = 1; + canvas.style.display = "block"; + topbar2.progress(0); + if (options.autoRun) { + (function loop() { + progressTimerId = window2.requestAnimationFrame(loop); + topbar2.progress( + "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) + ); + })(); + } + } + }, + progress: function(to) { + if (typeof to === "undefined") + return currentProgress; + if (typeof to === "string") { + to = (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 ? currentProgress : 0) + parseFloat(to); + } + currentProgress = to > 1 ? 1 : to; + repaint(); + return currentProgress; + }, + hide: function() { + clearTimeout(delayTimerId); + delayTimerId = null; + if (!showing) + return; + showing = false; + if (progressTimerId != null) { + window2.cancelAnimationFrame(progressTimerId); + progressTimerId = null; + } + (function loop() { + if (topbar2.progress("+.1") >= 1) { + canvas.style.opacity -= 0.05; + if (canvas.style.opacity <= 0.05) { + canvas.style.display = "none"; + fadeTimerId = null; + return; + } + } + fadeTimerId = window2.requestAnimationFrame(loop); + })(); + } + }; + if (typeof module === "object" && typeof module.exports === "object") { + module.exports = topbar2; + } else if (typeof define === "function" && define.amd) { + define(function() { + return topbar2; + }); + } else { + this.topbar = topbar2; + } + }).call(exports, window, document); + } + }); + + // ../deps/phoenix_html/priv/static/phoenix_html.js + (function() { + var PolyfillEvent = eventConstructor(); + function eventConstructor() { + if (typeof window.CustomEvent === "function") + return window.CustomEvent; + function CustomEvent2(event, params) { + params = params || { bubbles: false, cancelable: false, detail: void 0 }; + var evt = document.createEvent("CustomEvent"); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } + CustomEvent2.prototype = window.Event.prototype; + return CustomEvent2; + } + function buildHiddenInput(name, value) { + var input = document.createElement("input"); + input.type = "hidden"; + input.name = name; + input.value = value; + return input; + } + function handleClick(element, targetModifierKey) { + var to = element.getAttribute("data-to"), method = buildHiddenInput("_method", element.getAttribute("data-method")), csrf = buildHiddenInput("_csrf_token", element.getAttribute("data-csrf")), form = document.createElement("form"), submit = document.createElement("input"), target = element.getAttribute("target"); + form.method = element.getAttribute("data-method") === "get" ? "get" : "post"; + form.action = to; + form.style.display = "none"; + if (target) + form.target = target; + else if (targetModifierKey) + form.target = "_blank"; + form.appendChild(csrf); + form.appendChild(method); + document.body.appendChild(form); + submit.type = "submit"; + form.appendChild(submit); + submit.click(); + } + window.addEventListener("click", function(e) { + var element = e.target; + if (e.defaultPrevented) + return; + while (element && element.getAttribute) { + var phoenixLinkEvent = new PolyfillEvent("phoenix.link.click", { + "bubbles": true, + "cancelable": true + }); + if (!element.dispatchEvent(phoenixLinkEvent)) { + e.preventDefault(); + e.stopImmediatePropagation(); + return false; + } + if (element.getAttribute("data-method") && element.getAttribute("data-to")) { + handleClick(element, e.metaKey || e.shiftKey); + e.preventDefault(); + return false; + } else { + element = element.parentNode; + } + } + }, false); + window.addEventListener("phoenix.link.click", function(e) { + var message = e.target.getAttribute("data-confirm"); + if (message && !window.confirm(message)) { + e.preventDefault(); + } + }, false); + })(); + + // ../deps/phoenix/priv/static/phoenix.mjs + var closure = (value) => { + if (typeof value === "function") { + return value; + } else { + let closure22 = function() { + return value; + }; + return closure22; + } + }; + var globalSelf = typeof self !== "undefined" ? self : null; + var phxWindow = typeof window !== "undefined" ? window : null; + var global = globalSelf || phxWindow || global; + var DEFAULT_VSN = "2.0.0"; + var SOCKET_STATES = { connecting: 0, open: 1, closing: 2, closed: 3 }; + var DEFAULT_TIMEOUT = 1e4; + var WS_CLOSE_NORMAL = 1e3; + var CHANNEL_STATES = { + closed: "closed", + errored: "errored", + joined: "joined", + joining: "joining", + leaving: "leaving" + }; + var CHANNEL_EVENTS = { + close: "phx_close", + error: "phx_error", + join: "phx_join", + reply: "phx_reply", + leave: "phx_leave" + }; + var TRANSPORTS = { + longpoll: "longpoll", + websocket: "websocket" + }; + var XHR_STATES = { + complete: 4 + }; + var Push = class { + constructor(channel, event, payload, timeout) { + this.channel = channel; + this.event = event; + this.payload = payload || function() { + return {}; + }; + this.receivedResp = null; + this.timeout = timeout; + this.timeoutTimer = null; + this.recHooks = []; + this.sent = false; + } + /** + * + * @param {number} timeout + */ + resend(timeout) { + this.timeout = timeout; + this.reset(); + this.send(); + } + /** + * + */ + send() { + if (this.hasReceived("timeout")) { + return; + } + this.startTimeout(); + this.sent = true; + this.channel.socket.push({ + topic: this.channel.topic, + event: this.event, + payload: this.payload(), + ref: this.ref, + join_ref: this.channel.joinRef() + }); + } + /** + * + * @param {*} status + * @param {*} callback + */ + receive(status, callback) { + if (this.hasReceived(status)) { + callback(this.receivedResp.response); + } + this.recHooks.push({ status, callback }); + return this; + } + /** + * @private + */ + reset() { + this.cancelRefEvent(); + this.ref = null; + this.refEvent = null; + this.receivedResp = null; + this.sent = false; + } + /** + * @private + */ + matchReceive({ status, response, _ref }) { + this.recHooks.filter((h) => h.status === status).forEach((h) => h.callback(response)); + } + /** + * @private + */ + cancelRefEvent() { + if (!this.refEvent) { + return; + } + this.channel.off(this.refEvent); + } + /** + * @private + */ + cancelTimeout() { + clearTimeout(this.timeoutTimer); + this.timeoutTimer = null; + } + /** + * @private + */ + startTimeout() { + if (this.timeoutTimer) { + this.cancelTimeout(); + } + this.ref = this.channel.socket.makeRef(); + this.refEvent = this.channel.replyEventName(this.ref); + this.channel.on(this.refEvent, (payload) => { + this.cancelRefEvent(); + this.cancelTimeout(); + this.receivedResp = payload; + this.matchReceive(payload); + }); + this.timeoutTimer = setTimeout(() => { + this.trigger("timeout", {}); + }, this.timeout); + } + /** + * @private + */ + hasReceived(status) { + return this.receivedResp && this.receivedResp.status === status; + } + /** + * @private + */ + trigger(status, response) { + this.channel.trigger(this.refEvent, { status, response }); + } + }; + var Timer = class { + constructor(callback, timerCalc) { + this.callback = callback; + this.timerCalc = timerCalc; + this.timer = null; + this.tries = 0; + } + reset() { + this.tries = 0; + clearTimeout(this.timer); + } + /** + * Cancels any previous scheduleTimeout and schedules callback + */ + scheduleTimeout() { + clearTimeout(this.timer); + this.timer = setTimeout(() => { + this.tries = this.tries + 1; + this.callback(); + }, this.timerCalc(this.tries + 1)); + } + }; + var Channel = class { + constructor(topic, params, socket) { + this.state = CHANNEL_STATES.closed; + this.topic = topic; + this.params = closure(params || {}); + this.socket = socket; + this.bindings = []; + this.bindingRef = 0; + this.timeout = this.socket.timeout; + this.joinedOnce = false; + this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout); + this.pushBuffer = []; + this.stateChangeRefs = []; + this.rejoinTimer = new Timer(() => { + if (this.socket.isConnected()) { + this.rejoin(); + } + }, this.socket.rejoinAfterMs); + this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset())); + this.stateChangeRefs.push( + this.socket.onOpen(() => { + this.rejoinTimer.reset(); + if (this.isErrored()) { + this.rejoin(); + } + }) + ); + this.joinPush.receive("ok", () => { + this.state = CHANNEL_STATES.joined; + this.rejoinTimer.reset(); + this.pushBuffer.forEach((pushEvent) => pushEvent.send()); + this.pushBuffer = []; + }); + this.joinPush.receive("error", () => { + this.state = CHANNEL_STATES.errored; + if (this.socket.isConnected()) { + this.rejoinTimer.scheduleTimeout(); + } + }); + this.onClose(() => { + this.rejoinTimer.reset(); + if (this.socket.hasLogger()) + this.socket.log("channel", `close ${this.topic} ${this.joinRef()}`); + this.state = CHANNEL_STATES.closed; + this.socket.remove(this); + }); + this.onError((reason) => { + if (this.socket.hasLogger()) + this.socket.log("channel", `error ${this.topic}`, reason); + if (this.isJoining()) { + this.joinPush.reset(); + } + this.state = CHANNEL_STATES.errored; + if (this.socket.isConnected()) { + this.rejoinTimer.scheduleTimeout(); + } + }); + this.joinPush.receive("timeout", () => { + if (this.socket.hasLogger()) + this.socket.log("channel", `timeout ${this.topic} (${this.joinRef()})`, this.joinPush.timeout); + let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), this.timeout); + leavePush.send(); + this.state = CHANNEL_STATES.errored; + this.joinPush.reset(); + if (this.socket.isConnected()) { + this.rejoinTimer.scheduleTimeout(); + } + }); + this.on(CHANNEL_EVENTS.reply, (payload, ref) => { + this.trigger(this.replyEventName(ref), payload); + }); + } + /** + * Join the channel + * @param {integer} timeout + * @returns {Push} + */ + join(timeout = this.timeout) { + if (this.joinedOnce) { + throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance"); + } else { + this.timeout = timeout; + this.joinedOnce = true; + this.rejoin(); + return this.joinPush; + } + } + /** + * Hook into channel close + * @param {Function} callback + */ + onClose(callback) { + this.on(CHANNEL_EVENTS.close, callback); + } + /** + * Hook into channel errors + * @param {Function} callback + */ + onError(callback) { + return this.on(CHANNEL_EVENTS.error, (reason) => callback(reason)); + } + /** + * Subscribes on channel events + * + * Subscription returns a ref counter, which can be used later to + * unsubscribe the exact event listener + * + * @example + * const ref1 = channel.on("event", do_stuff) + * const ref2 = channel.on("event", do_other_stuff) + * channel.off("event", ref1) + * // Since unsubscription, do_stuff won't fire, + * // while do_other_stuff will keep firing on the "event" + * + * @param {string} event + * @param {Function} callback + * @returns {integer} ref + */ + on(event, callback) { + let ref = this.bindingRef++; + this.bindings.push({ event, ref, callback }); + return ref; + } + /** + * Unsubscribes off of channel events + * + * Use the ref returned from a channel.on() to unsubscribe one + * handler, or pass nothing for the ref to unsubscribe all + * handlers for the given event. + * + * @example + * // Unsubscribe the do_stuff handler + * const ref1 = channel.on("event", do_stuff) + * channel.off("event", ref1) + * + * // Unsubscribe all handlers from event + * channel.off("event") + * + * @param {string} event + * @param {integer} ref + */ + off(event, ref) { + this.bindings = this.bindings.filter((bind) => { + return !(bind.event === event && (typeof ref === "undefined" || ref === bind.ref)); + }); + } + /** + * @private + */ + canPush() { + return this.socket.isConnected() && this.isJoined(); + } + /** + * Sends a message `event` to phoenix with the payload `payload`. + * Phoenix receives this in the `handle_in(event, payload, socket)` + * function. if phoenix replies or it times out (default 10000ms), + * then optionally the reply can be received. + * + * @example + * channel.push("event") + * .receive("ok", payload => console.log("phoenix replied:", payload)) + * .receive("error", err => console.log("phoenix errored", err)) + * .receive("timeout", () => console.log("timed out pushing")) + * @param {string} event + * @param {Object} payload + * @param {number} [timeout] + * @returns {Push} + */ + push(event, payload, timeout = this.timeout) { + payload = payload || {}; + if (!this.joinedOnce) { + throw new Error(`tried to push '${event}' to '${this.topic}' before joining. Use channel.join() before pushing events`); + } + let pushEvent = new Push(this, event, function() { + return payload; + }, timeout); + if (this.canPush()) { + pushEvent.send(); + } else { + pushEvent.startTimeout(); + this.pushBuffer.push(pushEvent); + } + return pushEvent; + } + /** Leaves the channel + * + * Unsubscribes from server events, and + * instructs channel to terminate on server + * + * Triggers onClose() hooks + * + * To receive leave acknowledgements, use the `receive` + * hook to bind to the server ack, ie: + * + * @example + * channel.leave().receive("ok", () => alert("left!") ) + * + * @param {integer} timeout + * @returns {Push} + */ + leave(timeout = this.timeout) { + this.rejoinTimer.reset(); + this.joinPush.cancelTimeout(); + this.state = CHANNEL_STATES.leaving; + let onClose = () => { + if (this.socket.hasLogger()) + this.socket.log("channel", `leave ${this.topic}`); + this.trigger(CHANNEL_EVENTS.close, "leave"); + }; + let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), timeout); + leavePush.receive("ok", () => onClose()).receive("timeout", () => onClose()); + leavePush.send(); + if (!this.canPush()) { + leavePush.trigger("ok", {}); + } + return leavePush; + } + /** + * Overridable message hook + * + * Receives all events for specialized message handling + * before dispatching to the channel callbacks. + * + * Must return the payload, modified or unmodified + * @param {string} event + * @param {Object} payload + * @param {integer} ref + * @returns {Object} + */ + onMessage(_event, payload, _ref) { + return payload; + } + /** + * @private + */ + isMember(topic, event, payload, joinRef) { + if (this.topic !== topic) { + return false; + } + if (joinRef && joinRef !== this.joinRef()) { + if (this.socket.hasLogger()) + this.socket.log("channel", "dropping outdated message", { topic, event, payload, joinRef }); + return false; + } else { + return true; + } + } + /** + * @private + */ + joinRef() { + return this.joinPush.ref; + } + /** + * @private + */ + rejoin(timeout = this.timeout) { + if (this.isLeaving()) { + return; + } + this.socket.leaveOpenTopic(this.topic); + this.state = CHANNEL_STATES.joining; + this.joinPush.resend(timeout); + } + /** + * @private + */ + trigger(event, payload, ref, joinRef) { + let handledPayload = this.onMessage(event, payload, ref, joinRef); + if (payload && !handledPayload) { + throw new Error("channel onMessage callbacks must return the payload, modified or unmodified"); + } + let eventBindings = this.bindings.filter((bind) => bind.event === event); + for (let i = 0; i < eventBindings.length; i++) { + let bind = eventBindings[i]; + bind.callback(handledPayload, ref, joinRef || this.joinRef()); + } + } + /** + * @private + */ + replyEventName(ref) { + return `chan_reply_${ref}`; + } + /** + * @private + */ + isClosed() { + return this.state === CHANNEL_STATES.closed; + } + /** + * @private + */ + isErrored() { + return this.state === CHANNEL_STATES.errored; + } + /** + * @private + */ + isJoined() { + return this.state === CHANNEL_STATES.joined; + } + /** + * @private + */ + isJoining() { + return this.state === CHANNEL_STATES.joining; + } + /** + * @private + */ + isLeaving() { + return this.state === CHANNEL_STATES.leaving; + } + }; + var Ajax = class { + static request(method, endPoint, accept, body, timeout, ontimeout, callback) { + if (global.XDomainRequest) { + let req = new global.XDomainRequest(); + return this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback); + } else { + let req = new global.XMLHttpRequest(); + return this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback); + } + } + static xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) { + req.timeout = timeout; + req.open(method, endPoint); + req.onload = () => { + let response = this.parseJSON(req.responseText); + callback && callback(response); + }; + if (ontimeout) { + req.ontimeout = ontimeout; + } + req.onprogress = () => { + }; + req.send(body); + return req; + } + static xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) { + req.open(method, endPoint, true); + req.timeout = timeout; + req.setRequestHeader("Content-Type", accept); + req.onerror = () => callback && callback(null); + req.onreadystatechange = () => { + if (req.readyState === XHR_STATES.complete && callback) { + let response = this.parseJSON(req.responseText); + callback(response); + } + }; + if (ontimeout) { + req.ontimeout = ontimeout; + } + req.send(body); + return req; + } + static parseJSON(resp) { + if (!resp || resp === "") { + return null; + } + try { + return JSON.parse(resp); + } catch (e) { + console && console.log("failed to parse JSON response", resp); + return null; + } + } + static serialize(obj, parentKey) { + let queryStr = []; + for (var key in obj) { + if (!Object.prototype.hasOwnProperty.call(obj, key)) { + continue; + } + let paramKey = parentKey ? `${parentKey}[${key}]` : key; + let paramVal = obj[key]; + if (typeof paramVal === "object") { + queryStr.push(this.serialize(paramVal, paramKey)); + } else { + queryStr.push(encodeURIComponent(paramKey) + "=" + encodeURIComponent(paramVal)); + } + } + return queryStr.join("&"); + } + static appendParams(url, params) { + if (Object.keys(params).length === 0) { + return url; + } + let prefix = url.match(/\?/) ? "&" : "?"; + return `${url}${prefix}${this.serialize(params)}`; + } + }; + var arrayBufferToBase64 = (buffer) => { + let binary = ""; + let bytes = new Uint8Array(buffer); + let len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); + }; + var LongPoll = class { + constructor(endPoint) { + this.endPoint = null; + this.token = null; + this.skipHeartbeat = true; + this.reqs = /* @__PURE__ */ new Set(); + this.awaitingBatchAck = false; + this.currentBatch = null; + this.currentBatchTimer = null; + this.batchBuffer = []; + this.onopen = function() { + }; + this.onerror = function() { + }; + this.onmessage = function() { + }; + this.onclose = function() { + }; + this.pollEndpoint = this.normalizeEndpoint(endPoint); + this.readyState = SOCKET_STATES.connecting; + setTimeout(() => this.poll(), 0); + } + normalizeEndpoint(endPoint) { + return endPoint.replace("ws://", "http://").replace("wss://", "https://").replace(new RegExp("(.*)/" + TRANSPORTS.websocket), "$1/" + TRANSPORTS.longpoll); + } + endpointURL() { + return Ajax.appendParams(this.pollEndpoint, { token: this.token }); + } + closeAndRetry(code, reason, wasClean) { + this.close(code, reason, wasClean); + this.readyState = SOCKET_STATES.connecting; + } + ontimeout() { + this.onerror("timeout"); + this.closeAndRetry(1005, "timeout", false); + } + isActive() { + return this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting; + } + poll() { + this.ajax("GET", "application/json", null, () => this.ontimeout(), (resp) => { + if (resp) { + var { status, token, messages } = resp; + this.token = token; + } else { + status = 0; + } + switch (status) { + case 200: + messages.forEach((msg) => { + setTimeout(() => this.onmessage({ data: msg }), 0); + }); + this.poll(); + break; + case 204: + this.poll(); + break; + case 410: + this.readyState = SOCKET_STATES.open; + this.onopen({}); + this.poll(); + break; + case 403: + this.onerror(403); + this.close(1008, "forbidden", false); + break; + case 0: + case 500: + this.onerror(500); + this.closeAndRetry(1011, "internal server error", 500); + break; + default: + throw new Error(`unhandled poll status ${status}`); + } + }); + } + // we collect all pushes within the current event loop by + // setTimeout 0, which optimizes back-to-back procedural + // pushes against an empty buffer + send(body) { + if (typeof body !== "string") { + body = arrayBufferToBase64(body); + } + if (this.currentBatch) { + this.currentBatch.push(body); + } else if (this.awaitingBatchAck) { + this.batchBuffer.push(body); + } else { + this.currentBatch = [body]; + this.currentBatchTimer = setTimeout(() => { + this.batchSend(this.currentBatch); + this.currentBatch = null; + }, 0); + } + } + batchSend(messages) { + this.awaitingBatchAck = true; + this.ajax("POST", "application/x-ndjson", messages.join("\n"), () => this.onerror("timeout"), (resp) => { + this.awaitingBatchAck = false; + if (!resp || resp.status !== 200) { + this.onerror(resp && resp.status); + this.closeAndRetry(1011, "internal server error", false); + } else if (this.batchBuffer.length > 0) { + this.batchSend(this.batchBuffer); + this.batchBuffer = []; + } + }); + } + close(code, reason, wasClean) { + for (let req of this.reqs) { + req.abort(); + } + this.readyState = SOCKET_STATES.closed; + let opts = Object.assign({ code: 1e3, reason: void 0, wasClean: true }, { code, reason, wasClean }); + this.batchBuffer = []; + clearTimeout(this.currentBatchTimer); + this.currentBatchTimer = null; + if (typeof CloseEvent !== "undefined") { + this.onclose(new CloseEvent("close", opts)); + } else { + this.onclose(opts); + } + } + ajax(method, contentType, body, onCallerTimeout, callback) { + let req; + let ontimeout = () => { + this.reqs.delete(req); + onCallerTimeout(); + }; + req = Ajax.request(method, this.endpointURL(), contentType, body, this.timeout, ontimeout, (resp) => { + this.reqs.delete(req); + if (this.isActive()) { + callback(resp); + } + }); + this.reqs.add(req); + } + }; + var serializer_default = { + HEADER_LENGTH: 1, + META_LENGTH: 4, + KINDS: { push: 0, reply: 1, broadcast: 2 }, + encode(msg, callback) { + if (msg.payload.constructor === ArrayBuffer) { + return callback(this.binaryEncode(msg)); + } else { + let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload]; + return callback(JSON.stringify(payload)); + } + }, + decode(rawPayload, callback) { + if (rawPayload.constructor === ArrayBuffer) { + return callback(this.binaryDecode(rawPayload)); + } else { + let [join_ref, ref, topic, event, payload] = JSON.parse(rawPayload); + return callback({ join_ref, ref, topic, event, payload }); + } + }, + // private + binaryEncode(message) { + let { join_ref, ref, event, topic, payload } = message; + let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length; + let header = new ArrayBuffer(this.HEADER_LENGTH + metaLength); + let view = new DataView(header); + let offset = 0; + view.setUint8(offset++, this.KINDS.push); + view.setUint8(offset++, join_ref.length); + view.setUint8(offset++, ref.length); + view.setUint8(offset++, topic.length); + view.setUint8(offset++, event.length); + Array.from(join_ref, (char) => view.setUint8(offset++, char.charCodeAt(0))); + Array.from(ref, (char) => view.setUint8(offset++, char.charCodeAt(0))); + Array.from(topic, (char) => view.setUint8(offset++, char.charCodeAt(0))); + Array.from(event, (char) => view.setUint8(offset++, char.charCodeAt(0))); + var combined = new Uint8Array(header.byteLength + payload.byteLength); + combined.set(new Uint8Array(header), 0); + combined.set(new Uint8Array(payload), header.byteLength); + return combined.buffer; + }, + binaryDecode(buffer) { + let view = new DataView(buffer); + let kind = view.getUint8(0); + let decoder = new TextDecoder(); + switch (kind) { + case this.KINDS.push: + return this.decodePush(buffer, view, decoder); + case this.KINDS.reply: + return this.decodeReply(buffer, view, decoder); + case this.KINDS.broadcast: + return this.decodeBroadcast(buffer, view, decoder); + } + }, + decodePush(buffer, view, decoder) { + let joinRefSize = view.getUint8(1); + let topicSize = view.getUint8(2); + let eventSize = view.getUint8(3); + let offset = this.HEADER_LENGTH + this.META_LENGTH - 1; + let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize)); + offset = offset + joinRefSize; + let topic = decoder.decode(buffer.slice(offset, offset + topicSize)); + offset = offset + topicSize; + let event = decoder.decode(buffer.slice(offset, offset + eventSize)); + offset = offset + eventSize; + let data = buffer.slice(offset, buffer.byteLength); + return { join_ref: joinRef, ref: null, topic, event, payload: data }; + }, + decodeReply(buffer, view, decoder) { + let joinRefSize = view.getUint8(1); + let refSize = view.getUint8(2); + let topicSize = view.getUint8(3); + let eventSize = view.getUint8(4); + let offset = this.HEADER_LENGTH + this.META_LENGTH; + let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize)); + offset = offset + joinRefSize; + let ref = decoder.decode(buffer.slice(offset, offset + refSize)); + offset = offset + refSize; + let topic = decoder.decode(buffer.slice(offset, offset + topicSize)); + offset = offset + topicSize; + let event = decoder.decode(buffer.slice(offset, offset + eventSize)); + offset = offset + eventSize; + let data = buffer.slice(offset, buffer.byteLength); + let payload = { status: event, response: data }; + return { join_ref: joinRef, ref, topic, event: CHANNEL_EVENTS.reply, payload }; + }, + decodeBroadcast(buffer, view, decoder) { + let topicSize = view.getUint8(1); + let eventSize = view.getUint8(2); + let offset = this.HEADER_LENGTH + 2; + let topic = decoder.decode(buffer.slice(offset, offset + topicSize)); + offset = offset + topicSize; + let event = decoder.decode(buffer.slice(offset, offset + eventSize)); + offset = offset + eventSize; + let data = buffer.slice(offset, buffer.byteLength); + return { join_ref: null, ref: null, topic, event, payload: data }; + } + }; + var Socket = class { + constructor(endPoint, opts = {}) { + this.stateChangeCallbacks = { open: [], close: [], error: [], message: [] }; + this.channels = []; + this.sendBuffer = []; + this.ref = 0; + this.timeout = opts.timeout || DEFAULT_TIMEOUT; + this.transport = opts.transport || global.WebSocket || LongPoll; + this.primaryPassedHealthCheck = false; + this.longPollFallbackMs = opts.longPollFallbackMs; + this.fallbackTimer = null; + this.sessionStore = opts.sessionStorage || global && global.sessionStorage; + this.establishedConnections = 0; + this.defaultEncoder = serializer_default.encode.bind(serializer_default); + this.defaultDecoder = serializer_default.decode.bind(serializer_default); + this.closeWasClean = false; + this.binaryType = opts.binaryType || "arraybuffer"; + this.connectClock = 1; + if (this.transport !== LongPoll) { + this.encode = opts.encode || this.defaultEncoder; + this.decode = opts.decode || this.defaultDecoder; + } else { + this.encode = this.defaultEncoder; + this.decode = this.defaultDecoder; + } + let awaitingConnectionOnPageShow = null; + if (phxWindow && phxWindow.addEventListener) { + phxWindow.addEventListener("pagehide", (_e) => { + if (this.conn) { + this.disconnect(); + awaitingConnectionOnPageShow = this.connectClock; + } + }); + phxWindow.addEventListener("pageshow", (_e) => { + if (awaitingConnectionOnPageShow === this.connectClock) { + awaitingConnectionOnPageShow = null; + this.connect(); + } + }); + } + this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 3e4; + this.rejoinAfterMs = (tries) => { + if (opts.rejoinAfterMs) { + return opts.rejoinAfterMs(tries); + } else { + return [1e3, 2e3, 5e3][tries - 1] || 1e4; + } + }; + this.reconnectAfterMs = (tries) => { + if (opts.reconnectAfterMs) { + return opts.reconnectAfterMs(tries); + } else { + return [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][tries - 1] || 5e3; + } + }; + this.logger = opts.logger || null; + if (!this.logger && opts.debug) { + this.logger = (kind, msg, data) => { + console.log(`${kind}: ${msg}`, data); + }; + } + this.longpollerTimeout = opts.longpollerTimeout || 2e4; + this.params = closure(opts.params || {}); + this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`; + this.vsn = opts.vsn || DEFAULT_VSN; + this.heartbeatTimeoutTimer = null; + this.heartbeatTimer = null; + this.pendingHeartbeatRef = null; + this.reconnectTimer = new Timer(() => { + this.teardown(() => this.connect()); + }, this.reconnectAfterMs); + } + /** + * Returns the LongPoll transport reference + */ + getLongPollTransport() { + return LongPoll; + } + /** + * Disconnects and replaces the active transport + * + * @param {Function} newTransport - The new transport class to instantiate + * + */ + replaceTransport(newTransport) { + this.connectClock++; + this.closeWasClean = true; + clearTimeout(this.fallbackTimer); + this.reconnectTimer.reset(); + if (this.conn) { + this.conn.close(); + this.conn = null; + } + this.transport = newTransport; + } + /** + * Returns the socket protocol + * + * @returns {string} + */ + protocol() { + return location.protocol.match(/^https/) ? "wss" : "ws"; + } + /** + * The fully qualified socket url + * + * @returns {string} + */ + endPointURL() { + let uri = Ajax.appendParams( + Ajax.appendParams(this.endPoint, this.params()), + { vsn: this.vsn } + ); + if (uri.charAt(0) !== "/") { + return uri; + } + if (uri.charAt(1) === "/") { + return `${this.protocol()}:${uri}`; + } + return `${this.protocol()}://${location.host}${uri}`; + } + /** + * Disconnects the socket + * + * See https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes for valid status codes. + * + * @param {Function} callback - Optional callback which is called after socket is disconnected. + * @param {integer} code - A status code for disconnection (Optional). + * @param {string} reason - A textual description of the reason to disconnect. (Optional) + */ + disconnect(callback, code, reason) { + this.connectClock++; + this.closeWasClean = true; + clearTimeout(this.fallbackTimer); + this.reconnectTimer.reset(); + this.teardown(callback, code, reason); + } + /** + * + * @param {Object} params - The params to send when connecting, for example `{user_id: userToken}` + * + * Passing params to connect is deprecated; pass them in the Socket constructor instead: + * `new Socket("/socket", {params: {user_id: userToken}})`. + */ + connect(params) { + if (params) { + console && console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"); + this.params = closure(params); + } + if (this.conn) { + return; + } + if (this.longPollFallbackMs && this.transport !== LongPoll) { + this.connectWithFallback(LongPoll, this.longPollFallbackMs); + } else { + this.transportConnect(); + } + } + /** + * Logs the message. Override `this.logger` for specialized logging. noops by default + * @param {string} kind + * @param {string} msg + * @param {Object} data + */ + log(kind, msg, data) { + this.logger && this.logger(kind, msg, data); + } + /** + * Returns true if a logger has been set on this socket. + */ + hasLogger() { + return this.logger !== null; + } + /** + * Registers callbacks for connection open events + * + * @example socket.onOpen(function(){ console.info("the socket was opened") }) + * + * @param {Function} callback + */ + onOpen(callback) { + let ref = this.makeRef(); + this.stateChangeCallbacks.open.push([ref, callback]); + return ref; + } + /** + * Registers callbacks for connection close events + * @param {Function} callback + */ + onClose(callback) { + let ref = this.makeRef(); + this.stateChangeCallbacks.close.push([ref, callback]); + return ref; + } + /** + * Registers callbacks for connection error events + * + * @example socket.onError(function(error){ alert("An error occurred") }) + * + * @param {Function} callback + */ + onError(callback) { + let ref = this.makeRef(); + this.stateChangeCallbacks.error.push([ref, callback]); + return ref; + } + /** + * Registers callbacks for connection message events + * @param {Function} callback + */ + onMessage(callback) { + let ref = this.makeRef(); + this.stateChangeCallbacks.message.push([ref, callback]); + return ref; + } + /** + * Pings the server and invokes the callback with the RTT in milliseconds + * @param {Function} callback + * + * Returns true if the ping was pushed or false if unable to be pushed. + */ + ping(callback) { + if (!this.isConnected()) { + return false; + } + let ref = this.makeRef(); + let startTime = Date.now(); + this.push({ topic: "phoenix", event: "heartbeat", payload: {}, ref }); + let onMsgRef = this.onMessage((msg) => { + if (msg.ref === ref) { + this.off([onMsgRef]); + callback(Date.now() - startTime); + } + }); + return true; + } + /** + * @private + */ + transportConnect() { + this.connectClock++; + this.closeWasClean = false; + this.conn = new this.transport(this.endPointURL()); + this.conn.binaryType = this.binaryType; + this.conn.timeout = this.longpollerTimeout; + this.conn.onopen = () => this.onConnOpen(); + this.conn.onerror = (error) => this.onConnError(error); + this.conn.onmessage = (event) => this.onConnMessage(event); + this.conn.onclose = (event) => this.onConnClose(event); + } + getSession(key) { + return this.sessionStore && this.sessionStore.getItem(key); + } + storeSession(key, val) { + this.sessionStore && this.sessionStore.setItem(key, val); + } + connectWithFallback(fallbackTransport, fallbackThreshold = 2500) { + clearTimeout(this.fallbackTimer); + let established = false; + let primaryTransport = true; + let openRef, errorRef; + let fallback = (reason) => { + this.log("transport", `falling back to ${fallbackTransport.name}...`, reason); + this.off([openRef, errorRef]); + primaryTransport = false; + this.replaceTransport(fallbackTransport); + this.transportConnect(); + }; + if (this.getSession(`phx:fallback:${fallbackTransport.name}`)) { + return fallback("memorized"); + } + this.fallbackTimer = setTimeout(fallback, fallbackThreshold); + errorRef = this.onError((reason) => { + this.log("transport", "error", reason); + if (primaryTransport && !established) { + clearTimeout(this.fallbackTimer); + fallback(reason); + } + }); + this.onOpen(() => { + established = true; + if (!primaryTransport) { + if (!this.primaryPassedHealthCheck) { + this.storeSession(`phx:fallback:${fallbackTransport.name}`, "true"); + } + return this.log("transport", `established ${fallbackTransport.name} fallback`); + } + clearTimeout(this.fallbackTimer); + this.fallbackTimer = setTimeout(fallback, fallbackThreshold); + this.ping((rtt) => { + this.log("transport", "connected to primary after", rtt); + this.primaryPassedHealthCheck = true; + clearTimeout(this.fallbackTimer); + }); + }); + this.transportConnect(); + } + clearHeartbeats() { + clearTimeout(this.heartbeatTimer); + clearTimeout(this.heartbeatTimeoutTimer); + } + onConnOpen() { + if (this.hasLogger()) + this.log("transport", `${this.transport.name} connected to ${this.endPointURL()}`); + this.closeWasClean = false; + this.establishedConnections++; + this.flushSendBuffer(); + this.reconnectTimer.reset(); + this.resetHeartbeat(); + this.stateChangeCallbacks.open.forEach(([, callback]) => callback()); + } + /** + * @private + */ + heartbeatTimeout() { + if (this.pendingHeartbeatRef) { + this.pendingHeartbeatRef = null; + if (this.hasLogger()) { + this.log("transport", "heartbeat timeout. Attempting to re-establish connection"); + } + this.triggerChanError(); + this.closeWasClean = false; + this.teardown(() => this.reconnectTimer.scheduleTimeout(), WS_CLOSE_NORMAL, "heartbeat timeout"); + } + } + resetHeartbeat() { + if (this.conn && this.conn.skipHeartbeat) { + return; + } + this.pendingHeartbeatRef = null; + this.clearHeartbeats(); + this.heartbeatTimer = setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs); + } + teardown(callback, code, reason) { + if (!this.conn) { + return callback && callback(); + } + this.waitForBufferDone(() => { + if (this.conn) { + if (code) { + this.conn.close(code, reason || ""); + } else { + this.conn.close(); + } + } + this.waitForSocketClosed(() => { + if (this.conn) { + this.conn.onopen = function() { + }; + this.conn.onerror = function() { + }; + this.conn.onmessage = function() { + }; + this.conn.onclose = function() { + }; + this.conn = null; + } + callback && callback(); + }); + }); + } + waitForBufferDone(callback, tries = 1) { + if (tries === 5 || !this.conn || !this.conn.bufferedAmount) { + callback(); + return; + } + setTimeout(() => { + this.waitForBufferDone(callback, tries + 1); + }, 150 * tries); + } + waitForSocketClosed(callback, tries = 1) { + if (tries === 5 || !this.conn || this.conn.readyState === SOCKET_STATES.closed) { + callback(); + return; + } + setTimeout(() => { + this.waitForSocketClosed(callback, tries + 1); + }, 150 * tries); + } + onConnClose(event) { + let closeCode = event && event.code; + if (this.hasLogger()) + this.log("transport", "close", event); + this.triggerChanError(); + this.clearHeartbeats(); + if (!this.closeWasClean && closeCode !== 1e3) { + this.reconnectTimer.scheduleTimeout(); + } + this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event)); + } + /** + * @private + */ + onConnError(error) { + if (this.hasLogger()) + this.log("transport", error); + let transportBefore = this.transport; + let establishedBefore = this.establishedConnections; + this.stateChangeCallbacks.error.forEach(([, callback]) => { + callback(error, transportBefore, establishedBefore); + }); + if (transportBefore === this.transport || establishedBefore > 0) { + this.triggerChanError(); + } + } + /** + * @private + */ + triggerChanError() { + this.channels.forEach((channel) => { + if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) { + channel.trigger(CHANNEL_EVENTS.error); + } + }); + } + /** + * @returns {string} + */ + connectionState() { + switch (this.conn && this.conn.readyState) { + case SOCKET_STATES.connecting: + return "connecting"; + case SOCKET_STATES.open: + return "open"; + case SOCKET_STATES.closing: + return "closing"; + default: + return "closed"; + } + } + /** + * @returns {boolean} + */ + isConnected() { + return this.connectionState() === "open"; + } + /** + * @private + * + * @param {Channel} + */ + remove(channel) { + this.off(channel.stateChangeRefs); + this.channels = this.channels.filter((c) => c !== channel); + } + /** + * Removes `onOpen`, `onClose`, `onError,` and `onMessage` registrations. + * + * @param {refs} - list of refs returned by calls to + * `onOpen`, `onClose`, `onError,` and `onMessage` + */ + off(refs) { + for (let key in this.stateChangeCallbacks) { + this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => { + return refs.indexOf(ref) === -1; + }); + } + } + /** + * Initiates a new channel for the given topic + * + * @param {string} topic + * @param {Object} chanParams - Parameters for the channel + * @returns {Channel} + */ + channel(topic, chanParams = {}) { + let chan = new Channel(topic, chanParams, this); + this.channels.push(chan); + return chan; + } + /** + * @param {Object} data + */ + push(data) { + if (this.hasLogger()) { + let { topic, event, payload, ref, join_ref } = data; + this.log("push", `${topic} ${event} (${join_ref}, ${ref})`, payload); + } + if (this.isConnected()) { + this.encode(data, (result) => this.conn.send(result)); + } else { + this.sendBuffer.push(() => this.encode(data, (result) => this.conn.send(result))); + } + } + /** + * Return the next message ref, accounting for overflows + * @returns {string} + */ + makeRef() { + let newRef = this.ref + 1; + if (newRef === this.ref) { + this.ref = 0; + } else { + this.ref = newRef; + } + return this.ref.toString(); + } + sendHeartbeat() { + if (this.pendingHeartbeatRef && !this.isConnected()) { + return; + } + this.pendingHeartbeatRef = this.makeRef(); + this.push({ topic: "phoenix", event: "heartbeat", payload: {}, ref: this.pendingHeartbeatRef }); + this.heartbeatTimeoutTimer = setTimeout(() => this.heartbeatTimeout(), this.heartbeatIntervalMs); + } + flushSendBuffer() { + if (this.isConnected() && this.sendBuffer.length > 0) { + this.sendBuffer.forEach((callback) => callback()); + this.sendBuffer = []; + } + } + onConnMessage(rawMessage) { + this.decode(rawMessage.data, (msg) => { + let { topic, event, payload, ref, join_ref } = msg; + if (ref && ref === this.pendingHeartbeatRef) { + this.clearHeartbeats(); + this.pendingHeartbeatRef = null; + this.heartbeatTimer = setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs); + } + if (this.hasLogger()) + this.log("receive", `${payload.status || ""} ${topic} ${event} ${ref && "(" + ref + ")" || ""}`, payload); + for (let i = 0; i < this.channels.length; i++) { + const channel = this.channels[i]; + if (!channel.isMember(topic, event, payload, join_ref)) { + continue; + } + channel.trigger(event, payload, ref, join_ref); + } + for (let i = 0; i < this.stateChangeCallbacks.message.length; i++) { + let [, callback] = this.stateChangeCallbacks.message[i]; + callback(msg); + } + }); + } + leaveOpenTopic(topic) { + let dupChannel = this.channels.find((c) => c.topic === topic && (c.isJoined() || c.isJoining())); + if (dupChannel) { + if (this.hasLogger()) + this.log("transport", `leaving duplicate topic "${topic}"`); + dupChannel.leave(); + } + } + }; + + // ../deps/phoenix_live_view/priv/static/phoenix_live_view.esm.js + var CONSECUTIVE_RELOADS = "consecutive-reloads"; + var MAX_RELOADS = 10; + var RELOAD_JITTER_MIN = 5e3; + var RELOAD_JITTER_MAX = 1e4; + var FAILSAFE_JITTER = 3e4; + var PHX_EVENT_CLASSES = [ + "phx-click-loading", + "phx-change-loading", + "phx-submit-loading", + "phx-keydown-loading", + "phx-keyup-loading", + "phx-blur-loading", + "phx-focus-loading", + "phx-hook-loading" + ]; + var PHX_COMPONENT = "data-phx-component"; + var PHX_LIVE_LINK = "data-phx-link"; + var PHX_TRACK_STATIC = "track-static"; + var PHX_LINK_STATE = "data-phx-link-state"; + var PHX_REF_LOADING = "data-phx-ref-loading"; + var PHX_REF_SRC = "data-phx-ref-src"; + var PHX_REF_LOCK = "data-phx-ref-lock"; + var PHX_TRACK_UPLOADS = "track-uploads"; + var PHX_UPLOAD_REF = "data-phx-upload-ref"; + var PHX_PREFLIGHTED_REFS = "data-phx-preflighted-refs"; + var PHX_DONE_REFS = "data-phx-done-refs"; + var PHX_DROP_TARGET = "drop-target"; + var PHX_ACTIVE_ENTRY_REFS = "data-phx-active-refs"; + var PHX_LIVE_FILE_UPDATED = "phx:live-file:updated"; + var PHX_SKIP = "data-phx-skip"; + var PHX_MAGIC_ID = "data-phx-id"; + var PHX_PRUNE = "data-phx-prune"; + var PHX_CONNECTED_CLASS = "phx-connected"; + var PHX_LOADING_CLASS = "phx-loading"; + var PHX_ERROR_CLASS = "phx-error"; + var PHX_CLIENT_ERROR_CLASS = "phx-client-error"; + var PHX_SERVER_ERROR_CLASS = "phx-server-error"; + var PHX_PARENT_ID = "data-phx-parent-id"; + var PHX_MAIN = "data-phx-main"; + var PHX_ROOT_ID = "data-phx-root-id"; + var PHX_VIEWPORT_TOP = "viewport-top"; + var PHX_VIEWPORT_BOTTOM = "viewport-bottom"; + var PHX_TRIGGER_ACTION = "trigger-action"; + var PHX_HAS_FOCUSED = "phx-has-focused"; + var FOCUSABLE_INPUTS = ["text", "textarea", "number", "email", "password", "search", "tel", "url", "date", "time", "datetime-local", "color", "range"]; + var CHECKABLE_INPUTS = ["checkbox", "radio"]; + var PHX_HAS_SUBMITTED = "phx-has-submitted"; + var PHX_SESSION = "data-phx-session"; + var PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`; + var PHX_STICKY = "data-phx-sticky"; + var PHX_STATIC = "data-phx-static"; + var PHX_READONLY = "data-phx-readonly"; + var PHX_DISABLED = "data-phx-disabled"; + var PHX_DISABLE_WITH = "disable-with"; + var PHX_DISABLE_WITH_RESTORE = "data-phx-disable-with-restore"; + var PHX_HOOK = "hook"; + var PHX_DEBOUNCE = "debounce"; + var PHX_THROTTLE = "throttle"; + var PHX_UPDATE = "update"; + var PHX_STREAM = "stream"; + var PHX_STREAM_REF = "data-phx-stream"; + var PHX_KEY = "key"; + var PHX_PRIVATE = "phxPrivate"; + var PHX_AUTO_RECOVER = "auto-recover"; + var PHX_LV_DEBUG = "phx:live-socket:debug"; + var PHX_LV_PROFILE = "phx:live-socket:profiling"; + var PHX_LV_LATENCY_SIM = "phx:live-socket:latency-sim"; + var PHX_PROGRESS = "progress"; + var PHX_MOUNTED = "mounted"; + var PHX_RELOAD_STATUS = "__phoenix_reload_status__"; + var LOADER_TIMEOUT = 1; + var MAX_CHILD_JOIN_ATTEMPTS = 3; + var BEFORE_UNLOAD_LOADER_TIMEOUT = 200; + var BINDING_PREFIX = "phx-"; + var PUSH_TIMEOUT = 3e4; + var DEBOUNCE_TRIGGER = "debounce-trigger"; + var THROTTLED = "throttled"; + var DEBOUNCE_PREV_KEY = "debounce-prev-key"; + var DEFAULTS = { + debounce: 300, + throttle: 300 + }; + var PHX_PENDING_ATTRS = [PHX_REF_LOADING, PHX_REF_SRC, PHX_REF_LOCK]; + var DYNAMICS = "d"; + var STATIC = "s"; + var ROOT = "r"; + var COMPONENTS = "c"; + var EVENTS = "e"; + var REPLY = "r"; + var TITLE = "t"; + var TEMPLATES = "p"; + var STREAM = "stream"; + var EntryUploader = class { + constructor(entry, chunkSize, liveSocket2) { + this.liveSocket = liveSocket2; + this.entry = entry; + this.offset = 0; + this.chunkSize = chunkSize; + this.chunkTimer = null; + this.errored = false; + this.uploadChannel = liveSocket2.channel(`lvu:${entry.ref}`, { token: entry.metadata() }); + } + error(reason) { + if (this.errored) { + return; + } + this.uploadChannel.leave(); + this.errored = true; + clearTimeout(this.chunkTimer); + this.entry.error(reason); + } + upload() { + this.uploadChannel.onError((reason) => this.error(reason)); + this.uploadChannel.join().receive("ok", (_data) => this.readNextChunk()).receive("error", (reason) => this.error(reason)); + } + isDone() { + return this.offset >= this.entry.file.size; + } + readNextChunk() { + let reader = new window.FileReader(); + let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset); + reader.onload = (e) => { + if (e.target.error === null) { + this.offset += e.target.result.byteLength; + this.pushChunk(e.target.result); + } else { + return logError("Read error: " + e.target.error); + } + }; + reader.readAsArrayBuffer(blob); + } + pushChunk(chunk) { + if (!this.uploadChannel.isJoined()) { + return; + } + this.uploadChannel.push("chunk", chunk).receive("ok", () => { + this.entry.progress(this.offset / this.entry.file.size * 100); + if (!this.isDone()) { + this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0); + } + }).receive("error", ({ reason }) => this.error(reason)); + } + }; + var logError = (msg, obj) => console.error && console.error(msg, obj); + var isCid = (cid) => { + let type = typeof cid; + return type === "number" || type === "string" && /^(0|[1-9]\d*)$/.test(cid); + }; + function detectDuplicateIds() { + let ids = /* @__PURE__ */ new Set(); + let elems = document.querySelectorAll("*[id]"); + for (let i = 0, len = elems.length; i < len; i++) { + if (ids.has(elems[i].id)) { + console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`); + } else { + ids.add(elems[i].id); + } + } + } + var debug = (view, kind, msg, obj) => { + if (view.liveSocket.isDebugEnabled()) { + console.log(`${view.id} ${kind}: ${msg} - `, obj); + } + }; + var closure2 = (val) => typeof val === "function" ? val : function() { + return val; + }; + var clone = (obj) => { + return JSON.parse(JSON.stringify(obj)); + }; + var closestPhxBinding = (el, binding, borderEl) => { + do { + if (el.matches(`[${binding}]`) && !el.disabled) { + return el; + } + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1 && !(borderEl && borderEl.isSameNode(el) || el.matches(PHX_VIEW_SELECTOR))); + return null; + }; + var isObject = (obj) => { + return obj !== null && typeof obj === "object" && !(obj instanceof Array); + }; + var isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2); + var isEmpty = (obj) => { + for (let x in obj) { + return false; + } + return true; + }; + var maybe = (el, callback) => el && callback(el); + var channelUploader = function(entries, onError, resp, liveSocket2) { + entries.forEach((entry) => { + let entryUploader = new EntryUploader(entry, resp.config.chunk_size, liveSocket2); + entryUploader.upload(); + }); + }; + var Browser = { + canPushState() { + return typeof history.pushState !== "undefined"; + }, + dropLocal(localStorage, namespace, subkey) { + return localStorage.removeItem(this.localKey(namespace, subkey)); + }, + updateLocal(localStorage, namespace, subkey, initial, func) { + let current = this.getLocal(localStorage, namespace, subkey); + let key = this.localKey(namespace, subkey); + let newVal = current === null ? initial : func(current); + localStorage.setItem(key, JSON.stringify(newVal)); + return newVal; + }, + getLocal(localStorage, namespace, subkey) { + return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey))); + }, + updateCurrentState(callback) { + if (!this.canPushState()) { + return; + } + history.replaceState(callback(history.state || {}), "", window.location.href); + }, + pushState(kind, meta, to) { + if (this.canPushState()) { + if (to !== window.location.href) { + if (meta.type == "redirect" && meta.scroll) { + let currentState = history.state || {}; + currentState.scroll = meta.scroll; + history.replaceState(currentState, "", window.location.href); + } + delete meta.scroll; + history[kind + "State"](meta, "", to || null); + window.requestAnimationFrame(() => { + let hashEl = this.getHashTargetEl(window.location.hash); + if (hashEl) { + hashEl.scrollIntoView(); + } else if (meta.type === "redirect") { + window.scroll(0, 0); + } + }); + } + } else { + this.redirect(to); + } + }, + setCookie(name, value, maxAgeSeconds) { + let expires = typeof maxAgeSeconds === "number" ? ` max-age=${maxAgeSeconds};` : ""; + document.cookie = `${name}=${value};${expires} path=/`; + }, + getCookie(name) { + return document.cookie.replace(new RegExp(`(?:(?:^|.*;s*)${name}s*=s*([^;]*).*$)|^.*$`), "$1"); + }, + deleteCookie(name) { + document.cookie = `${name}=; max-age=-1; path=/`; + }, + redirect(toURL, flash) { + if (flash) { + this.setCookie("__phoenix_flash__", flash, 60); + } + window.location = toURL; + }, + localKey(namespace, subkey) { + return `${namespace}-${subkey}`; + }, + getHashTargetEl(maybeHash) { + let hash = maybeHash.toString().substring(1); + if (hash === "") { + return; + } + return document.getElementById(hash) || document.querySelector(`a[name="${hash}"]`); + } + }; + var browser_default = Browser; + var ARIA = { + anyOf(instance, classes) { + return classes.find((name) => instance instanceof name); + }, + isFocusable(el, interactiveOnly) { + return el instanceof HTMLAnchorElement && el.rel !== "ignore" || el instanceof HTMLAreaElement && el.href !== void 0 || !el.disabled && this.anyOf(el, [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLButtonElement]) || el instanceof HTMLIFrameElement || (el.tabIndex > 0 || !interactiveOnly && el.getAttribute("tabindex") !== null && el.getAttribute("aria-hidden") !== "true"); + }, + attemptFocus(el, interactiveOnly) { + if (this.isFocusable(el, interactiveOnly)) { + try { + el.focus(); + } catch (e) { + } + } + return !!document.activeElement && document.activeElement.isSameNode(el); + }, + focusFirstInteractive(el) { + let child = el.firstElementChild; + while (child) { + if (this.attemptFocus(child, true) || this.focusFirstInteractive(child, true)) { + return true; + } + child = child.nextElementSibling; + } + }, + focusFirst(el) { + let child = el.firstElementChild; + while (child) { + if (this.attemptFocus(child) || this.focusFirst(child)) { + return true; + } + child = child.nextElementSibling; + } + }, + focusLast(el) { + let child = el.lastElementChild; + while (child) { + if (this.attemptFocus(child) || this.focusLast(child)) { + return true; + } + child = child.previousElementSibling; + } + } + }; + var aria_default = ARIA; + var focusStack = []; + var default_transition_time = 200; + var JS = { + // private + exec(e, eventType, phxEvent, view, sourceEl, defaults) { + let [defaultKind, defaultArgs] = defaults || [null, { callback: defaults && defaults.callback }]; + let commands = phxEvent.charAt(0) === "[" ? JSON.parse(phxEvent) : [[defaultKind, defaultArgs]]; + commands.forEach(([kind, args]) => { + if (kind === defaultKind && defaultArgs.data) { + args.data = Object.assign(args.data || {}, defaultArgs.data); + args.callback = args.callback || defaultArgs.callback; + } + this.filterToEls(view.liveSocket, sourceEl, args).forEach((el) => { + this[`exec_${kind}`](e, eventType, phxEvent, view, sourceEl, el, args); + }); + }); + }, + isVisible(el) { + return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0); + }, + // returns true if any part of the element is inside the viewport + isInViewport(el) { + const rect = el.getBoundingClientRect(); + const windowHeight = window.innerHeight || document.documentElement.clientHeight; + const windowWidth = window.innerWidth || document.documentElement.clientWidth; + return rect.right > 0 && rect.bottom > 0 && rect.left < windowWidth && rect.top < windowHeight; + }, + // private + // commands + exec_exec(e, eventType, phxEvent, view, sourceEl, el, { attr, to }) { + let nodes = to ? dom_default.all(document, to) : [sourceEl]; + nodes.forEach((node) => { + let encodedJS = node.getAttribute(attr); + if (!encodedJS) { + throw new Error(`expected ${attr} to contain JS command on "${to}"`); + } + view.liveSocket.execJS(node, encodedJS, eventType); + }); + }, + exec_dispatch(e, eventType, phxEvent, view, sourceEl, el, { to, event, detail, bubbles }) { + detail = detail || {}; + detail.dispatcher = sourceEl; + dom_default.dispatchEvent(el, event, { detail, bubbles }); + }, + exec_push(e, eventType, phxEvent, view, sourceEl, el, args) { + let { event, data, target, page_loading, loading, value, dispatcher, callback } = args; + let pushOpts = { loading, value, target, page_loading: !!page_loading }; + let targetSrc = eventType === "change" && dispatcher ? dispatcher : sourceEl; + let phxTarget = target || targetSrc.getAttribute(view.binding("target")) || targetSrc; + view.withinTargets(phxTarget, (targetView, targetCtx) => { + if (!targetView.isConnected()) { + return; + } + if (eventType === "change") { + let { newCid, _target } = args; + _target = _target || (dom_default.isFormInput(sourceEl) ? sourceEl.name : void 0); + if (_target) { + pushOpts._target = _target; + } + targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback); + } else if (eventType === "submit") { + let { submitter } = args; + targetView.submitForm(sourceEl, targetCtx, event || phxEvent, submitter, pushOpts, callback); + } else { + targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts, callback); + } + }); + }, + exec_navigate(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) { + view.liveSocket.historyRedirect(e, href, replace ? "replace" : "push", null, sourceEl); + }, + exec_patch(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) { + view.liveSocket.pushHistoryPatch(e, href, replace ? "replace" : "push", sourceEl); + }, + exec_focus(e, eventType, phxEvent, view, sourceEl, el) { + window.requestAnimationFrame(() => aria_default.attemptFocus(el)); + }, + exec_focus_first(e, eventType, phxEvent, view, sourceEl, el) { + window.requestAnimationFrame(() => aria_default.focusFirstInteractive(el) || aria_default.focusFirst(el)); + }, + exec_push_focus(e, eventType, phxEvent, view, sourceEl, el) { + window.requestAnimationFrame(() => focusStack.push(el || sourceEl)); + }, + exec_pop_focus(e, eventType, phxEvent, view, sourceEl, el) { + window.requestAnimationFrame(() => { + const el2 = focusStack.pop(); + if (el2) { + el2.focus(); + } + }); + }, + exec_add_class(e, eventType, phxEvent, view, sourceEl, el, { names, transition, time, blocking }) { + this.addOrRemoveClasses(el, names, [], transition, time, view, blocking); + }, + exec_remove_class(e, eventType, phxEvent, view, sourceEl, el, { names, transition, time, blocking }) { + this.addOrRemoveClasses(el, [], names, transition, time, view, blocking); + }, + exec_toggle_class(e, eventType, phxEvent, view, sourceEl, el, { to, names, transition, time, blocking }) { + this.toggleClasses(el, names, transition, time, view, blocking); + }, + exec_toggle_attr(e, eventType, phxEvent, view, sourceEl, el, { attr: [attr, val1, val2] }) { + this.toggleAttr(el, attr, val1, val2); + }, + exec_transition(e, eventType, phxEvent, view, sourceEl, el, { time, transition, blocking }) { + this.addOrRemoveClasses(el, [], [], transition, time, view, blocking); + }, + exec_toggle(e, eventType, phxEvent, view, sourceEl, el, { display, ins, outs, time, blocking }) { + this.toggle(eventType, view, el, display, ins, outs, time, blocking); + }, + exec_show(e, eventType, phxEvent, view, sourceEl, el, { display, transition, time, blocking }) { + this.show(eventType, view, el, display, transition, time, blocking); + }, + exec_hide(e, eventType, phxEvent, view, sourceEl, el, { display, transition, time, blocking }) { + this.hide(eventType, view, el, display, transition, time, blocking); + }, + exec_set_attr(e, eventType, phxEvent, view, sourceEl, el, { attr: [attr, val] }) { + this.setOrRemoveAttrs(el, [[attr, val]], []); + }, + exec_remove_attr(e, eventType, phxEvent, view, sourceEl, el, { attr }) { + this.setOrRemoveAttrs(el, [], [attr]); + }, + // utils for commands + show(eventType, view, el, display, transition, time, blocking) { + if (!this.isVisible(el)) { + this.toggle(eventType, view, el, display, transition, null, time, blocking); + } + }, + hide(eventType, view, el, display, transition, time, blocking) { + if (this.isVisible(el)) { + this.toggle(eventType, view, el, display, null, transition, time, blocking); + } + }, + toggle(eventType, view, el, display, ins, outs, time, blocking) { + time = time || default_transition_time; + let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []]; + let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []]; + if (inClasses.length > 0 || outClasses.length > 0) { + if (this.isVisible(el)) { + let onStart = () => { + this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses)); + window.requestAnimationFrame(() => { + this.addOrRemoveClasses(el, outClasses, []); + window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses)); + }); + }; + let onEnd = () => { + this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses)); + dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none"); + el.dispatchEvent(new Event("phx:hide-end")); + }; + el.dispatchEvent(new Event("phx:hide-start")); + if (blocking === false) { + onStart(); + setTimeout(onEnd, time); + } else { + view.transition(time, onStart, onEnd); + } + } else { + if (eventType === "remove") { + return; + } + let onStart = () => { + this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses)); + let stickyDisplay = display || this.defaultDisplay(el); + dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = stickyDisplay); + window.requestAnimationFrame(() => { + this.addOrRemoveClasses(el, inClasses, []); + window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses)); + }); + }; + let onEnd = () => { + this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses)); + el.dispatchEvent(new Event("phx:show-end")); + }; + el.dispatchEvent(new Event("phx:show-start")); + if (blocking === false) { + onStart(); + setTimeout(onEnd, time); + } else { + view.transition(time, onStart, onEnd); + } + } + } else { + if (this.isVisible(el)) { + window.requestAnimationFrame(() => { + el.dispatchEvent(new Event("phx:hide-start")); + dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none"); + el.dispatchEvent(new Event("phx:hide-end")); + }); + } else { + window.requestAnimationFrame(() => { + el.dispatchEvent(new Event("phx:show-start")); + let stickyDisplay = display || this.defaultDisplay(el); + dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = stickyDisplay); + el.dispatchEvent(new Event("phx:show-end")); + }); + } + } + }, + toggleClasses(el, classes, transition, time, view, blocking) { + window.requestAnimationFrame(() => { + let [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]); + let newAdds = classes.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name)); + let newRemoves = classes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name)); + this.addOrRemoveClasses(el, newAdds, newRemoves, transition, time, view, blocking); + }); + }, + toggleAttr(el, attr, val1, val2) { + if (el.hasAttribute(attr)) { + if (val2 !== void 0) { + if (el.getAttribute(attr) === val1) { + this.setOrRemoveAttrs(el, [[attr, val2]], []); + } else { + this.setOrRemoveAttrs(el, [[attr, val1]], []); + } + } else { + this.setOrRemoveAttrs(el, [], [attr]); + } + } else { + this.setOrRemoveAttrs(el, [[attr, val1]], []); + } + }, + addOrRemoveClasses(el, adds, removes, transition, time, view, blocking) { + time = time || default_transition_time; + let [transitionRun, transitionStart, transitionEnd] = transition || [[], [], []]; + if (transitionRun.length > 0) { + let onStart = () => { + this.addOrRemoveClasses(el, transitionStart, [].concat(transitionRun).concat(transitionEnd)); + window.requestAnimationFrame(() => { + this.addOrRemoveClasses(el, transitionRun, []); + window.requestAnimationFrame(() => this.addOrRemoveClasses(el, transitionEnd, transitionStart)); + }); + }; + let onDone = () => this.addOrRemoveClasses(el, adds.concat(transitionEnd), removes.concat(transitionRun).concat(transitionStart)); + if (blocking === false) { + onStart(); + setTimeout(onDone, time); + } else { + view.transition(time, onStart, onDone); + } + return; + } + window.requestAnimationFrame(() => { + let [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]); + let keepAdds = adds.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name)); + let keepRemoves = removes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name)); + let newAdds = prevAdds.filter((name) => removes.indexOf(name) < 0).concat(keepAdds); + let newRemoves = prevRemoves.filter((name) => adds.indexOf(name) < 0).concat(keepRemoves); + dom_default.putSticky(el, "classes", (currentEl) => { + currentEl.classList.remove(...newRemoves); + currentEl.classList.add(...newAdds); + return [newAdds, newRemoves]; + }); + }); + }, + setOrRemoveAttrs(el, sets, removes) { + let [prevSets, prevRemoves] = dom_default.getSticky(el, "attrs", [[], []]); + let alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes); + let newSets = prevSets.filter(([attr, _val]) => !alteredAttrs.includes(attr)).concat(sets); + let newRemoves = prevRemoves.filter((attr) => !alteredAttrs.includes(attr)).concat(removes); + dom_default.putSticky(el, "attrs", (currentEl) => { + newRemoves.forEach((attr) => currentEl.removeAttribute(attr)); + newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val)); + return [newSets, newRemoves]; + }); + }, + hasAllClasses(el, classes) { + return classes.every((name) => el.classList.contains(name)); + }, + isToggledOut(el, outClasses) { + return !this.isVisible(el) || this.hasAllClasses(el, outClasses); + }, + filterToEls(liveSocket2, sourceEl, { to }) { + let defaultQuery = () => { + if (typeof to === "string") { + return document.querySelectorAll(to); + } else if (to.closest) { + let toEl = sourceEl.closest(to.closest); + return toEl ? [toEl] : []; + } else if (to.inner) { + return sourceEl.querySelectorAll(to.inner); + } + }; + return to ? liveSocket2.jsQuerySelectorAll(sourceEl, to, defaultQuery) : [sourceEl]; + }, + defaultDisplay(el) { + return { tr: "table-row", td: "table-cell" }[el.tagName.toLowerCase()] || "block"; + }, + transitionClasses(val) { + if (!val) { + return null; + } + let [trans, tStart, tEnd] = Array.isArray(val) ? val : [val.split(" "), [], []]; + trans = Array.isArray(trans) ? trans : trans.split(" "); + tStart = Array.isArray(tStart) ? tStart : tStart.split(" "); + tEnd = Array.isArray(tEnd) ? tEnd : tEnd.split(" "); + return [trans, tStart, tEnd]; + } + }; + var js_default = JS; + var DOM = { + byId(id) { + return document.getElementById(id) || logError(`no id found for ${id}`); + }, + removeClass(el, className) { + el.classList.remove(className); + if (el.classList.length === 0) { + el.removeAttribute("class"); + } + }, + all(node, query, callback) { + if (!node) { + return []; + } + let array = Array.from(node.querySelectorAll(query)); + return callback ? array.forEach(callback) : array; + }, + childNodeLength(html) { + let template = document.createElement("template"); + template.innerHTML = html; + return template.content.childElementCount; + }, + isUploadInput(el) { + return el.type === "file" && el.getAttribute(PHX_UPLOAD_REF) !== null; + }, + isAutoUpload(inputEl) { + return inputEl.hasAttribute("data-phx-auto-upload"); + }, + findUploadInputs(node) { + const formId = node.id; + const inputsOutsideForm = this.all(document, `input[type="file"][${PHX_UPLOAD_REF}][form="${formId}"]`); + return this.all(node, `input[type="file"][${PHX_UPLOAD_REF}]`).concat(inputsOutsideForm); + }, + findComponentNodeList(node, cid) { + return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}="${cid}"]`), node); + }, + isPhxDestroyed(node) { + return node.id && DOM.private(node, "destroyed") ? true : false; + }, + wantsNewTab(e) { + let wantsNewTab = e.ctrlKey || e.shiftKey || e.metaKey || e.button && e.button === 1; + let isDownload = e.target instanceof HTMLAnchorElement && e.target.hasAttribute("download"); + let isTargetBlank = e.target.hasAttribute("target") && e.target.getAttribute("target").toLowerCase() === "_blank"; + let isTargetNamedTab = e.target.hasAttribute("target") && !e.target.getAttribute("target").startsWith("_"); + return wantsNewTab || isTargetBlank || isDownload || isTargetNamedTab; + }, + isUnloadableFormSubmit(e) { + let isDialogSubmit = e.target && e.target.getAttribute("method") === "dialog" || e.submitter && e.submitter.getAttribute("formmethod") === "dialog"; + if (isDialogSubmit) { + return false; + } else { + return !e.defaultPrevented && !this.wantsNewTab(e); + } + }, + isNewPageClick(e, currentLocation) { + let href = e.target instanceof HTMLAnchorElement ? e.target.getAttribute("href") : null; + let url; + if (e.defaultPrevented || href === null || this.wantsNewTab(e)) { + return false; + } + if (href.startsWith("mailto:") || href.startsWith("tel:")) { + return false; + } + if (e.target.isContentEditable) { + return false; + } + try { + url = new URL(href); + } catch (e2) { + try { + url = new URL(href, currentLocation); + } catch (e3) { + return true; + } + } + if (url.host === currentLocation.host && url.protocol === currentLocation.protocol) { + if (url.pathname === currentLocation.pathname && url.search === currentLocation.search) { + return url.hash === "" && !url.href.endsWith("#"); + } + } + return url.protocol.startsWith("http"); + }, + markPhxChildDestroyed(el) { + if (this.isPhxChild(el)) { + el.setAttribute(PHX_SESSION, ""); + } + this.putPrivate(el, "destroyed", true); + }, + findPhxChildrenInFragment(html, parentId) { + let template = document.createElement("template"); + template.innerHTML = html; + return this.findPhxChildren(template.content, parentId); + }, + isIgnored(el, phxUpdate) { + return (el.getAttribute(phxUpdate) || el.getAttribute("data-phx-update")) === "ignore"; + }, + isPhxUpdate(el, phxUpdate, updateTypes) { + return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0; + }, + findPhxSticky(el) { + return this.all(el, `[${PHX_STICKY}]`); + }, + findPhxChildren(el, parentId) { + return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}="${parentId}"]`); + }, + findExistingParentCIDs(node, cids) { + let parentCids = /* @__PURE__ */ new Set(); + let childrenCids = /* @__PURE__ */ new Set(); + cids.forEach((cid) => { + this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}="${cid}"]`), node).forEach((parent) => { + parentCids.add(cid); + this.all(parent, `[${PHX_COMPONENT}]`).map((el) => parseInt(el.getAttribute(PHX_COMPONENT))).forEach((childCID) => childrenCids.add(childCID)); + }); + }); + childrenCids.forEach((childCid) => parentCids.delete(childCid)); + return parentCids; + }, + filterWithinSameLiveView(nodes, parent) { + if (parent.querySelector(PHX_VIEW_SELECTOR)) { + return nodes.filter((el) => this.withinSameLiveView(el, parent)); + } else { + return nodes; + } + }, + withinSameLiveView(node, parent) { + while (node = node.parentNode) { + if (node.isSameNode(parent)) { + return true; + } + if (node.getAttribute(PHX_SESSION) !== null) { + return false; + } + } + }, + private(el, key) { + return el[PHX_PRIVATE] && el[PHX_PRIVATE][key]; + }, + deletePrivate(el, key) { + el[PHX_PRIVATE] && delete el[PHX_PRIVATE][key]; + }, + putPrivate(el, key, value) { + if (!el[PHX_PRIVATE]) { + el[PHX_PRIVATE] = {}; + } + el[PHX_PRIVATE][key] = value; + }, + updatePrivate(el, key, defaultVal, updateFunc) { + let existing = this.private(el, key); + if (existing === void 0) { + this.putPrivate(el, key, updateFunc(defaultVal)); + } else { + this.putPrivate(el, key, updateFunc(existing)); + } + }, + syncPendingAttrs(fromEl, toEl) { + if (!fromEl.hasAttribute(PHX_REF_SRC)) { + return; + } + PHX_EVENT_CLASSES.forEach((className) => { + fromEl.classList.contains(className) && toEl.classList.add(className); + }); + PHX_PENDING_ATTRS.filter((attr) => fromEl.hasAttribute(attr)).forEach((attr) => { + toEl.setAttribute(attr, fromEl.getAttribute(attr)); + }); + }, + copyPrivates(target, source) { + if (source[PHX_PRIVATE]) { + target[PHX_PRIVATE] = source[PHX_PRIVATE]; + } + }, + putTitle(str) { + let titleEl = document.querySelector("title"); + if (titleEl) { + let { prefix, suffix } = titleEl.dataset; + document.title = `${prefix || ""}${str}${suffix || ""}`; + } else { + document.title = str; + } + }, + debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, callback) { + let debounce = el.getAttribute(phxDebounce); + let throttle = el.getAttribute(phxThrottle); + if (debounce === "") { + debounce = defaultDebounce; + } + if (throttle === "") { + throttle = defaultThrottle; + } + let value = debounce || throttle; + switch (value) { + case null: + return callback(); + case "blur": + if (this.once(el, "debounce-blur")) { + el.addEventListener("blur", () => { + if (asyncFilter()) { + callback(); + } + }); + } + return; + default: + let timeout = parseInt(value); + let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback(); + let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger); + if (isNaN(timeout)) { + return logError(`invalid throttle/debounce value: ${value}`); + } + if (throttle) { + let newKeyDown = false; + if (event.type === "keydown") { + let prevKey = this.private(el, DEBOUNCE_PREV_KEY); + this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key); + newKeyDown = prevKey !== event.key; + } + if (!newKeyDown && this.private(el, THROTTLED)) { + return false; + } else { + callback(); + const t = setTimeout(() => { + if (asyncFilter()) { + this.triggerCycle(el, DEBOUNCE_TRIGGER); + } + }, timeout); + this.putPrivate(el, THROTTLED, t); + } + } else { + setTimeout(() => { + if (asyncFilter()) { + this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle); + } + }, timeout); + } + let form = el.form; + if (form && this.once(form, "bind-debounce")) { + form.addEventListener("submit", () => { + Array.from(new FormData(form).entries(), ([name]) => { + let input = form.querySelector(`[name="${name}"]`); + this.incCycle(input, DEBOUNCE_TRIGGER); + this.deletePrivate(input, THROTTLED); + }); + }); + } + if (this.once(el, "bind-debounce")) { + el.addEventListener("blur", () => { + clearTimeout(this.private(el, THROTTLED)); + this.triggerCycle(el, DEBOUNCE_TRIGGER); + }); + } + } + }, + triggerCycle(el, key, currentCycle) { + let [cycle, trigger] = this.private(el, key); + if (!currentCycle) { + currentCycle = cycle; + } + if (currentCycle === cycle) { + this.incCycle(el, key); + trigger(); + } + }, + once(el, key) { + if (this.private(el, key) === true) { + return false; + } + this.putPrivate(el, key, true); + return true; + }, + incCycle(el, key, trigger = function() { + }) { + let [currentCycle] = this.private(el, key) || [0, trigger]; + currentCycle++; + this.putPrivate(el, key, [currentCycle, trigger]); + return currentCycle; + }, + // maintains or adds privately used hook information + // fromEl and toEl can be the same element in the case of a newly added node + // fromEl and toEl can be any HTML node type, so we need to check if it's an element node + maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom) { + if (fromEl.hasAttribute && fromEl.hasAttribute("data-phx-hook") && !toEl.hasAttribute("data-phx-hook")) { + toEl.setAttribute("data-phx-hook", fromEl.getAttribute("data-phx-hook")); + } + if (toEl.hasAttribute && (toEl.hasAttribute(phxViewportTop) || toEl.hasAttribute(phxViewportBottom))) { + toEl.setAttribute("data-phx-hook", "Phoenix.InfiniteScroll"); + } + }, + putCustomElHook(el, hook) { + if (el.isConnected) { + el.setAttribute("data-phx-hook", ""); + } else { + console.error(` + hook attached to non-connected DOM element + ensure you are calling createHook within your connectedCallback. ${el.outerHTML} + `); + } + this.putPrivate(el, "custom-el-hook", hook); + }, + getCustomElHook(el) { + return this.private(el, "custom-el-hook"); + }, + isUsedInput(el) { + return el.nodeType === Node.ELEMENT_NODE && (this.private(el, PHX_HAS_FOCUSED) || this.private(el, PHX_HAS_SUBMITTED)); + }, + resetForm(form) { + Array.from(form.elements).forEach((input) => { + this.deletePrivate(input, PHX_HAS_FOCUSED); + this.deletePrivate(input, PHX_HAS_SUBMITTED); + }); + }, + isPhxChild(node) { + return node.getAttribute && node.getAttribute(PHX_PARENT_ID); + }, + isPhxSticky(node) { + return node.getAttribute && node.getAttribute(PHX_STICKY) !== null; + }, + isChildOfAny(el, parents) { + return !!parents.find((parent) => parent.contains(el)); + }, + firstPhxChild(el) { + return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0]; + }, + dispatchEvent(target, name, opts = {}) { + let defaultBubble = true; + let isUploadTarget = target.nodeName === "INPUT" && target.type === "file"; + if (isUploadTarget && name === "click") { + defaultBubble = false; + } + let bubbles = opts.bubbles === void 0 ? defaultBubble : !!opts.bubbles; + let eventOpts = { bubbles, cancelable: true, detail: opts.detail || {} }; + let event = name === "click" ? new MouseEvent("click", eventOpts) : new CustomEvent(name, eventOpts); + target.dispatchEvent(event); + }, + cloneNode(node, html) { + if (typeof html === "undefined") { + return node.cloneNode(true); + } else { + let cloned = node.cloneNode(false); + cloned.innerHTML = html; + return cloned; + } + }, + // merge attributes from source to target + // if an element is ignored, we only merge data attributes + // including removing data attributes that are no longer in the source + mergeAttrs(target, source, opts = {}) { + let exclude = new Set(opts.exclude || []); + let isIgnored = opts.isIgnored; + let sourceAttrs = source.attributes; + for (let i = sourceAttrs.length - 1; i >= 0; i--) { + let name = sourceAttrs[i].name; + if (!exclude.has(name)) { + const sourceValue = source.getAttribute(name); + if (target.getAttribute(name) !== sourceValue && (!isIgnored || isIgnored && name.startsWith("data-"))) { + target.setAttribute(name, sourceValue); + } + } else { + if (name === "value" && target.value === source.value) { + target.setAttribute("value", source.getAttribute(name)); + } + } + } + let targetAttrs = target.attributes; + for (let i = targetAttrs.length - 1; i >= 0; i--) { + let name = targetAttrs[i].name; + if (isIgnored) { + if (name.startsWith("data-") && !source.hasAttribute(name) && !PHX_PENDING_ATTRS.includes(name)) { + target.removeAttribute(name); + } + } else { + if (!source.hasAttribute(name)) { + target.removeAttribute(name); + } + } + } + }, + mergeFocusedInput(target, source) { + if (!(target instanceof HTMLSelectElement)) { + DOM.mergeAttrs(target, source, { exclude: ["value"] }); + } + if (source.readOnly) { + target.setAttribute("readonly", true); + } else { + target.removeAttribute("readonly"); + } + }, + hasSelectionRange(el) { + return el.setSelectionRange && (el.type === "text" || el.type === "textarea"); + }, + restoreFocus(focused, selectionStart, selectionEnd) { + if (focused instanceof HTMLSelectElement) { + focused.focus(); + } + if (!DOM.isTextualInput(focused)) { + return; + } + let wasFocused = focused.matches(":focus"); + if (!wasFocused) { + focused.focus(); + } + if (this.hasSelectionRange(focused)) { + focused.setSelectionRange(selectionStart, selectionEnd); + } + }, + isFormInput(el) { + return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== "button"; + }, + syncAttrsToProps(el) { + if (el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0) { + el.checked = el.getAttribute("checked") !== null; + } + }, + isTextualInput(el) { + return FOCUSABLE_INPUTS.indexOf(el.type) >= 0; + }, + isNowTriggerFormExternal(el, phxTriggerExternal) { + return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null; + }, + cleanChildNodes(container, phxUpdate) { + if (DOM.isPhxUpdate(container, phxUpdate, ["append", "prepend"])) { + let toRemove = []; + container.childNodes.forEach((childNode) => { + if (!childNode.id) { + let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === ""; + if (!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE) { + logError(`only HTML element tags with an id are allowed inside containers with phx-update. + +removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" + +`); + } + toRemove.push(childNode); + } + }); + toRemove.forEach((childNode) => childNode.remove()); + } + }, + replaceRootContainer(container, tagName, attrs) { + let retainedAttrs = /* @__PURE__ */ new Set(["id", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID]); + if (container.tagName.toLowerCase() === tagName.toLowerCase()) { + Array.from(container.attributes).filter((attr) => !retainedAttrs.has(attr.name.toLowerCase())).forEach((attr) => container.removeAttribute(attr.name)); + Object.keys(attrs).filter((name) => !retainedAttrs.has(name.toLowerCase())).forEach((attr) => container.setAttribute(attr, attrs[attr])); + return container; + } else { + let newContainer = document.createElement(tagName); + Object.keys(attrs).forEach((attr) => newContainer.setAttribute(attr, attrs[attr])); + retainedAttrs.forEach((attr) => newContainer.setAttribute(attr, container.getAttribute(attr))); + newContainer.innerHTML = container.innerHTML; + container.replaceWith(newContainer); + return newContainer; + } + }, + getSticky(el, name, defaultVal) { + let op = (DOM.private(el, "sticky") || []).find(([existingName]) => name === existingName); + if (op) { + let [_name, _op, stashedResult] = op; + return stashedResult; + } else { + return typeof defaultVal === "function" ? defaultVal() : defaultVal; + } + }, + deleteSticky(el, name) { + this.updatePrivate(el, "sticky", [], (ops) => { + return ops.filter(([existingName, _]) => existingName !== name); + }); + }, + putSticky(el, name, op) { + let stashedResult = op(el); + this.updatePrivate(el, "sticky", [], (ops) => { + let existingIndex = ops.findIndex(([existingName]) => name === existingName); + if (existingIndex >= 0) { + ops[existingIndex] = [name, op, stashedResult]; + } else { + ops.push([name, op, stashedResult]); + } + return ops; + }); + }, + applyStickyOperations(el) { + let ops = DOM.private(el, "sticky"); + if (!ops) { + return; + } + ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op)); + } + }; + var dom_default = DOM; + var UploadEntry = class { + static isActive(fileEl, file) { + let isNew = file._phxRef === void 0; + let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(","); + let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0; + return file.size > 0 && (isNew || isActive); + } + static isPreflighted(fileEl, file) { + let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(","); + let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0; + return isPreflighted && this.isActive(fileEl, file); + } + static isPreflightInProgress(file) { + return file._preflightInProgress === true; + } + static markPreflightInProgress(file) { + file._preflightInProgress = true; + } + constructor(fileEl, file, view, autoUpload) { + this.ref = LiveUploader.genFileRef(file); + this.fileEl = fileEl; + this.file = file; + this.view = view; + this.meta = null; + this._isCancelled = false; + this._isDone = false; + this._progress = 0; + this._lastProgressSent = -1; + this._onDone = function() { + }; + this._onElUpdated = this.onElUpdated.bind(this); + this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated); + this.autoUpload = autoUpload; + } + metadata() { + return this.meta; + } + progress(progress) { + this._progress = Math.floor(progress); + if (this._progress > this._lastProgressSent) { + if (this._progress >= 100) { + this._progress = 100; + this._lastProgressSent = 100; + this._isDone = true; + this.view.pushFileProgress(this.fileEl, this.ref, 100, () => { + LiveUploader.untrackFile(this.fileEl, this.file); + this._onDone(); + }); + } else { + this._lastProgressSent = this._progress; + this.view.pushFileProgress(this.fileEl, this.ref, this._progress); + } + } + } + isCancelled() { + return this._isCancelled; + } + cancel() { + this.file._preflightInProgress = false; + this._isCancelled = true; + this._isDone = true; + this._onDone(); + } + isDone() { + return this._isDone; + } + error(reason = "failed") { + this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated); + this.view.pushFileProgress(this.fileEl, this.ref, { error: reason }); + if (!this.isAutoUpload()) { + LiveUploader.clearFiles(this.fileEl); + } + } + isAutoUpload() { + return this.autoUpload; + } + //private + onDone(callback) { + this._onDone = () => { + this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated); + callback(); + }; + } + onElUpdated() { + let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(","); + if (activeRefs.indexOf(this.ref) === -1) { + LiveUploader.untrackFile(this.fileEl, this.file); + this.cancel(); + } + } + toPreflightPayload() { + return { + last_modified: this.file.lastModified, + name: this.file.name, + relative_path: this.file.webkitRelativePath, + size: this.file.size, + type: this.file.type, + ref: this.ref, + meta: typeof this.file.meta === "function" ? this.file.meta() : void 0 + }; + } + uploader(uploaders) { + if (this.meta.uploader) { + let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`); + return { name: this.meta.uploader, callback }; + } else { + return { name: "channel", callback: channelUploader }; + } + } + zipPostFlight(resp) { + this.meta = resp.entries[this.ref]; + if (!this.meta) { + logError(`no preflight upload response returned with ref ${this.ref}`, { input: this.fileEl, response: resp }); + } + } + }; + var liveUploaderFileRef = 0; + var LiveUploader = class _LiveUploader { + static genFileRef(file) { + let ref = file._phxRef; + if (ref !== void 0) { + return ref; + } else { + file._phxRef = (liveUploaderFileRef++).toString(); + return file._phxRef; + } + } + static getEntryDataURL(inputEl, ref, callback) { + let file = this.activeFiles(inputEl).find((file2) => this.genFileRef(file2) === ref); + callback(URL.createObjectURL(file)); + } + static hasUploadsInProgress(formEl) { + let active = 0; + dom_default.findUploadInputs(formEl).forEach((input) => { + if (input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)) { + active++; + } + }); + return active > 0; + } + static serializeUploads(inputEl) { + let files = this.activeFiles(inputEl); + let fileData = {}; + files.forEach((file) => { + let entry = { path: inputEl.name }; + let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF); + fileData[uploadRef] = fileData[uploadRef] || []; + entry.ref = this.genFileRef(file); + entry.last_modified = file.lastModified; + entry.name = file.name || entry.ref; + entry.relative_path = file.webkitRelativePath; + entry.type = file.type; + entry.size = file.size; + if (typeof file.meta === "function") { + entry.meta = file.meta(); + } + fileData[uploadRef].push(entry); + }); + return fileData; + } + static clearFiles(inputEl) { + inputEl.value = null; + inputEl.removeAttribute(PHX_UPLOAD_REF); + dom_default.putPrivate(inputEl, "files", []); + } + static untrackFile(inputEl, file) { + dom_default.putPrivate(inputEl, "files", dom_default.private(inputEl, "files").filter((f) => !Object.is(f, file))); + } + static trackFiles(inputEl, files, dataTransfer) { + if (inputEl.getAttribute("multiple") !== null) { + let newFiles = files.filter((file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file))); + dom_default.updatePrivate(inputEl, "files", [], (existing) => existing.concat(newFiles)); + inputEl.value = null; + } else { + if (dataTransfer && dataTransfer.files.length > 0) { + inputEl.files = dataTransfer.files; + } + dom_default.putPrivate(inputEl, "files", files); + } + } + static activeFileInputs(formEl) { + let fileInputs = dom_default.findUploadInputs(formEl); + return Array.from(fileInputs).filter((el) => el.files && this.activeFiles(el).length > 0); + } + static activeFiles(input) { + return (dom_default.private(input, "files") || []).filter((f) => UploadEntry.isActive(input, f)); + } + static inputsAwaitingPreflight(formEl) { + let fileInputs = dom_default.findUploadInputs(formEl); + return Array.from(fileInputs).filter((input) => this.filesAwaitingPreflight(input).length > 0); + } + static filesAwaitingPreflight(input) { + return this.activeFiles(input).filter((f) => !UploadEntry.isPreflighted(input, f) && !UploadEntry.isPreflightInProgress(f)); + } + static markPreflightInProgress(entries) { + entries.forEach((entry) => UploadEntry.markPreflightInProgress(entry.file)); + } + constructor(inputEl, view, onComplete) { + this.autoUpload = dom_default.isAutoUpload(inputEl); + this.view = view; + this.onComplete = onComplete; + this._entries = Array.from(_LiveUploader.filesAwaitingPreflight(inputEl) || []).map((file) => new UploadEntry(inputEl, file, view, this.autoUpload)); + _LiveUploader.markPreflightInProgress(this._entries); + this.numEntriesInProgress = this._entries.length; + } + isAutoUpload() { + return this.autoUpload; + } + entries() { + return this._entries; + } + initAdapterUpload(resp, onError, liveSocket2) { + this._entries = this._entries.map((entry) => { + if (entry.isCancelled()) { + this.numEntriesInProgress--; + if (this.numEntriesInProgress === 0) { + this.onComplete(); + } + } else { + entry.zipPostFlight(resp); + entry.onDone(() => { + this.numEntriesInProgress--; + if (this.numEntriesInProgress === 0) { + this.onComplete(); + } + }); + } + return entry; + }); + let groupedEntries = this._entries.reduce((acc, entry) => { + if (!entry.meta) { + return acc; + } + let { name, callback } = entry.uploader(liveSocket2.uploaders); + acc[name] = acc[name] || { callback, entries: [] }; + acc[name].entries.push(entry); + return acc; + }, {}); + for (let name in groupedEntries) { + let { callback, entries } = groupedEntries[name]; + callback(entries, onError, resp, liveSocket2); + } + } + }; + var Hooks = { + LiveFileUpload: { + activeRefs() { + return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS); + }, + preflightedRefs() { + return this.el.getAttribute(PHX_PREFLIGHTED_REFS); + }, + mounted() { + this.preflightedWas = this.preflightedRefs(); + }, + updated() { + let newPreflights = this.preflightedRefs(); + if (this.preflightedWas !== newPreflights) { + this.preflightedWas = newPreflights; + if (newPreflights === "") { + this.__view().cancelSubmit(this.el.form); + } + } + if (this.activeRefs() === "") { + this.el.value = null; + } + this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED)); + } + }, + LiveImgPreview: { + mounted() { + this.ref = this.el.getAttribute("data-phx-entry-ref"); + this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF)); + LiveUploader.getEntryDataURL(this.inputEl, this.ref, (url) => { + this.url = url; + this.el.src = url; + }); + }, + destroyed() { + URL.revokeObjectURL(this.url); + } + }, + FocusWrap: { + mounted() { + this.focusStart = this.el.firstElementChild; + this.focusEnd = this.el.lastElementChild; + this.focusStart.addEventListener("focus", () => aria_default.focusLast(this.el)); + this.focusEnd.addEventListener("focus", () => aria_default.focusFirst(this.el)); + this.el.addEventListener("phx:show-end", () => this.el.focus()); + if (window.getComputedStyle(this.el).display !== "none") { + aria_default.focusFirst(this.el); + } + } + } + }; + var findScrollContainer = (el) => { + if (["HTML", "BODY"].indexOf(el.nodeName.toUpperCase()) >= 0) + return null; + if (["scroll", "auto"].indexOf(getComputedStyle(el).overflowY) >= 0) + return el; + return findScrollContainer(el.parentElement); + }; + var scrollTop = (scrollContainer) => { + if (scrollContainer) { + return scrollContainer.scrollTop; + } else { + return document.documentElement.scrollTop || document.body.scrollTop; + } + }; + var bottom = (scrollContainer) => { + if (scrollContainer) { + return scrollContainer.getBoundingClientRect().bottom; + } else { + return window.innerHeight || document.documentElement.clientHeight; + } + }; + var top = (scrollContainer) => { + if (scrollContainer) { + return scrollContainer.getBoundingClientRect().top; + } else { + return 0; + } + }; + var isAtViewportTop = (el, scrollContainer) => { + let rect = el.getBoundingClientRect(); + return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer); + }; + var isAtViewportBottom = (el, scrollContainer) => { + let rect = el.getBoundingClientRect(); + return Math.ceil(rect.bottom) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.bottom) <= bottom(scrollContainer); + }; + var isWithinViewport = (el, scrollContainer) => { + let rect = el.getBoundingClientRect(); + return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer); + }; + Hooks.InfiniteScroll = { + mounted() { + this.scrollContainer = findScrollContainer(this.el); + let scrollBefore = scrollTop(this.scrollContainer); + let topOverran = false; + let throttleInterval = 500; + let pendingOp = null; + let onTopOverrun = this.throttle(throttleInterval, (topEvent, firstChild) => { + pendingOp = () => true; + this.liveSocket.execJSHookPush(this.el, topEvent, { id: firstChild.id, _overran: true }, () => { + pendingOp = null; + }); + }); + let onFirstChildAtTop = this.throttle(throttleInterval, (topEvent, firstChild) => { + pendingOp = () => firstChild.scrollIntoView({ block: "start" }); + this.liveSocket.execJSHookPush(this.el, topEvent, { id: firstChild.id }, () => { + pendingOp = null; + window.requestAnimationFrame(() => { + if (!isWithinViewport(firstChild, this.scrollContainer)) { + firstChild.scrollIntoView({ block: "start" }); + } + }); + }); + }); + let onLastChildAtBottom = this.throttle(throttleInterval, (bottomEvent, lastChild) => { + pendingOp = () => lastChild.scrollIntoView({ block: "end" }); + this.liveSocket.execJSHookPush(this.el, bottomEvent, { id: lastChild.id }, () => { + pendingOp = null; + window.requestAnimationFrame(() => { + if (!isWithinViewport(lastChild, this.scrollContainer)) { + lastChild.scrollIntoView({ block: "end" }); + } + }); + }); + }); + this.onScroll = (_e) => { + let scrollNow = scrollTop(this.scrollContainer); + if (pendingOp) { + scrollBefore = scrollNow; + return pendingOp(); + } + let rect = this.el.getBoundingClientRect(); + let topEvent = this.el.getAttribute(this.liveSocket.binding("viewport-top")); + let bottomEvent = this.el.getAttribute(this.liveSocket.binding("viewport-bottom")); + let lastChild = this.el.lastElementChild; + let firstChild = this.el.firstElementChild; + let isScrollingUp = scrollNow < scrollBefore; + let isScrollingDown = scrollNow > scrollBefore; + if (isScrollingUp && topEvent && !topOverran && rect.top >= 0) { + topOverran = true; + onTopOverrun(topEvent, firstChild); + } else if (isScrollingDown && topOverran && rect.top <= 0) { + topOverran = false; + } + if (topEvent && isScrollingUp && isAtViewportTop(firstChild, this.scrollContainer)) { + onFirstChildAtTop(topEvent, firstChild); + } else if (bottomEvent && isScrollingDown && isAtViewportBottom(lastChild, this.scrollContainer)) { + onLastChildAtBottom(bottomEvent, lastChild); + } + scrollBefore = scrollNow; + }; + if (this.scrollContainer) { + this.scrollContainer.addEventListener("scroll", this.onScroll); + } else { + window.addEventListener("scroll", this.onScroll); + } + }, + destroyed() { + if (this.scrollContainer) { + this.scrollContainer.removeEventListener("scroll", this.onScroll); + } else { + window.removeEventListener("scroll", this.onScroll); + } + }, + throttle(interval, callback) { + let lastCallAt = 0; + let timer; + return (...args) => { + let now = Date.now(); + let remainingTime = interval - (now - lastCallAt); + if (remainingTime <= 0 || remainingTime > interval) { + if (timer) { + clearTimeout(timer); + timer = null; + } + lastCallAt = now; + callback(...args); + } else if (!timer) { + timer = setTimeout(() => { + lastCallAt = Date.now(); + timer = null; + callback(...args); + }, remainingTime); + } + }; + } + }; + var hooks_default = Hooks; + var ElementRef = class { + constructor(el) { + this.el = el; + this.loadingRef = el.hasAttribute(PHX_REF_LOADING) ? parseInt(el.getAttribute(PHX_REF_LOADING), 10) : null; + this.lockRef = el.hasAttribute(PHX_REF_LOCK) ? parseInt(el.getAttribute(PHX_REF_LOCK), 10) : null; + } + // public + maybeUndo(ref, phxEvent, eachCloneCallback) { + if (!this.isWithin(ref)) { + return; + } + this.undoLocks(ref, phxEvent, eachCloneCallback); + this.undoLoading(ref, phxEvent); + if (this.isFullyResolvedBy(ref)) { + this.el.removeAttribute(PHX_REF_SRC); + } + } + // private + isWithin(ref) { + return !(this.loadingRef !== null && this.loadingRef > ref && (this.lockRef !== null && this.lockRef > ref)); + } + // Check for cloned PHX_REF_LOCK element that has been morphed behind + // the scenes while this element was locked in the DOM. + // When we apply the cloned tree to the active DOM element, we must + // + // 1. execute pending mounted hooks for nodes now in the DOM + // 2. undo any ref inside the cloned tree that has since been ack'd + undoLocks(ref, phxEvent, eachCloneCallback) { + if (!this.isLockUndoneBy(ref)) { + return; + } + let clonedTree = dom_default.private(this.el, PHX_REF_LOCK); + if (clonedTree) { + eachCloneCallback(clonedTree); + dom_default.deletePrivate(this.el, PHX_REF_LOCK); + } + this.el.removeAttribute(PHX_REF_LOCK); + let opts = { detail: { ref, event: phxEvent }, bubbles: true, cancelable: false }; + this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts)); + } + undoLoading(ref, phxEvent) { + if (!this.isLoadingUndoneBy(ref)) { + if (this.canUndoLoading(ref) && this.el.classList.contains("phx-submit-loading")) { + this.el.classList.remove("phx-change-loading"); + } + return; + } + if (this.canUndoLoading(ref)) { + this.el.removeAttribute(PHX_REF_LOADING); + let disabledVal = this.el.getAttribute(PHX_DISABLED); + let readOnlyVal = this.el.getAttribute(PHX_READONLY); + if (readOnlyVal !== null) { + this.el.readOnly = readOnlyVal === "true" ? true : false; + this.el.removeAttribute(PHX_READONLY); + } + if (disabledVal !== null) { + this.el.disabled = disabledVal === "true" ? true : false; + this.el.removeAttribute(PHX_DISABLED); + } + let disableRestore = this.el.getAttribute(PHX_DISABLE_WITH_RESTORE); + if (disableRestore !== null) { + this.el.innerText = disableRestore; + this.el.removeAttribute(PHX_DISABLE_WITH_RESTORE); + } + let opts = { detail: { ref, event: phxEvent }, bubbles: true, cancelable: false }; + this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts)); + } + PHX_EVENT_CLASSES.forEach((name) => { + if (name !== "phx-submit-loading" || this.canUndoLoading(ref)) { + dom_default.removeClass(this.el, name); + } + }); + } + isLoadingUndoneBy(ref) { + return this.loadingRef === null ? false : this.loadingRef <= ref; + } + isLockUndoneBy(ref) { + return this.lockRef === null ? false : this.lockRef <= ref; + } + isFullyResolvedBy(ref) { + return (this.loadingRef === null || this.loadingRef <= ref) && (this.lockRef === null || this.lockRef <= ref); + } + // only remove the phx-submit-loading class if we are not locked + canUndoLoading(ref) { + return this.lockRef === null || this.lockRef <= ref; + } + }; + var DOMPostMorphRestorer = class { + constructor(containerBefore, containerAfter, updateType) { + let idsBefore = /* @__PURE__ */ new Set(); + let idsAfter = new Set([...containerAfter.children].map((child) => child.id)); + let elementsToModify = []; + Array.from(containerBefore.children).forEach((child) => { + if (child.id) { + idsBefore.add(child.id); + if (idsAfter.has(child.id)) { + let previousElementId = child.previousElementSibling && child.previousElementSibling.id; + elementsToModify.push({ elementId: child.id, previousElementId }); + } + } + }); + this.containerId = containerAfter.id; + this.updateType = updateType; + this.elementsToModify = elementsToModify; + this.elementIdsToAdd = [...idsAfter].filter((id) => !idsBefore.has(id)); + } + // We do the following to optimize append/prepend operations: + // 1) Track ids of modified elements & of new elements + // 2) All the modified elements are put back in the correct position in the DOM tree + // by storing the id of their previous sibling + // 3) New elements are going to be put in the right place by morphdom during append. + // For prepend, we move them to the first position in the container + perform() { + let container = dom_default.byId(this.containerId); + this.elementsToModify.forEach((elementToModify) => { + if (elementToModify.previousElementId) { + maybe(document.getElementById(elementToModify.previousElementId), (previousElem) => { + maybe(document.getElementById(elementToModify.elementId), (elem) => { + let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id; + if (!isInRightPlace) { + previousElem.insertAdjacentElement("afterend", elem); + } + }); + }); + } else { + maybe(document.getElementById(elementToModify.elementId), (elem) => { + let isInRightPlace = elem.previousElementSibling == null; + if (!isInRightPlace) { + container.insertAdjacentElement("afterbegin", elem); + } + }); + } + }); + if (this.updateType == "prepend") { + this.elementIdsToAdd.reverse().forEach((elemId) => { + maybe(document.getElementById(elemId), (elem) => container.insertAdjacentElement("afterbegin", elem)); + }); + } + } + }; + var DOCUMENT_FRAGMENT_NODE = 11; + function morphAttrs(fromNode, toNode) { + var toNodeAttrs = toNode.attributes; + var attr; + var attrName; + var attrNamespaceURI; + var attrValue; + var fromValue; + if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) { + return; + } + for (var i = toNodeAttrs.length - 1; i >= 0; i--) { + attr = toNodeAttrs[i]; + attrName = attr.name; + attrNamespaceURI = attr.namespaceURI; + attrValue = attr.value; + if (attrNamespaceURI) { + attrName = attr.localName || attrName; + fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName); + if (fromValue !== attrValue) { + if (attr.prefix === "xmlns") { + attrName = attr.name; + } + fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue); + } + } else { + fromValue = fromNode.getAttribute(attrName); + if (fromValue !== attrValue) { + fromNode.setAttribute(attrName, attrValue); + } + } + } + var fromNodeAttrs = fromNode.attributes; + for (var d = fromNodeAttrs.length - 1; d >= 0; d--) { + attr = fromNodeAttrs[d]; + attrName = attr.name; + attrNamespaceURI = attr.namespaceURI; + if (attrNamespaceURI) { + attrName = attr.localName || attrName; + if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) { + fromNode.removeAttributeNS(attrNamespaceURI, attrName); + } + } else { + if (!toNode.hasAttribute(attrName)) { + fromNode.removeAttribute(attrName); + } + } + } + } + var range; + var NS_XHTML = "http://www.w3.org/1999/xhtml"; + var doc = typeof document === "undefined" ? void 0 : document; + var HAS_TEMPLATE_SUPPORT = !!doc && "content" in doc.createElement("template"); + var HAS_RANGE_SUPPORT = !!doc && doc.createRange && "createContextualFragment" in doc.createRange(); + function createFragmentFromTemplate(str) { + var template = doc.createElement("template"); + template.innerHTML = str; + return template.content.childNodes[0]; + } + function createFragmentFromRange(str) { + if (!range) { + range = doc.createRange(); + range.selectNode(doc.body); + } + var fragment = range.createContextualFragment(str); + return fragment.childNodes[0]; + } + function createFragmentFromWrap(str) { + var fragment = doc.createElement("body"); + fragment.innerHTML = str; + return fragment.childNodes[0]; + } + function toElement(str) { + str = str.trim(); + if (HAS_TEMPLATE_SUPPORT) { + return createFragmentFromTemplate(str); + } else if (HAS_RANGE_SUPPORT) { + return createFragmentFromRange(str); + } + return createFragmentFromWrap(str); + } + function compareNodeNames(fromEl, toEl) { + var fromNodeName = fromEl.nodeName; + var toNodeName = toEl.nodeName; + var fromCodeStart, toCodeStart; + if (fromNodeName === toNodeName) { + return true; + } + fromCodeStart = fromNodeName.charCodeAt(0); + toCodeStart = toNodeName.charCodeAt(0); + if (fromCodeStart <= 90 && toCodeStart >= 97) { + return fromNodeName === toNodeName.toUpperCase(); + } else if (toCodeStart <= 90 && fromCodeStart >= 97) { + return toNodeName === fromNodeName.toUpperCase(); + } else { + return false; + } + } + function createElementNS(name, namespaceURI) { + return !namespaceURI || namespaceURI === NS_XHTML ? doc.createElement(name) : doc.createElementNS(namespaceURI, name); + } + function moveChildren(fromEl, toEl) { + var curChild = fromEl.firstChild; + while (curChild) { + var nextChild = curChild.nextSibling; + toEl.appendChild(curChild); + curChild = nextChild; + } + return toEl; + } + function syncBooleanAttrProp(fromEl, toEl, name) { + if (fromEl[name] !== toEl[name]) { + fromEl[name] = toEl[name]; + if (fromEl[name]) { + fromEl.setAttribute(name, ""); + } else { + fromEl.removeAttribute(name); + } + } + } + var specialElHandlers = { + OPTION: function(fromEl, toEl) { + var parentNode = fromEl.parentNode; + if (parentNode) { + var parentName = parentNode.nodeName.toUpperCase(); + if (parentName === "OPTGROUP") { + parentNode = parentNode.parentNode; + parentName = parentNode && parentNode.nodeName.toUpperCase(); + } + if (parentName === "SELECT" && !parentNode.hasAttribute("multiple")) { + if (fromEl.hasAttribute("selected") && !toEl.selected) { + fromEl.setAttribute("selected", "selected"); + fromEl.removeAttribute("selected"); + } + parentNode.selectedIndex = -1; + } + } + syncBooleanAttrProp(fromEl, toEl, "selected"); + }, + /** + * The "value" attribute is special for the element since it sets + * the initial value. Changing the "value" attribute without changing the + * "value" property will have no effect since it is only used to the set the + * initial value. Similar for the "checked" attribute, and "disabled". + */ + INPUT: function(fromEl, toEl) { + syncBooleanAttrProp(fromEl, toEl, "checked"); + syncBooleanAttrProp(fromEl, toEl, "disabled"); + if (fromEl.value !== toEl.value) { + fromEl.value = toEl.value; + } + if (!toEl.hasAttribute("value")) { + fromEl.removeAttribute("value"); + } + }, + TEXTAREA: function(fromEl, toEl) { + var newValue = toEl.value; + if (fromEl.value !== newValue) { + fromEl.value = newValue; + } + var firstChild = fromEl.firstChild; + if (firstChild) { + var oldValue = firstChild.nodeValue; + if (oldValue == newValue || !newValue && oldValue == fromEl.placeholder) { + return; + } + firstChild.nodeValue = newValue; + } + }, + SELECT: function(fromEl, toEl) { + if (!toEl.hasAttribute("multiple")) { + var selectedIndex = -1; + var i = 0; + var curChild = fromEl.firstChild; + var optgroup; + var nodeName; + while (curChild) { + nodeName = curChild.nodeName && curChild.nodeName.toUpperCase(); + if (nodeName === "OPTGROUP") { + optgroup = curChild; + curChild = optgroup.firstChild; + } else { + if (nodeName === "OPTION") { + if (curChild.hasAttribute("selected")) { + selectedIndex = i; + break; + } + i++; + } + curChild = curChild.nextSibling; + if (!curChild && optgroup) { + curChild = optgroup.nextSibling; + optgroup = null; + } + } + } + fromEl.selectedIndex = selectedIndex; + } + } + }; + var ELEMENT_NODE = 1; + var DOCUMENT_FRAGMENT_NODE$1 = 11; + var TEXT_NODE = 3; + var COMMENT_NODE = 8; + function noop() { + } + function defaultGetNodeKey(node) { + if (node) { + return node.getAttribute && node.getAttribute("id") || node.id; + } + } + function morphdomFactory(morphAttrs2) { + return function morphdom2(fromNode, toNode, options) { + if (!options) { + options = {}; + } + if (typeof toNode === "string") { + if (fromNode.nodeName === "#document" || fromNode.nodeName === "HTML" || fromNode.nodeName === "BODY") { + var toNodeHtml = toNode; + toNode = doc.createElement("html"); + toNode.innerHTML = toNodeHtml; + } else { + toNode = toElement(toNode); + } + } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) { + toNode = toNode.firstElementChild; + } + var getNodeKey = options.getNodeKey || defaultGetNodeKey; + var onBeforeNodeAdded = options.onBeforeNodeAdded || noop; + var onNodeAdded = options.onNodeAdded || noop; + var onBeforeElUpdated = options.onBeforeElUpdated || noop; + var onElUpdated = options.onElUpdated || noop; + var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop; + var onNodeDiscarded = options.onNodeDiscarded || noop; + var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop; + var skipFromChildren = options.skipFromChildren || noop; + var addChild = options.addChild || function(parent, child) { + return parent.appendChild(child); + }; + var childrenOnly = options.childrenOnly === true; + var fromNodesLookup = /* @__PURE__ */ Object.create(null); + var keyedRemovalList = []; + function addKeyedRemoval(key) { + keyedRemovalList.push(key); + } + function walkDiscardedChildNodes(node, skipKeyedNodes) { + if (node.nodeType === ELEMENT_NODE) { + var curChild = node.firstChild; + while (curChild) { + var key = void 0; + if (skipKeyedNodes && (key = getNodeKey(curChild))) { + addKeyedRemoval(key); + } else { + onNodeDiscarded(curChild); + if (curChild.firstChild) { + walkDiscardedChildNodes(curChild, skipKeyedNodes); + } + } + curChild = curChild.nextSibling; + } + } + } + function removeNode(node, parentNode, skipKeyedNodes) { + if (onBeforeNodeDiscarded(node) === false) { + return; + } + if (parentNode) { + parentNode.removeChild(node); + } + onNodeDiscarded(node); + walkDiscardedChildNodes(node, skipKeyedNodes); + } + function indexTree(node) { + if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) { + var curChild = node.firstChild; + while (curChild) { + var key = getNodeKey(curChild); + if (key) { + fromNodesLookup[key] = curChild; + } + indexTree(curChild); + curChild = curChild.nextSibling; + } + } + } + indexTree(fromNode); + function handleNodeAdded(el) { + onNodeAdded(el); + var curChild = el.firstChild; + while (curChild) { + var nextSibling = curChild.nextSibling; + var key = getNodeKey(curChild); + if (key) { + var unmatchedFromEl = fromNodesLookup[key]; + if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) { + curChild.parentNode.replaceChild(unmatchedFromEl, curChild); + morphEl(unmatchedFromEl, curChild); + } else { + handleNodeAdded(curChild); + } + } else { + handleNodeAdded(curChild); + } + curChild = nextSibling; + } + } + function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) { + while (curFromNodeChild) { + var fromNextSibling = curFromNodeChild.nextSibling; + if (curFromNodeKey = getNodeKey(curFromNodeChild)) { + addKeyedRemoval(curFromNodeKey); + } else { + removeNode( + curFromNodeChild, + fromEl, + true + /* skip keyed nodes */ + ); + } + curFromNodeChild = fromNextSibling; + } + } + function morphEl(fromEl, toEl, childrenOnly2) { + var toElKey = getNodeKey(toEl); + if (toElKey) { + delete fromNodesLookup[toElKey]; + } + if (!childrenOnly2) { + var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl); + if (beforeUpdateResult === false) { + return; + } else if (beforeUpdateResult instanceof HTMLElement) { + fromEl = beforeUpdateResult; + indexTree(fromEl); + } + morphAttrs2(fromEl, toEl); + onElUpdated(fromEl); + if (onBeforeElChildrenUpdated(fromEl, toEl) === false) { + return; + } + } + if (fromEl.nodeName !== "TEXTAREA") { + morphChildren(fromEl, toEl); + } else { + specialElHandlers.TEXTAREA(fromEl, toEl); + } + } + function morphChildren(fromEl, toEl) { + var skipFrom = skipFromChildren(fromEl, toEl); + var curToNodeChild = toEl.firstChild; + var curFromNodeChild = fromEl.firstChild; + var curToNodeKey; + var curFromNodeKey; + var fromNextSibling; + var toNextSibling; + var matchingFromEl; + outer: + while (curToNodeChild) { + toNextSibling = curToNodeChild.nextSibling; + curToNodeKey = getNodeKey(curToNodeChild); + while (!skipFrom && curFromNodeChild) { + fromNextSibling = curFromNodeChild.nextSibling; + if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) { + curToNodeChild = toNextSibling; + curFromNodeChild = fromNextSibling; + continue outer; + } + curFromNodeKey = getNodeKey(curFromNodeChild); + var curFromNodeType = curFromNodeChild.nodeType; + var isCompatible = void 0; + if (curFromNodeType === curToNodeChild.nodeType) { + if (curFromNodeType === ELEMENT_NODE) { + if (curToNodeKey) { + if (curToNodeKey !== curFromNodeKey) { + if (matchingFromEl = fromNodesLookup[curToNodeKey]) { + if (fromNextSibling === matchingFromEl) { + isCompatible = false; + } else { + fromEl.insertBefore(matchingFromEl, curFromNodeChild); + if (curFromNodeKey) { + addKeyedRemoval(curFromNodeKey); + } else { + removeNode( + curFromNodeChild, + fromEl, + true + /* skip keyed nodes */ + ); + } + curFromNodeChild = matchingFromEl; + curFromNodeKey = getNodeKey(curFromNodeChild); + } + } else { + isCompatible = false; + } + } + } else if (curFromNodeKey) { + isCompatible = false; + } + isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild); + if (isCompatible) { + morphEl(curFromNodeChild, curToNodeChild); + } + } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) { + isCompatible = true; + if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) { + curFromNodeChild.nodeValue = curToNodeChild.nodeValue; + } + } + } + if (isCompatible) { + curToNodeChild = toNextSibling; + curFromNodeChild = fromNextSibling; + continue outer; + } + if (curFromNodeKey) { + addKeyedRemoval(curFromNodeKey); + } else { + removeNode( + curFromNodeChild, + fromEl, + true + /* skip keyed nodes */ + ); + } + curFromNodeChild = fromNextSibling; + } + if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) { + if (!skipFrom) { + addChild(fromEl, matchingFromEl); + } + morphEl(matchingFromEl, curToNodeChild); + } else { + var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild); + if (onBeforeNodeAddedResult !== false) { + if (onBeforeNodeAddedResult) { + curToNodeChild = onBeforeNodeAddedResult; + } + if (curToNodeChild.actualize) { + curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc); + } + addChild(fromEl, curToNodeChild); + handleNodeAdded(curToNodeChild); + } + } + curToNodeChild = toNextSibling; + curFromNodeChild = fromNextSibling; + } + cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey); + var specialElHandler = specialElHandlers[fromEl.nodeName]; + if (specialElHandler) { + specialElHandler(fromEl, toEl); + } + } + var morphedNode = fromNode; + var morphedNodeType = morphedNode.nodeType; + var toNodeType = toNode.nodeType; + if (!childrenOnly) { + if (morphedNodeType === ELEMENT_NODE) { + if (toNodeType === ELEMENT_NODE) { + if (!compareNodeNames(fromNode, toNode)) { + onNodeDiscarded(fromNode); + morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI)); + } + } else { + morphedNode = toNode; + } + } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { + if (toNodeType === morphedNodeType) { + if (morphedNode.nodeValue !== toNode.nodeValue) { + morphedNode.nodeValue = toNode.nodeValue; + } + return morphedNode; + } else { + morphedNode = toNode; + } + } + } + if (morphedNode === toNode) { + onNodeDiscarded(fromNode); + } else { + if (toNode.isSameNode && toNode.isSameNode(morphedNode)) { + return; + } + morphEl(morphedNode, toNode, childrenOnly); + if (keyedRemovalList) { + for (var i = 0, len = keyedRemovalList.length; i < len; i++) { + var elToRemove = fromNodesLookup[keyedRemovalList[i]]; + if (elToRemove) { + removeNode(elToRemove, elToRemove.parentNode, false); + } + } + } + } + if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) { + if (morphedNode.actualize) { + morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc); + } + fromNode.parentNode.replaceChild(morphedNode, fromNode); + } + return morphedNode; + }; + } + var morphdom = morphdomFactory(morphAttrs); + var morphdom_esm_default = morphdom; + var DOMPatch = class { + static patchWithClonedTree(container, clonedTree, liveSocket2) { + let activeElement = liveSocket2.getActiveElement(); + let phxUpdate = liveSocket2.binding(PHX_UPDATE); + morphdom_esm_default(container, clonedTree, { + childrenOnly: false, + onBeforeElUpdated: (fromEl, toEl) => { + dom_default.syncPendingAttrs(fromEl, toEl); + if (!container.isSameNode(fromEl) && fromEl.hasAttribute(PHX_REF_LOCK)) { + return false; + } + if (dom_default.isIgnored(fromEl, phxUpdate)) { + return false; + } + if (activeElement && activeElement.isSameNode(fromEl) && dom_default.isFormInput(fromEl)) { + dom_default.mergeFocusedInput(fromEl, toEl); + return false; + } + } + }); + } + constructor(view, container, id, html, streams, targetCID) { + this.view = view; + this.liveSocket = view.liveSocket; + this.container = container; + this.id = id; + this.rootID = view.root.id; + this.html = html; + this.streams = streams; + this.streamInserts = {}; + this.streamComponentRestore = {}; + this.targetCID = targetCID; + this.cidPatch = isCid(this.targetCID); + this.pendingRemoves = []; + this.phxRemove = this.liveSocket.binding("remove"); + this.targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container; + this.callbacks = { + beforeadded: [], + beforeupdated: [], + beforephxChildAdded: [], + afteradded: [], + afterupdated: [], + afterdiscarded: [], + afterphxChildAdded: [], + aftertransitionsDiscarded: [] + }; + } + before(kind, callback) { + this.callbacks[`before${kind}`].push(callback); + } + after(kind, callback) { + this.callbacks[`after${kind}`].push(callback); + } + trackBefore(kind, ...args) { + this.callbacks[`before${kind}`].forEach((callback) => callback(...args)); + } + trackAfter(kind, ...args) { + this.callbacks[`after${kind}`].forEach((callback) => callback(...args)); + } + markPrunableContentForRemoval() { + let phxUpdate = this.liveSocket.binding(PHX_UPDATE); + dom_default.all(this.container, `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`, (el) => { + el.setAttribute(PHX_PRUNE, ""); + }); + } + perform(isJoinPatch) { + let { view, liveSocket: liveSocket2, html, container, targetContainer } = this; + if (this.isCIDPatch() && !targetContainer) { + return; + } + let focused = liveSocket2.getActiveElement(); + let { selectionStart, selectionEnd } = focused && dom_default.hasSelectionRange(focused) ? focused : {}; + let phxUpdate = liveSocket2.binding(PHX_UPDATE); + let phxViewportTop = liveSocket2.binding(PHX_VIEWPORT_TOP); + let phxViewportBottom = liveSocket2.binding(PHX_VIEWPORT_BOTTOM); + let phxTriggerExternal = liveSocket2.binding(PHX_TRIGGER_ACTION); + let added = []; + let updates = []; + let appendPrependUpdates = []; + let externalFormTriggered = null; + function morph(targetContainer2, source, withChildren = false) { + let morphCallbacks = { + // normally, we are running with childrenOnly, as the patch HTML for a LV + // does not include the LV attrs (data-phx-session, etc.) + // when we are patching a live component, we do want to patch the root element as well; + // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded) + childrenOnly: targetContainer2.getAttribute(PHX_COMPONENT) === null && !withChildren, + getNodeKey: (node) => { + if (dom_default.isPhxDestroyed(node)) { + return null; + } + if (isJoinPatch) { + return node.id; + } + return node.id || node.getAttribute && node.getAttribute(PHX_MAGIC_ID); + }, + // skip indexing from children when container is stream + skipFromChildren: (from) => { + return from.getAttribute(phxUpdate) === PHX_STREAM; + }, + // tell morphdom how to add a child + addChild: (parent, child) => { + let { ref, streamAt } = this.getStreamInsert(child); + if (ref === void 0) { + return parent.appendChild(child); + } + this.setStreamRef(child, ref); + if (streamAt === 0) { + parent.insertAdjacentElement("afterbegin", child); + } else if (streamAt === -1) { + let lastChild = parent.lastElementChild; + if (lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)) { + let nonStreamChild = Array.from(parent.children).find((c) => !c.hasAttribute(PHX_STREAM_REF)); + parent.insertBefore(child, nonStreamChild); + } else { + parent.appendChild(child); + } + } else if (streamAt > 0) { + let sibling = Array.from(parent.children)[streamAt]; + parent.insertBefore(child, sibling); + } + }, + onBeforeNodeAdded: (el) => { + dom_default.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom); + this.trackBefore("added", el); + let morphedEl = el; + if (this.streamComponentRestore[el.id]) { + morphedEl = this.streamComponentRestore[el.id]; + delete this.streamComponentRestore[el.id]; + morph.call(this, morphedEl, el, true); + } + return morphedEl; + }, + onNodeAdded: (el) => { + if (el.getAttribute) { + this.maybeReOrderStream(el, true); + } + if (el instanceof HTMLImageElement && el.srcset) { + el.srcset = el.srcset; + } else if (el instanceof HTMLVideoElement && el.autoplay) { + el.play(); + } + if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) { + externalFormTriggered = el; + } + if (dom_default.isPhxChild(el) && view.ownsElement(el) || dom_default.isPhxSticky(el) && view.ownsElement(el.parentNode)) { + this.trackAfter("phxChildAdded", el); + } + added.push(el); + }, + onNodeDiscarded: (el) => this.onNodeDiscarded(el), + onBeforeNodeDiscarded: (el) => { + if (el.getAttribute && el.getAttribute(PHX_PRUNE) !== null) { + return true; + } + if (el.parentElement !== null && el.id && dom_default.isPhxUpdate(el.parentElement, phxUpdate, [PHX_STREAM, "append", "prepend"])) { + return false; + } + if (this.maybePendingRemove(el)) { + return false; + } + if (this.skipCIDSibling(el)) { + return false; + } + return true; + }, + onElUpdated: (el) => { + if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) { + externalFormTriggered = el; + } + updates.push(el); + this.maybeReOrderStream(el, false); + }, + onBeforeElUpdated: (fromEl, toEl) => { + if (fromEl.id && fromEl.isSameNode(targetContainer2) && fromEl.id !== toEl.id) { + morphCallbacks.onNodeDiscarded(fromEl); + fromEl.replaceWith(toEl); + return morphCallbacks.onNodeAdded(toEl); + } + dom_default.syncPendingAttrs(fromEl, toEl); + dom_default.maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom); + dom_default.cleanChildNodes(toEl, phxUpdate); + if (this.skipCIDSibling(toEl)) { + this.maybeReOrderStream(fromEl); + return false; + } + if (dom_default.isPhxSticky(fromEl)) { + [PHX_SESSION, PHX_STATIC, PHX_ROOT_ID].map((attr) => [attr, fromEl.getAttribute(attr), toEl.getAttribute(attr)]).forEach(([attr, fromVal, toVal]) => { + if (toVal && fromVal !== toVal) { + fromEl.setAttribute(attr, toVal); + } + }); + return false; + } + if (dom_default.isIgnored(fromEl, phxUpdate) || fromEl.form && fromEl.form.isSameNode(externalFormTriggered)) { + this.trackBefore("updated", fromEl, toEl); + dom_default.mergeAttrs(fromEl, toEl, { isIgnored: dom_default.isIgnored(fromEl, phxUpdate) }); + updates.push(fromEl); + dom_default.applyStickyOperations(fromEl); + return false; + } + if (fromEl.type === "number" && (fromEl.validity && fromEl.validity.badInput)) { + return false; + } + let isFocusedFormEl = focused && fromEl.isSameNode(focused) && dom_default.isFormInput(fromEl); + let focusedSelectChanged = isFocusedFormEl && this.isChangedSelect(fromEl, toEl); + if (fromEl.hasAttribute(PHX_REF_SRC)) { + if (dom_default.isUploadInput(fromEl)) { + dom_default.mergeAttrs(fromEl, toEl, { isIgnored: true }); + this.trackBefore("updated", fromEl, toEl); + updates.push(fromEl); + } + dom_default.applyStickyOperations(fromEl); + let isLocked = fromEl.hasAttribute(PHX_REF_LOCK); + let clone2 = isLocked ? dom_default.private(fromEl, PHX_REF_LOCK) || fromEl.cloneNode(true) : null; + if (clone2) { + dom_default.putPrivate(fromEl, PHX_REF_LOCK, clone2); + if (!isFocusedFormEl) { + fromEl = clone2; + } + } + } + if (dom_default.isPhxChild(toEl)) { + let prevSession = fromEl.getAttribute(PHX_SESSION); + dom_default.mergeAttrs(fromEl, toEl, { exclude: [PHX_STATIC] }); + if (prevSession !== "") { + fromEl.setAttribute(PHX_SESSION, prevSession); + } + fromEl.setAttribute(PHX_ROOT_ID, this.rootID); + dom_default.applyStickyOperations(fromEl); + return false; + } + dom_default.copyPrivates(toEl, fromEl); + if (isFocusedFormEl && fromEl.type !== "hidden" && !focusedSelectChanged) { + this.trackBefore("updated", fromEl, toEl); + dom_default.mergeFocusedInput(fromEl, toEl); + dom_default.syncAttrsToProps(fromEl); + updates.push(fromEl); + dom_default.applyStickyOperations(fromEl); + return false; + } else { + if (focusedSelectChanged) { + fromEl.blur(); + } + if (dom_default.isPhxUpdate(toEl, phxUpdate, ["append", "prepend"])) { + appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate))); + } + dom_default.syncAttrsToProps(toEl); + dom_default.applyStickyOperations(toEl); + this.trackBefore("updated", fromEl, toEl); + return fromEl; + } + } + }; + morphdom_esm_default(targetContainer2, source, morphCallbacks); + } + this.trackBefore("added", container); + this.trackBefore("updated", container, container); + liveSocket2.time("morphdom", () => { + this.streams.forEach(([ref, inserts, deleteIds, reset]) => { + inserts.forEach(([key, streamAt, limit]) => { + this.streamInserts[key] = { ref, streamAt, limit, reset }; + }); + if (reset !== void 0) { + dom_default.all(container, `[${PHX_STREAM_REF}="${ref}"]`, (child) => { + this.removeStreamChildElement(child); + }); + } + deleteIds.forEach((id) => { + let child = container.querySelector(`[id="${id}"]`); + if (child) { + this.removeStreamChildElement(child); + } + }); + }); + if (isJoinPatch) { + dom_default.all(this.container, `[${phxUpdate}=${PHX_STREAM}]`, (el) => { + this.liveSocket.owner(el, (view2) => { + if (view2 === this.view) { + Array.from(el.children).forEach((child) => { + this.removeStreamChildElement(child); + }); + } + }); + }); + } + morph.call(this, targetContainer, html); + }); + if (liveSocket2.isDebugEnabled()) { + detectDuplicateIds(); + Array.from(document.querySelectorAll("input[name=id]")).forEach((node) => { + if (node.form) { + console.error('Detected an input with name="id" inside a form! This will cause problems when patching the DOM.\n', node); + } + }); + } + if (appendPrependUpdates.length > 0) { + liveSocket2.time("post-morph append/prepend restoration", () => { + appendPrependUpdates.forEach((update) => update.perform()); + }); + } + liveSocket2.silenceEvents(() => dom_default.restoreFocus(focused, selectionStart, selectionEnd)); + dom_default.dispatchEvent(document, "phx:update"); + added.forEach((el) => this.trackAfter("added", el)); + updates.forEach((el) => this.trackAfter("updated", el)); + this.transitionPendingRemoves(); + if (externalFormTriggered) { + liveSocket2.unload(); + Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered); + } + return true; + } + onNodeDiscarded(el) { + if (dom_default.isPhxChild(el) || dom_default.isPhxSticky(el)) { + this.liveSocket.destroyViewByEl(el); + } + this.trackAfter("discarded", el); + } + maybePendingRemove(node) { + if (node.getAttribute && node.getAttribute(this.phxRemove) !== null) { + this.pendingRemoves.push(node); + return true; + } else { + return false; + } + } + removeStreamChildElement(child) { + if (this.streamInserts[child.id]) { + this.streamComponentRestore[child.id] = child; + child.remove(); + } else { + if (!this.maybePendingRemove(child)) { + child.remove(); + this.onNodeDiscarded(child); + } + } + } + getStreamInsert(el) { + let insert = el.id ? this.streamInserts[el.id] : {}; + return insert || {}; + } + setStreamRef(el, ref) { + dom_default.putSticky(el, PHX_STREAM_REF, (el2) => el2.setAttribute(PHX_STREAM_REF, ref)); + } + maybeReOrderStream(el, isNew) { + let { ref, streamAt, reset } = this.getStreamInsert(el); + if (streamAt === void 0) { + return; + } + this.setStreamRef(el, ref); + if (!reset && !isNew) { + return; + } + if (!el.parentElement) { + return; + } + if (streamAt === 0) { + el.parentElement.insertBefore(el, el.parentElement.firstElementChild); + } else if (streamAt > 0) { + let children = Array.from(el.parentElement.children); + let oldIndex = children.indexOf(el); + if (streamAt >= children.length - 1) { + el.parentElement.appendChild(el); + } else { + let sibling = children[streamAt]; + if (oldIndex > streamAt) { + el.parentElement.insertBefore(el, sibling); + } else { + el.parentElement.insertBefore(el, sibling.nextElementSibling); + } + } + } + this.maybeLimitStream(el); + } + maybeLimitStream(el) { + let { limit } = this.getStreamInsert(el); + let children = limit !== null && Array.from(el.parentElement.children); + if (limit && limit < 0 && children.length > limit * -1) { + children.slice(0, children.length + limit).forEach((child) => this.removeStreamChildElement(child)); + } else if (limit && limit >= 0 && children.length > limit) { + children.slice(limit).forEach((child) => this.removeStreamChildElement(child)); + } + } + transitionPendingRemoves() { + let { pendingRemoves, liveSocket: liveSocket2 } = this; + if (pendingRemoves.length > 0) { + liveSocket2.transitionRemoves(pendingRemoves, false, () => { + pendingRemoves.forEach((el) => { + let child = dom_default.firstPhxChild(el); + if (child) { + liveSocket2.destroyViewByEl(child); + } + el.remove(); + }); + this.trackAfter("transitionsDiscarded", pendingRemoves); + }); + } + } + isChangedSelect(fromEl, toEl) { + if (!(fromEl instanceof HTMLSelectElement) || fromEl.multiple) { + return false; + } + if (fromEl.options.length !== toEl.options.length) { + return true; + } + toEl.value = fromEl.value; + return !fromEl.isEqualNode(toEl); + } + isCIDPatch() { + return this.cidPatch; + } + skipCIDSibling(el) { + return el.nodeType === Node.ELEMENT_NODE && el.hasAttribute(PHX_SKIP); + } + targetCIDContainer(html) { + if (!this.isCIDPatch()) { + return; + } + let [first, ...rest] = dom_default.findComponentNodeList(this.container, this.targetCID); + if (rest.length === 0 && dom_default.childNodeLength(html) === 1) { + return first; + } else { + return first && first.parentNode; + } + } + indexOf(parent, child) { + return Array.from(parent.children).indexOf(child); + } + }; + var VOID_TAGS = /* @__PURE__ */ new Set([ + "area", + "base", + "br", + "col", + "command", + "embed", + "hr", + "img", + "input", + "keygen", + "link", + "meta", + "param", + "source", + "track", + "wbr" + ]); + var quoteChars = /* @__PURE__ */ new Set(["'", '"']); + var modifyRoot = (html, attrs, clearInnerHTML) => { + let i = 0; + let insideComment = false; + let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML; + let lookahead = html.match(/^(\s*(?:\s*)*)<([^\s\/>]+)/); + if (lookahead === null) { + throw new Error(`malformed html ${html}`); + } + i = lookahead[0].length; + beforeTag = lookahead[1]; + tag = lookahead[2]; + tagNameEndsAt = i; + for (i; i < html.length; i++) { + if (html.charAt(i) === ">") { + break; + } + if (html.charAt(i) === "=") { + let isId = html.slice(i - 3, i) === " id"; + i++; + let char = html.charAt(i); + if (quoteChars.has(char)) { + let attrStartsAt = i; + i++; + for (i; i < html.length; i++) { + if (html.charAt(i) === char) { + break; + } + } + if (isId) { + id = html.slice(attrStartsAt + 1, i); + break; + } + } + } + } + let closeAt = html.length - 1; + insideComment = false; + while (closeAt >= beforeTag.length + tag.length) { + let char = html.charAt(closeAt); + if (insideComment) { + if (char === "-" && html.slice(closeAt - 3, closeAt) === "" && html.slice(closeAt - 2, closeAt) === "--") { + insideComment = true; + closeAt -= 3; + } else if (char === ">") { + break; + } else { + closeAt -= 1; + } + } + afterTag = html.slice(closeAt + 1, html.length); + let attrsStr = Object.keys(attrs).map((attr) => attrs[attr] === true ? attr : `${attr}="${attrs[attr]}"`).join(" "); + if (clearInnerHTML) { + let idAttrStr = id ? ` id="${id}"` : ""; + if (VOID_TAGS.has(tag)) { + newHTML = `<${tag}${idAttrStr}${attrsStr === "" ? "" : " "}${attrsStr}/>`; + } else { + newHTML = `<${tag}${idAttrStr}${attrsStr === "" ? "" : " "}${attrsStr}>`; + } + } else { + let rest = html.slice(tagNameEndsAt, closeAt + 1); + newHTML = `<${tag}${attrsStr === "" ? "" : " "}${attrsStr}${rest}`; + } + return [newHTML, beforeTag, afterTag]; + }; + var Rendered = class { + static extract(diff) { + let { [REPLY]: reply, [EVENTS]: events, [TITLE]: title } = diff; + delete diff[REPLY]; + delete diff[EVENTS]; + delete diff[TITLE]; + return { diff, title, reply: reply || null, events: events || [] }; + } + constructor(viewId, rendered) { + this.viewId = viewId; + this.rendered = {}; + this.magicId = 0; + this.mergeDiff(rendered); + } + parentViewId() { + return this.viewId; + } + toString(onlyCids) { + let [str, streams] = this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids, true, {}); + return [str, streams]; + } + recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids, changeTracking, rootAttrs) { + onlyCids = onlyCids ? new Set(onlyCids) : null; + let output = { buffer: "", components, onlyCids, streams: /* @__PURE__ */ new Set() }; + this.toOutputBuffer(rendered, null, output, changeTracking, rootAttrs); + return [output.buffer, output.streams]; + } + componentCIDs(diff) { + return Object.keys(diff[COMPONENTS] || {}).map((i) => parseInt(i)); + } + isComponentOnlyDiff(diff) { + if (!diff[COMPONENTS]) { + return false; + } + return Object.keys(diff).length === 1; + } + getComponent(diff, cid) { + return diff[COMPONENTS][cid]; + } + resetRender(cid) { + if (this.rendered[COMPONENTS][cid]) { + this.rendered[COMPONENTS][cid].reset = true; + } + } + mergeDiff(diff) { + let newc = diff[COMPONENTS]; + let cache = {}; + delete diff[COMPONENTS]; + this.rendered = this.mutableMerge(this.rendered, diff); + this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {}; + if (newc) { + let oldc = this.rendered[COMPONENTS]; + for (let cid in newc) { + newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache); + } + for (let cid in newc) { + oldc[cid] = newc[cid]; + } + diff[COMPONENTS] = newc; + } + } + cachedFindComponent(cid, cdiff, oldc, newc, cache) { + if (cache[cid]) { + return cache[cid]; + } else { + let ndiff, stat, scid = cdiff[STATIC]; + if (isCid(scid)) { + let tdiff; + if (scid > 0) { + tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache); + } else { + tdiff = oldc[-scid]; + } + stat = tdiff[STATIC]; + ndiff = this.cloneMerge(tdiff, cdiff, true); + ndiff[STATIC] = stat; + } else { + ndiff = cdiff[STATIC] !== void 0 || oldc[cid] === void 0 ? cdiff : this.cloneMerge(oldc[cid], cdiff, false); + } + cache[cid] = ndiff; + return ndiff; + } + } + mutableMerge(target, source) { + if (source[STATIC] !== void 0) { + return source; + } else { + this.doMutableMerge(target, source); + return target; + } + } + doMutableMerge(target, source) { + for (let key in source) { + let val = source[key]; + let targetVal = target[key]; + let isObjVal = isObject(val); + if (isObjVal && val[STATIC] === void 0 && isObject(targetVal)) { + this.doMutableMerge(targetVal, val); + } else { + target[key] = val; + } + } + if (target[ROOT]) { + target.newRender = true; + } + } + // Merges cid trees together, copying statics from source tree. + // + // The `pruneMagicId` is passed to control pruning the magicId of the + // target. We must always prune the magicId when we are sharing statics + // from another component. If not pruning, we replicate the logic from + // mutableMerge, where we set newRender to true if there is a root + // (effectively forcing the new version to be rendered instead of skipped) + // + cloneMerge(target, source, pruneMagicId) { + let merged = __spreadValues(__spreadValues({}, target), source); + for (let key in merged) { + let val = source[key]; + let targetVal = target[key]; + if (isObject(val) && val[STATIC] === void 0 && isObject(targetVal)) { + merged[key] = this.cloneMerge(targetVal, val, pruneMagicId); + } else if (val === void 0 && isObject(targetVal)) { + merged[key] = this.cloneMerge(targetVal, {}, pruneMagicId); + } + } + if (pruneMagicId) { + delete merged.magicId; + delete merged.newRender; + } else if (target[ROOT]) { + merged.newRender = true; + } + return merged; + } + componentToString(cid) { + let [str, streams] = this.recursiveCIDToString(this.rendered[COMPONENTS], cid, null); + let [strippedHTML, _before, _after] = modifyRoot(str, {}); + return [strippedHTML, streams]; + } + pruneCIDs(cids) { + cids.forEach((cid) => delete this.rendered[COMPONENTS][cid]); + } + // private + get() { + return this.rendered; + } + isNewFingerprint(diff = {}) { + return !!diff[STATIC]; + } + templateStatic(part, templates) { + if (typeof part === "number") { + return templates[part]; + } else { + return part; + } + } + nextMagicID() { + this.magicId++; + return `m${this.magicId}-${this.parentViewId()}`; + } + // Converts rendered tree to output buffer. + // + // changeTracking controls if we can apply the PHX_SKIP optimization. + // It is disabled for comprehensions since we must re-render the entire collection + // and no individual element is tracked inside the comprehension. + toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}) { + if (rendered[DYNAMICS]) { + return this.comprehensionToBuffer(rendered, templates, output); + } + let { [STATIC]: statics } = rendered; + statics = this.templateStatic(statics, templates); + let isRoot = rendered[ROOT]; + let prevBuffer = output.buffer; + if (isRoot) { + output.buffer = ""; + } + if (changeTracking && isRoot && !rendered.magicId) { + rendered.newRender = true; + rendered.magicId = this.nextMagicID(); + } + output.buffer += statics[0]; + for (let i = 1; i < statics.length; i++) { + this.dynamicToBuffer(rendered[i - 1], templates, output, changeTracking); + output.buffer += statics[i]; + } + if (isRoot) { + let skip = false; + let attrs; + if (changeTracking || rendered.magicId) { + skip = changeTracking && !rendered.newRender; + attrs = __spreadValues({ [PHX_MAGIC_ID]: rendered.magicId }, rootAttrs); + } else { + attrs = rootAttrs; + } + if (skip) { + attrs[PHX_SKIP] = true; + } + let [newRoot, commentBefore, commentAfter] = modifyRoot(output.buffer, attrs, skip); + rendered.newRender = false; + output.buffer = prevBuffer + commentBefore + newRoot + commentAfter; + } + } + comprehensionToBuffer(rendered, templates, output) { + let { [DYNAMICS]: dynamics, [STATIC]: statics, [STREAM]: stream } = rendered; + let [_ref, _inserts, deleteIds, reset] = stream || [null, {}, [], null]; + statics = this.templateStatic(statics, templates); + let compTemplates = templates || rendered[TEMPLATES]; + for (let d = 0; d < dynamics.length; d++) { + let dynamic = dynamics[d]; + output.buffer += statics[0]; + for (let i = 1; i < statics.length; i++) { + let changeTracking = false; + this.dynamicToBuffer(dynamic[i - 1], compTemplates, output, changeTracking); + output.buffer += statics[i]; + } + } + if (stream !== void 0 && (rendered[DYNAMICS].length > 0 || deleteIds.length > 0 || reset)) { + delete rendered[STREAM]; + rendered[DYNAMICS] = []; + output.streams.add(stream); + } + } + dynamicToBuffer(rendered, templates, output, changeTracking) { + if (typeof rendered === "number") { + let [str, streams] = this.recursiveCIDToString(output.components, rendered, output.onlyCids); + output.buffer += str; + output.streams = /* @__PURE__ */ new Set([...output.streams, ...streams]); + } else if (isObject(rendered)) { + this.toOutputBuffer(rendered, templates, output, changeTracking, {}); + } else { + output.buffer += rendered; + } + } + recursiveCIDToString(components, cid, onlyCids) { + let component = components[cid] || logError(`no component for CID ${cid}`, components); + let attrs = { [PHX_COMPONENT]: cid }; + let skip = onlyCids && !onlyCids.has(cid); + component.newRender = !skip; + component.magicId = `c${cid}-${this.parentViewId()}`; + let changeTracking = !component.reset; + let [html, streams] = this.recursiveToString(component, components, onlyCids, changeTracking, attrs); + delete component.reset; + return [html, streams]; + } + }; + var HOOK_ID = "hookId"; + var viewHookID = 1; + var ViewHook = class { + static makeID() { + return viewHookID++; + } + static elementID(el) { + return dom_default.private(el, HOOK_ID); + } + constructor(view, el, callbacks) { + this.el = el; + this.__attachView(view); + this.__callbacks = callbacks; + this.__listeners = /* @__PURE__ */ new Set(); + this.__isDisconnected = false; + dom_default.putPrivate(this.el, HOOK_ID, this.constructor.makeID()); + for (let key in this.__callbacks) { + this[key] = this.__callbacks[key]; + } + } + __attachView(view) { + if (view) { + this.__view = () => view; + this.liveSocket = view.liveSocket; + } else { + this.__view = () => { + throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`); + }; + this.liveSocket = null; + } + } + __mounted() { + this.mounted && this.mounted(); + } + __updated() { + this.updated && this.updated(); + } + __beforeUpdate() { + this.beforeUpdate && this.beforeUpdate(); + } + __destroyed() { + this.destroyed && this.destroyed(); + } + __reconnected() { + if (this.__isDisconnected) { + this.__isDisconnected = false; + this.reconnected && this.reconnected(); + } + } + __disconnected() { + this.__isDisconnected = true; + this.disconnected && this.disconnected(); + } + /** + * Binds the hook to JS commands. + * + * @param {ViewHook} hook - The ViewHook instance to bind. + * + * @returns {Object} An object with methods to manipulate the DOM and execute JavaScript. + */ + js() { + let hook = this; + return { + /** + * Executes encoded JavaScript in the context of the hook element. + * + * @param {string} encodedJS - The encoded JavaScript string to execute. + */ + exec(encodedJS) { + hook.__view().liveSocket.execJS(hook.el, encodedJS, "hook"); + }, + /** + * Shows an element. + * + * @param {HTMLElement} el - The element to show. + * @param {Object} [opts={}] - Optional settings. + * @param {string} [opts.display] - The CSS display value to set. Defaults "block". + * @param {string} [opts.transition] - The CSS transition classes to set when showing. + * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200. + * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition. + * Defaults `true`. + */ + show(el, opts = {}) { + let owner = hook.__view().liveSocket.owner(el); + js_default.show("hook", owner, el, opts.display, opts.transition, opts.time, opts.blocking); + }, + /** + * Hides an element. + * + * @param {HTMLElement} el - The element to hide. + * @param {Object} [opts={}] - Optional settings. + * @param {string} [opts.transition] - The CSS transition classes to set when hiding. + * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200. + * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition. + * Defaults `true`. + */ + hide(el, opts = {}) { + let owner = hook.__view().liveSocket.owner(el); + js_default.hide("hook", owner, el, null, opts.transition, opts.time, opts.blocking); + }, + /** + * Toggles the visibility of an element. + * + * @param {HTMLElement} el - The element to toggle. + * @param {Object} [opts={}] - Optional settings. + * @param {string} [opts.display] - The CSS display value to set. Defaults "block". + * @param {string} [opts.in] - The CSS transition classes for showing. + * Accepts either the string of classes to apply when toggling in, or + * a 3-tuple containing the transition class, the class to apply + * to start the transition, and the ending transition class, such as: + * + * ["ease-out duration-300", "opacity-0", "opacity-100"] + * + * @param {string} [opts.out] - The CSS transition classes for hiding. + * Accepts either string of classes to apply when toggling out, or + * a 3-tuple containing the transition class, the class to apply + * to start the transition, and the ending transition class, such as: + * + * ["ease-out duration-300", "opacity-100", "opacity-0"] + * + * @param {number} [opts.time] - The transition duration in milliseconds. + * + * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition. + * Defaults `true`. + */ + toggle(el, opts = {}) { + let owner = hook.__view().liveSocket.owner(el); + opts.in = js_default.transitionClasses(opts.in); + opts.out = js_default.transitionClasses(opts.out); + js_default.toggle("hook", owner, el, opts.display, opts.in, opts.out, opts.time, opts.blocking); + }, + /** + * Adds CSS classes to an element. + * + * @param {HTMLElement} el - The element to add classes to. + * @param {string|string[]} names - The class name(s) to add. + * @param {Object} [opts={}] - Optional settings. + * @param {string} [opts.transition] - The CSS transition property to set. + * Accepts a string of classes to apply when adding classes or + * a 3-tuple containing the transition class, the class to apply + * to start the transition, and the ending transition class, such as: + * + * ["ease-out duration-300", "opacity-0", "opacity-100"] + * + * @param {number} [opts.time] - The transition duration in milliseconds. + * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition. + * Defaults `true`. + */ + addClass(el, names, opts = {}) { + names = Array.isArray(names) ? names : names.split(" "); + let owner = hook.__view().liveSocket.owner(el); + js_default.addOrRemoveClasses(el, names, [], opts.transition, opts.time, owner, opts.blocking); + }, + /** + * Removes CSS classes from an element. + * + * @param {HTMLElement} el - The element to remove classes from. + * @param {string|string[]} names - The class name(s) to remove. + * @param {Object} [opts={}] - Optional settings. + * @param {string} [opts.transition] - The CSS transition classes to set. + * Accepts a string of classes to apply when removing classes or + * a 3-tuple containing the transition class, the class to apply + * to start the transition, and the ending transition class, such as: + * + * ["ease-out duration-300", "opacity-100", "opacity-0"] + * + * @param {number} [opts.time] - The transition duration in milliseconds. + * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition. + * Defaults `true`. + */ + removeClass(el, names, opts = {}) { + opts.transition = js_default.transitionClasses(opts.transition); + names = Array.isArray(names) ? names : names.split(" "); + let owner = hook.__view().liveSocket.owner(el); + js_default.addOrRemoveClasses(el, [], names, opts.transition, opts.time, owner, opts.blocking); + }, + /** + * Toggles CSS classes on an element. + * + * @param {HTMLElement} el - The element to toggle classes on. + * @param {string|string[]} names - The class name(s) to toggle. + * @param {Object} [opts={}] - Optional settings. + * @param {string} [opts.transition] - The CSS transition classes to set. + * Accepts a string of classes to apply when toggling classes or + * a 3-tuple containing the transition class, the class to apply + * to start the transition, and the ending transition class, such as: + * + * ["ease-out duration-300", "opacity-100", "opacity-0"] + * + * @param {number} [opts.time] - The transition duration in milliseconds. + * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition. + * Defaults `true`. + */ + toggleClass(el, names, opts = {}) { + opts.transition = js_default.transitionClasses(opts.transition); + names = Array.isArray(names) ? names : names.split(" "); + let owner = hook.__view().liveSocket.owner(el); + js_default.toggleClasses(el, names, opts.transition, opts.time, owner, opts.blocking); + }, + /** + * Applies a CSS transition to an element. + * + * @param {HTMLElement} el - The element to apply the transition to. + * @param {string|string[]} transition - The transition class(es) to apply. + * Accepts a string of classes to apply when transitioning or + * a 3-tuple containing the transition class, the class to apply + * to start the transition, and the ending transition class, such as: + * + * ["ease-out duration-300", "opacity-100", "opacity-0"] + * + * @param {Object} [opts={}] - Optional settings. + * @param {number} [opts.time] - The transition duration in milliseconds. + * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition. + * Defaults `true`. + */ + transition(el, transition, opts = {}) { + let owner = hook.__view().liveSocket.owner(el); + js_default.addOrRemoveClasses(el, [], [], js_default.transitionClasses(transition), opts.time, owner, opts.blocking); + }, + /** + * Sets an attribute on an element. + * + * @param {HTMLElement} el - The element to set the attribute on. + * @param {string} attr - The attribute name to set. + * @param {string} val - The value to set for the attribute. + */ + setAttribute(el, attr, val) { + js_default.setOrRemoveAttrs(el, [[attr, val]], []); + }, + /** + * Removes an attribute from an element. + * + * @param {HTMLElement} el - The element to remove the attribute from. + * @param {string} attr - The attribute name to remove. + */ + removeAttribute(el, attr) { + js_default.setOrRemoveAttrs(el, [], [attr]); + }, + /** + * Toggles an attribute on an element between two values. + * + * @param {HTMLElement} el - The element to toggle the attribute on. + * @param {string} attr - The attribute name to toggle. + * @param {string} val1 - The first value to toggle between. + * @param {string} val2 - The second value to toggle between. + */ + toggleAttribute(el, attr, val1, val2) { + js_default.toggleAttr(el, attr, val1, val2); + } + }; + } + pushEvent(event, payload = {}, onReply = function() { + }) { + return this.__view().pushHookEvent(this.el, null, event, payload, onReply); + } + pushEventTo(phxTarget, event, payload = {}, onReply = function() { + }) { + return this.__view().withinTargets(phxTarget, (view, targetCtx) => { + return view.pushHookEvent(this.el, targetCtx, event, payload, onReply); + }); + } + handleEvent(event, callback) { + let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail); + window.addEventListener(`phx:${event}`, callbackRef); + this.__listeners.add(callbackRef); + return callbackRef; + } + removeHandleEvent(callbackRef) { + let event = callbackRef(null, true); + window.removeEventListener(`phx:${event}`, callbackRef); + this.__listeners.delete(callbackRef); + } + upload(name, files) { + return this.__view().dispatchUploads(null, name, files); + } + uploadTo(phxTarget, name, files) { + return this.__view().withinTargets(phxTarget, (view, targetCtx) => { + view.dispatchUploads(targetCtx, name, files); + }); + } + __cleanup__() { + this.__listeners.forEach((callbackRef) => this.removeHandleEvent(callbackRef)); + } + }; + var prependFormDataKey = (key, prefix) => { + let isArray = key.endsWith("[]"); + let baseKey = isArray ? key.slice(0, -2) : key; + baseKey = baseKey.replace(/([^\[\]]+)(\]?$)/, `${prefix}$1$2`); + if (isArray) { + baseKey += "[]"; + } + return baseKey; + }; + var serializeForm = (form, metadata, onlyNames = []) => { + const _a = metadata, { submitter } = _a, meta = __objRest(_a, ["submitter"]); + let injectedElement; + if (submitter && submitter.name) { + const input = document.createElement("input"); + input.type = "hidden"; + const formId = submitter.getAttribute("form"); + if (formId) { + input.setAttribute("form", formId); + } + input.name = submitter.name; + input.value = submitter.value; + submitter.parentElement.insertBefore(input, submitter); + injectedElement = input; + } + const formData = new FormData(form); + const toRemove = []; + formData.forEach((val, key, _index) => { + if (val instanceof File) { + toRemove.push(key); + } + }); + toRemove.forEach((key) => formData.delete(key)); + const params = new URLSearchParams(); + let elements = Array.from(form.elements); + for (let [key, val] of formData.entries()) { + if (onlyNames.length === 0 || onlyNames.indexOf(key) >= 0) { + let inputs = elements.filter((input) => input.name === key); + let isUnused = !inputs.some((input) => dom_default.private(input, PHX_HAS_FOCUSED) || dom_default.private(input, PHX_HAS_SUBMITTED)); + let hidden = inputs.every((input) => input.type === "hidden"); + if (isUnused && !(submitter && submitter.name == key) && !hidden) { + params.append(prependFormDataKey(key, "_unused_"), ""); + } + params.append(key, val); + } + } + if (submitter && injectedElement) { + submitter.parentElement.removeChild(injectedElement); + } + for (let metaKey in meta) { + params.append(metaKey, meta[metaKey]); + } + return params.toString(); + }; + var View = class _View { + static closestView(el) { + let liveViewEl = el.closest(PHX_VIEW_SELECTOR); + return liveViewEl ? dom_default.private(liveViewEl, "view") : null; + } + constructor(el, liveSocket2, parentView, flash, liveReferer) { + this.isDead = false; + this.liveSocket = liveSocket2; + this.flash = flash; + this.parent = parentView; + this.root = parentView ? parentView.root : this; + this.el = el; + dom_default.putPrivate(this.el, "view", this); + this.id = this.el.id; + this.ref = 0; + this.lastAckRef = null; + this.childJoins = 0; + this.loaderTimer = null; + this.pendingDiffs = []; + this.pendingForms = /* @__PURE__ */ new Set(); + this.redirect = false; + this.href = null; + this.joinCount = this.parent ? this.parent.joinCount - 1 : 0; + this.joinAttempts = 0; + this.joinPending = true; + this.destroyed = false; + this.joinCallback = function(onDone) { + onDone && onDone(); + }; + this.stopCallback = function() { + }; + this.pendingJoinOps = this.parent ? null : []; + this.viewHooks = {}; + this.formSubmits = []; + this.children = this.parent ? null : {}; + this.root.children[this.id] = {}; + this.formsForRecovery = {}; + this.channel = this.liveSocket.channel(`lv:${this.id}`, () => { + let url = this.href && this.expandURL(this.href); + return { + redirect: this.redirect ? url : void 0, + url: this.redirect ? void 0 : url || void 0, + params: this.connectParams(liveReferer), + session: this.getSession(), + static: this.getStatic(), + flash: this.flash + }; + }); + } + setHref(href) { + this.href = href; + } + setRedirect(href) { + this.redirect = true; + this.href = href; + } + isMain() { + return this.el.hasAttribute(PHX_MAIN); + } + connectParams(liveReferer) { + let params = this.liveSocket.params(this.el); + let manifest = dom_default.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`).map((node) => node.src || node.href).filter((url) => typeof url === "string"); + if (manifest.length > 0) { + params["_track_static"] = manifest; + } + params["_mounts"] = this.joinCount; + params["_mount_attempts"] = this.joinAttempts; + params["_live_referer"] = liveReferer; + this.joinAttempts++; + return params; + } + isConnected() { + return this.channel.canPush(); + } + getSession() { + return this.el.getAttribute(PHX_SESSION); + } + getStatic() { + let val = this.el.getAttribute(PHX_STATIC); + return val === "" ? null : val; + } + destroy(callback = function() { + }) { + this.destroyAllChildren(); + this.destroyed = true; + delete this.root.children[this.id]; + if (this.parent) { + delete this.root.children[this.parent.id][this.id]; + } + clearTimeout(this.loaderTimer); + let onFinished = () => { + callback(); + for (let id in this.viewHooks) { + this.destroyHook(this.viewHooks[id]); + } + }; + dom_default.markPhxChildDestroyed(this.el); + this.log("destroyed", () => ["the child has been removed from the parent"]); + this.channel.leave().receive("ok", onFinished).receive("error", onFinished).receive("timeout", onFinished); + } + setContainerClasses(...classes) { + this.el.classList.remove( + PHX_CONNECTED_CLASS, + PHX_LOADING_CLASS, + PHX_ERROR_CLASS, + PHX_CLIENT_ERROR_CLASS, + PHX_SERVER_ERROR_CLASS + ); + this.el.classList.add(...classes); + } + showLoader(timeout) { + clearTimeout(this.loaderTimer); + if (timeout) { + this.loaderTimer = setTimeout(() => this.showLoader(), timeout); + } else { + for (let id in this.viewHooks) { + this.viewHooks[id].__disconnected(); + } + this.setContainerClasses(PHX_LOADING_CLASS); + } + } + execAll(binding) { + dom_default.all(this.el, `[${binding}]`, (el) => this.liveSocket.execJS(el, el.getAttribute(binding))); + } + hideLoader() { + clearTimeout(this.loaderTimer); + this.setContainerClasses(PHX_CONNECTED_CLASS); + this.execAll(this.binding("connected")); + } + triggerReconnected() { + for (let id in this.viewHooks) { + this.viewHooks[id].__reconnected(); + } + } + log(kind, msgCallback) { + this.liveSocket.log(this, kind, msgCallback); + } + transition(time, onStart, onDone = function() { + }) { + this.liveSocket.transition(time, onStart, onDone); + } + // calls the callback with the view and target element for the given phxTarget + // targets can be: + // * an element itself, then it is simply passed to liveSocket.owner; + // * a CID (Component ID), then we first search the component's element in the DOM + // * a selector, then we search the selector in the DOM and call the callback + // for each element found with the corresponding owner view + withinTargets(phxTarget, callback, dom = document, viewEl) { + if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) { + return this.liveSocket.owner(phxTarget, (view) => callback(view, phxTarget)); + } + if (isCid(phxTarget)) { + let targets = dom_default.findComponentNodeList(viewEl || this.el, phxTarget); + if (targets.length === 0) { + logError(`no component found matching phx-target of ${phxTarget}`); + } else { + callback(this, parseInt(phxTarget)); + } + } else { + let targets = Array.from(dom.querySelectorAll(phxTarget)); + if (targets.length === 0) { + logError(`nothing found matching the phx-target selector "${phxTarget}"`); + } + targets.forEach((target) => this.liveSocket.owner(target, (view) => callback(view, target))); + } + } + applyDiff(type, rawDiff, callback) { + this.log(type, () => ["", clone(rawDiff)]); + let { diff, reply, events, title } = Rendered.extract(rawDiff); + callback({ diff, reply, events }); + if (typeof title === "string") { + window.requestAnimationFrame(() => dom_default.putTitle(title)); + } + } + onJoin(resp) { + let { rendered, container, liveview_version } = resp; + if (container) { + let [tag, attrs] = container; + this.el = dom_default.replaceRootContainer(this.el, tag, attrs); + } + this.childJoins = 0; + this.joinPending = true; + this.flash = null; + if (this.root === this) { + this.formsForRecovery = this.getFormsForRecovery(); + } + if (this.isMain()) { + this.liveSocket.replaceRootHistory(); + } + if (liveview_version !== this.liveSocket.version()) { + console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`); + } + browser_default.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS); + this.applyDiff("mount", rendered, ({ diff, events }) => { + this.rendered = new Rendered(this.id, diff); + let [html, streams] = this.renderContainer(null, "join"); + this.dropPendingRefs(); + this.joinCount++; + this.joinAttempts = 0; + this.maybeRecoverForms(html, () => { + this.onJoinComplete(resp, html, streams, events); + }); + }); + } + dropPendingRefs() { + dom_default.all(document, `[${PHX_REF_SRC}="${this.refSrc()}"]`, (el) => { + el.removeAttribute(PHX_REF_LOADING); + el.removeAttribute(PHX_REF_SRC); + el.removeAttribute(PHX_REF_LOCK); + }); + } + onJoinComplete({ live_patch }, html, streams, events) { + if (this.joinCount > 1 || this.parent && !this.parent.isJoinPending()) { + return this.applyJoinPatch(live_patch, html, streams, events); + } + let newChildren = dom_default.findPhxChildrenInFragment(html, this.id).filter((toEl) => { + let fromEl = toEl.id && this.el.querySelector(`[id="${toEl.id}"]`); + let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC); + if (phxStatic) { + toEl.setAttribute(PHX_STATIC, phxStatic); + } + if (fromEl) { + fromEl.setAttribute(PHX_ROOT_ID, this.root.id); + } + return this.joinChild(toEl); + }); + if (newChildren.length === 0) { + if (this.parent) { + this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)]); + this.parent.ackJoin(this); + } else { + this.onAllChildJoinsComplete(); + this.applyJoinPatch(live_patch, html, streams, events); + } + } else { + this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)]); + } + } + attachTrueDocEl() { + this.el = dom_default.byId(this.id); + this.el.setAttribute(PHX_ROOT_ID, this.root.id); + } + // this is invoked for dead and live views, so we must filter by + // by owner to ensure we aren't duplicating hooks across disconnect + // and connected states. This also handles cases where hooks exist + // in a root layout with a LV in the body + execNewMounted(parent = this.el) { + let phxViewportTop = this.binding(PHX_VIEWPORT_TOP); + let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM); + dom_default.all(parent, `[${phxViewportTop}], [${phxViewportBottom}]`, (hookEl) => { + if (this.ownsElement(hookEl)) { + dom_default.maintainPrivateHooks(hookEl, hookEl, phxViewportTop, phxViewportBottom); + this.maybeAddNewHook(hookEl); + } + }); + dom_default.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, (hookEl) => { + if (this.ownsElement(hookEl)) { + this.maybeAddNewHook(hookEl); + } + }); + dom_default.all(parent, `[${this.binding(PHX_MOUNTED)}]`, (el) => { + if (this.ownsElement(el)) { + this.maybeMounted(el); + } + }); + } + applyJoinPatch(live_patch, html, streams, events) { + this.attachTrueDocEl(); + let patch = new DOMPatch(this, this.el, this.id, html, streams, null); + patch.markPrunableContentForRemoval(); + this.performPatch(patch, false, true); + this.joinNewChildren(); + this.execNewMounted(); + this.joinPending = false; + this.liveSocket.dispatchEvents(events); + this.applyPendingUpdates(); + if (live_patch) { + let { kind, to } = live_patch; + this.liveSocket.historyPatch(to, kind); + } + this.hideLoader(); + if (this.joinCount > 1) { + this.triggerReconnected(); + } + this.stopCallback(); + } + triggerBeforeUpdateHook(fromEl, toEl) { + this.liveSocket.triggerDOM("onBeforeElUpdated", [fromEl, toEl]); + let hook = this.getHook(fromEl); + let isIgnored = hook && dom_default.isIgnored(fromEl, this.binding(PHX_UPDATE)); + if (hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))) { + hook.__beforeUpdate(); + return hook; + } + } + maybeMounted(el) { + let phxMounted = el.getAttribute(this.binding(PHX_MOUNTED)); + let hasBeenInvoked = phxMounted && dom_default.private(el, "mounted"); + if (phxMounted && !hasBeenInvoked) { + this.liveSocket.execJS(el, phxMounted); + dom_default.putPrivate(el, "mounted", true); + } + } + maybeAddNewHook(el) { + let newHook = this.addHook(el); + if (newHook) { + newHook.__mounted(); + } + } + performPatch(patch, pruneCids, isJoinPatch = false) { + let removedEls = []; + let phxChildrenAdded = false; + let updatedHookIds = /* @__PURE__ */ new Set(); + this.liveSocket.triggerDOM("onPatchStart", [patch.targetContainer]); + patch.after("added", (el) => { + this.liveSocket.triggerDOM("onNodeAdded", [el]); + let phxViewportTop = this.binding(PHX_VIEWPORT_TOP); + let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM); + dom_default.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom); + this.maybeAddNewHook(el); + if (el.getAttribute) { + this.maybeMounted(el); + } + }); + patch.after("phxChildAdded", (el) => { + if (dom_default.isPhxSticky(el)) { + this.liveSocket.joinRootViews(); + } else { + phxChildrenAdded = true; + } + }); + patch.before("updated", (fromEl, toEl) => { + let hook = this.triggerBeforeUpdateHook(fromEl, toEl); + if (hook) { + updatedHookIds.add(fromEl.id); + } + }); + patch.after("updated", (el) => { + if (updatedHookIds.has(el.id)) { + this.getHook(el).__updated(); + } + }); + patch.after("discarded", (el) => { + if (el.nodeType === Node.ELEMENT_NODE) { + removedEls.push(el); + } + }); + patch.after("transitionsDiscarded", (els) => this.afterElementsRemoved(els, pruneCids)); + patch.perform(isJoinPatch); + this.afterElementsRemoved(removedEls, pruneCids); + this.liveSocket.triggerDOM("onPatchEnd", [patch.targetContainer]); + return phxChildrenAdded; + } + afterElementsRemoved(elements, pruneCids) { + let destroyedCIDs = []; + elements.forEach((parent) => { + let components = dom_default.all(parent, `[${PHX_COMPONENT}]`); + let hooks = dom_default.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-hook]`); + components.concat(parent).forEach((el) => { + let cid = this.componentID(el); + if (isCid(cid) && destroyedCIDs.indexOf(cid) === -1) { + destroyedCIDs.push(cid); + } + }); + hooks.concat(parent).forEach((hookEl) => { + let hook = this.getHook(hookEl); + hook && this.destroyHook(hook); + }); + }); + if (pruneCids) { + this.maybePushComponentsDestroyed(destroyedCIDs); + } + } + joinNewChildren() { + dom_default.findPhxChildren(this.el, this.id).forEach((el) => this.joinChild(el)); + } + maybeRecoverForms(html, callback) { + const phxChange = this.binding("change"); + const oldForms = this.root.formsForRecovery; + let template = document.createElement("template"); + template.innerHTML = html; + const rootEl = template.content.firstElementChild; + rootEl.id = this.id; + rootEl.setAttribute(PHX_ROOT_ID, this.root.id); + rootEl.setAttribute(PHX_SESSION, this.getSession()); + rootEl.setAttribute(PHX_STATIC, this.getStatic()); + rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null); + const formsToRecover = ( + // we go over all forms in the new DOM; because this is only the HTML for the current + // view, we can be sure that all forms are owned by this view: + dom_default.all(template.content, "form").filter((newForm) => newForm.id && oldForms[newForm.id]).filter((newForm) => !this.pendingForms.has(newForm.id)).filter((newForm) => oldForms[newForm.id].getAttribute(phxChange) === newForm.getAttribute(phxChange)).map((newForm) => { + return [oldForms[newForm.id], newForm]; + }) + ); + if (formsToRecover.length === 0) { + return callback(); + } + formsToRecover.forEach(([oldForm, newForm], i) => { + this.pendingForms.add(newForm.id); + this.pushFormRecovery(oldForm, newForm, template.content.firstElementChild, () => { + this.pendingForms.delete(newForm.id); + if (i === formsToRecover.length - 1) { + callback(); + } + }); + }); + } + getChildById(id) { + return this.root.children[this.id][id]; + } + getDescendentByEl(el) { + var _a; + if (el.id === this.id) { + return this; + } else { + return (_a = this.children[el.getAttribute(PHX_PARENT_ID)]) == null ? void 0 : _a[el.id]; + } + } + destroyDescendent(id) { + for (let parentId in this.root.children) { + for (let childId in this.root.children[parentId]) { + if (childId === id) { + return this.root.children[parentId][childId].destroy(); + } + } + } + } + joinChild(el) { + let child = this.getChildById(el.id); + if (!child) { + let view = new _View(el, this.liveSocket, this); + this.root.children[this.id][view.id] = view; + view.join(); + this.childJoins++; + return true; + } + } + isJoinPending() { + return this.joinPending; + } + ackJoin(_child) { + this.childJoins--; + if (this.childJoins === 0) { + if (this.parent) { + this.parent.ackJoin(this); + } else { + this.onAllChildJoinsComplete(); + } + } + } + onAllChildJoinsComplete() { + this.pendingForms.clear(); + this.formsForRecovery = {}; + this.joinCallback(() => { + this.pendingJoinOps.forEach(([view, op]) => { + if (!view.isDestroyed()) { + op(); + } + }); + this.pendingJoinOps = []; + }); + } + update(diff, events) { + if (this.isJoinPending() || this.liveSocket.hasPendingLink() && this.root.isMain()) { + return this.pendingDiffs.push({ diff, events }); + } + this.rendered.mergeDiff(diff); + let phxChildrenAdded = false; + if (this.rendered.isComponentOnlyDiff(diff)) { + this.liveSocket.time("component patch complete", () => { + let parentCids = dom_default.findExistingParentCIDs(this.el, this.rendered.componentCIDs(diff)); + parentCids.forEach((parentCID) => { + if (this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)) { + phxChildrenAdded = true; + } + }); + }); + } else if (!isEmpty(diff)) { + this.liveSocket.time("full patch complete", () => { + let [html, streams] = this.renderContainer(diff, "update"); + let patch = new DOMPatch(this, this.el, this.id, html, streams, null); + phxChildrenAdded = this.performPatch(patch, true); + }); + } + this.liveSocket.dispatchEvents(events); + if (phxChildrenAdded) { + this.joinNewChildren(); + } + } + renderContainer(diff, kind) { + return this.liveSocket.time(`toString diff (${kind})`, () => { + let tag = this.el.tagName; + let cids = diff ? this.rendered.componentCIDs(diff) : null; + let [html, streams] = this.rendered.toString(cids); + return [`<${tag}>${html}`, streams]; + }); + } + componentPatch(diff, cid) { + if (isEmpty(diff)) + return false; + let [html, streams] = this.rendered.componentToString(cid); + let patch = new DOMPatch(this, this.el, this.id, html, streams, cid); + let childrenAdded = this.performPatch(patch, true); + return childrenAdded; + } + getHook(el) { + return this.viewHooks[ViewHook.elementID(el)]; + } + addHook(el) { + let hookElId = ViewHook.elementID(el); + if (hookElId && !this.viewHooks[hookElId]) { + let hook = dom_default.getCustomElHook(el) || logError(`no hook found for custom element: ${el.id}`); + this.viewHooks[hookElId] = hook; + hook.__attachView(this); + return hook; + } else if (hookElId || !el.getAttribute) { + return; + } else { + let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK)); + if (hookName && !this.ownsElement(el)) { + return; + } + let callbacks = this.liveSocket.getHookCallbacks(hookName); + if (callbacks) { + if (!el.id) { + logError(`no DOM ID for hook "${hookName}". Hooks require a unique ID on each element.`, el); + } + let hook = new ViewHook(this, el, callbacks); + this.viewHooks[ViewHook.elementID(hook.el)] = hook; + return hook; + } else if (hookName !== null) { + logError(`unknown hook found for "${hookName}"`, el); + } + } + } + destroyHook(hook) { + hook.__destroyed(); + hook.__cleanup__(); + delete this.viewHooks[ViewHook.elementID(hook.el)]; + } + applyPendingUpdates() { + this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events)); + this.pendingDiffs = []; + this.eachChild((child) => child.applyPendingUpdates()); + } + eachChild(callback) { + let children = this.root.children[this.id] || {}; + for (let id in children) { + callback(this.getChildById(id)); + } + } + onChannel(event, cb) { + this.liveSocket.onChannel(this.channel, event, (resp) => { + if (this.isJoinPending()) { + this.root.pendingJoinOps.push([this, () => cb(resp)]); + } else { + this.liveSocket.requestDOMUpdate(() => cb(resp)); + } + }); + } + bindChannel() { + this.liveSocket.onChannel(this.channel, "diff", (rawDiff) => { + this.liveSocket.requestDOMUpdate(() => { + this.applyDiff("update", rawDiff, ({ diff, events }) => this.update(diff, events)); + }); + }); + this.onChannel("redirect", ({ to, flash }) => this.onRedirect({ to, flash })); + this.onChannel("live_patch", (redir) => this.onLivePatch(redir)); + this.onChannel("live_redirect", (redir) => this.onLiveRedirect(redir)); + this.channel.onError((reason) => this.onError(reason)); + this.channel.onClose((reason) => this.onClose(reason)); + } + destroyAllChildren() { + this.eachChild((child) => child.destroy()); + } + onLiveRedirect(redir) { + let { to, kind, flash } = redir; + let url = this.expandURL(to); + let e = new CustomEvent("phx:server-navigate", { detail: { to, kind, flash } }); + this.liveSocket.historyRedirect(e, url, kind, flash); + } + onLivePatch(redir) { + let { to, kind } = redir; + this.href = this.expandURL(to); + this.liveSocket.historyPatch(to, kind); + } + expandURL(to) { + return to.startsWith("/") ? `${window.location.protocol}//${window.location.host}${to}` : to; + } + onRedirect({ to, flash, reloadToken }) { + this.liveSocket.redirect(to, flash, reloadToken); + } + isDestroyed() { + return this.destroyed; + } + joinDead() { + this.isDead = true; + } + joinPush() { + this.joinPush = this.joinPush || this.channel.join(); + return this.joinPush; + } + join(callback) { + this.showLoader(this.liveSocket.loaderTimeout); + this.bindChannel(); + if (this.isMain()) { + this.stopCallback = this.liveSocket.withPageLoading({ to: this.href, kind: "initial" }); + } + this.joinCallback = (onDone) => { + onDone = onDone || function() { + }; + callback ? callback(this.joinCount, onDone) : onDone(); + }; + this.wrapPush(() => this.channel.join(), { + ok: (resp) => this.liveSocket.requestDOMUpdate(() => this.onJoin(resp)), + error: (error) => this.onJoinError(error), + timeout: () => this.onJoinError({ reason: "timeout" }) + }); + } + onJoinError(resp) { + if (resp.reason === "reload") { + this.log("error", () => [`failed mount with ${resp.status}. Falling back to page reload`, resp]); + this.onRedirect({ to: this.root.href, reloadToken: resp.token }); + return; + } else if (resp.reason === "unauthorized" || resp.reason === "stale") { + this.log("error", () => ["unauthorized live_redirect. Falling back to page request", resp]); + this.onRedirect({ to: this.root.href }); + return; + } + if (resp.redirect || resp.live_redirect) { + this.joinPending = false; + this.channel.leave(); + } + if (resp.redirect) { + return this.onRedirect(resp.redirect); + } + if (resp.live_redirect) { + return this.onLiveRedirect(resp.live_redirect); + } + this.log("error", () => ["unable to join", resp]); + if (this.isMain()) { + this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS]); + if (this.liveSocket.isConnected()) { + this.liveSocket.reloadWithJitter(this); + } + } else { + if (this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS) { + this.root.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS]); + this.log("error", () => [`giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`, resp]); + this.destroy(); + } + let trueChildEl = dom_default.byId(this.el.id); + if (trueChildEl) { + dom_default.mergeAttrs(trueChildEl, this.el); + this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS]); + this.el = trueChildEl; + } else { + this.destroy(); + } + } + } + onClose(reason) { + if (this.isDestroyed()) { + return; + } + if (this.isMain() && this.liveSocket.hasPendingLink() && reason !== "leave") { + return this.liveSocket.reloadWithJitter(this); + } + this.destroyAllChildren(); + this.liveSocket.dropActiveElement(this); + if (document.activeElement) { + document.activeElement.blur(); + } + if (this.liveSocket.isUnloaded()) { + this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT); + } + } + onError(reason) { + this.onClose(reason); + if (this.liveSocket.isConnected()) { + this.log("error", () => ["view crashed", reason]); + } + if (!this.liveSocket.isUnloaded()) { + if (this.liveSocket.isConnected()) { + this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS]); + } else { + this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS]); + } + } + } + displayError(classes) { + if (this.isMain()) { + dom_default.dispatchEvent(window, "phx:page-loading-start", { detail: { to: this.href, kind: "error" } }); + } + this.showLoader(); + this.setContainerClasses(...classes); + this.execAll(this.binding("disconnected")); + } + wrapPush(callerPush, receives) { + let latency = this.liveSocket.getLatencySim(); + let withLatency = latency ? (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency) : (cb) => !this.isDestroyed() && cb(); + withLatency(() => { + callerPush().receive("ok", (resp) => withLatency(() => receives.ok && receives.ok(resp))).receive("error", (reason) => withLatency(() => receives.error && receives.error(reason))).receive("timeout", () => withLatency(() => receives.timeout && receives.timeout())); + }); + } + pushWithReply(refGenerator, event, payload) { + if (!this.isConnected()) { + return Promise.reject({ error: "noconnection" }); + } + let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}]; + let oldJoinCount = this.joinCount; + let onLoadingDone = function() { + }; + if (opts.page_loading) { + onLoadingDone = this.liveSocket.withPageLoading({ kind: "element", target: el }); + } + if (typeof payload.cid !== "number") { + delete payload.cid; + } + return new Promise((resolve, reject) => { + this.wrapPush(() => this.channel.push(event, payload, PUSH_TIMEOUT), { + ok: (resp) => { + if (ref !== null) { + this.lastAckRef = ref; + } + let finish = (hookReply) => { + if (resp.redirect) { + this.onRedirect(resp.redirect); + } + if (resp.live_patch) { + this.onLivePatch(resp.live_patch); + } + if (resp.live_redirect) { + this.onLiveRedirect(resp.live_redirect); + } + onLoadingDone(); + resolve({ resp, reply: hookReply }); + }; + if (resp.diff) { + this.liveSocket.requestDOMUpdate(() => { + this.applyDiff("update", resp.diff, ({ diff, reply, events }) => { + if (ref !== null) { + this.undoRefs(ref, payload.event); + } + this.update(diff, events); + finish(reply); + }); + }); + } else { + if (ref !== null) { + this.undoRefs(ref, payload.event); + } + finish(null); + } + }, + error: (reason) => reject({ error: reason }), + timeout: () => { + reject({ timeout: true }); + if (this.joinCount === oldJoinCount) { + this.liveSocket.reloadWithJitter(this, () => { + this.log("timeout", () => ["received timeout while communicating with server. Falling back to hard refresh for recovery"]); + }); + } + } + }); + }); + } + undoRefs(ref, phxEvent, onlyEls) { + if (!this.isConnected()) { + return; + } + let selector = `[${PHX_REF_SRC}="${this.refSrc()}"]`; + if (onlyEls) { + onlyEls = new Set(onlyEls); + dom_default.all(document, selector, (parent) => { + if (onlyEls && !onlyEls.has(parent)) { + return; + } + dom_default.all(parent, selector, (child) => this.undoElRef(child, ref, phxEvent)); + this.undoElRef(parent, ref, phxEvent); + }); + } else { + dom_default.all(document, selector, (el) => this.undoElRef(el, ref, phxEvent)); + } + } + undoElRef(el, ref, phxEvent) { + let elRef = new ElementRef(el); + elRef.maybeUndo(ref, phxEvent, (clonedTree) => { + let hook = this.triggerBeforeUpdateHook(el, clonedTree); + DOMPatch.patchWithClonedTree(el, clonedTree, this.liveSocket); + dom_default.all(el, `[${PHX_REF_SRC}="${this.refSrc()}"]`, (child) => this.undoElRef(child, ref, phxEvent)); + this.execNewMounted(el); + if (hook) { + hook.__updated(); + } + }); + } + refSrc() { + return this.el.id; + } + putRef(elements, phxEvent, eventType, opts = {}) { + let newRef = this.ref++; + let disableWith = this.binding(PHX_DISABLE_WITH); + if (opts.loading) { + let loadingEls = dom_default.all(document, opts.loading).map((el) => { + return { el, lock: true, loading: true }; + }); + elements = elements.concat(loadingEls); + } + for (let { el, lock, loading } of elements) { + if (!lock && !loading) { + throw new Error("putRef requires lock or loading"); + } + el.setAttribute(PHX_REF_SRC, this.refSrc()); + if (loading) { + el.setAttribute(PHX_REF_LOADING, newRef); + } + if (lock) { + el.setAttribute(PHX_REF_LOCK, newRef); + } + if (!loading || opts.submitter && !(el === opts.submitter || el === opts.form)) { + continue; + } + let lockCompletePromise = new Promise((resolve) => { + el.addEventListener(`phx:undo-lock:${newRef}`, () => resolve(detail), { once: true }); + }); + let loadingCompletePromise = new Promise((resolve) => { + el.addEventListener(`phx:undo-loading:${newRef}`, () => resolve(detail), { once: true }); + }); + el.classList.add(`phx-${eventType}-loading`); + let disableText = el.getAttribute(disableWith); + if (disableText !== null) { + if (!el.getAttribute(PHX_DISABLE_WITH_RESTORE)) { + el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText); + } + if (disableText !== "") { + el.innerText = disableText; + } + el.setAttribute(PHX_DISABLED, el.getAttribute(PHX_DISABLED) || el.disabled); + el.setAttribute("disabled", ""); + } + let detail = { + event: phxEvent, + eventType, + ref: newRef, + isLoading: loading, + isLocked: lock, + lockElements: elements.filter(({ lock: lock2 }) => lock2).map(({ el: el2 }) => el2), + loadingElements: elements.filter(({ loading: loading2 }) => loading2).map(({ el: el2 }) => el2), + unlock: (els) => { + els = Array.isArray(els) ? els : [els]; + this.undoRefs(newRef, phxEvent, els); + }, + lockComplete: lockCompletePromise, + loadingComplete: loadingCompletePromise, + lock: (lockEl) => { + return new Promise((resolve) => { + if (this.isAcked(newRef)) { + return resolve(detail); + } + lockEl.setAttribute(PHX_REF_LOCK, newRef); + lockEl.setAttribute(PHX_REF_SRC, this.refSrc()); + lockEl.addEventListener(`phx:lock-stop:${newRef}`, () => resolve(detail), { once: true }); + }); + } + }; + el.dispatchEvent(new CustomEvent(`phx:push`, { + detail, + bubbles: true, + cancelable: false + })); + if (phxEvent) { + el.dispatchEvent(new CustomEvent(`phx:push:${phxEvent}`, { + detail, + bubbles: true, + cancelable: false + })); + } + } + return [newRef, elements.map(({ el }) => el), opts]; + } + isAcked(ref) { + return this.lastAckRef !== null && this.lastAckRef >= ref; + } + componentID(el) { + let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT); + return cid ? parseInt(cid) : null; + } + targetComponentID(target, targetCtx, opts = {}) { + if (isCid(targetCtx)) { + return targetCtx; + } + let cidOrSelector = opts.target || target.getAttribute(this.binding("target")); + if (isCid(cidOrSelector)) { + return parseInt(cidOrSelector); + } else if (targetCtx && (cidOrSelector !== null || opts.target)) { + return this.closestComponentID(targetCtx); + } else { + return null; + } + } + closestComponentID(targetCtx) { + if (isCid(targetCtx)) { + return targetCtx; + } else if (targetCtx) { + return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), (el) => this.ownsElement(el) && this.componentID(el)); + } else { + return null; + } + } + pushHookEvent(el, targetCtx, event, payload, onReply) { + if (!this.isConnected()) { + this.log("hook", () => ["unable to push hook event. LiveView not connected", event, payload]); + return false; + } + let [ref, els, opts] = this.putRef([{ el, loading: true, lock: true }], event, "hook"); + this.pushWithReply(() => [ref, els, opts], "event", { + type: "hook", + event, + value: payload, + cid: this.closestComponentID(targetCtx) + }).then(({ resp: _resp, reply: hookReply }) => onReply(hookReply, ref)); + return ref; + } + extractMeta(el, meta, value) { + let prefix = this.binding("value-"); + for (let i = 0; i < el.attributes.length; i++) { + if (!meta) { + meta = {}; + } + let name = el.attributes[i].name; + if (name.startsWith(prefix)) { + meta[name.replace(prefix, "")] = el.getAttribute(name); + } + } + if (el.value !== void 0 && !(el instanceof HTMLFormElement)) { + if (!meta) { + meta = {}; + } + meta.value = el.value; + if (el.tagName === "INPUT" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked) { + delete meta.value; + } + } + if (value) { + if (!meta) { + meta = {}; + } + for (let key in value) { + meta[key] = value[key]; + } + } + return meta; + } + pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply) { + this.pushWithReply(() => this.putRef([{ el, loading: true, lock: true }], phxEvent, type, opts), "event", { + type, + event: phxEvent, + value: this.extractMeta(el, meta, opts.value), + cid: this.targetComponentID(el, targetCtx, opts) + }).then(({ resp, reply }) => onReply && onReply(reply)); + } + pushFileProgress(fileEl, entryRef, progress, onReply = function() { + }) { + this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => { + view.pushWithReply(null, "progress", { + event: fileEl.getAttribute(view.binding(PHX_PROGRESS)), + ref: fileEl.getAttribute(PHX_UPLOAD_REF), + entry_ref: entryRef, + progress, + cid: view.targetComponentID(fileEl.form, targetCtx) + }).then(({ resp }) => onReply(resp)); + }); + } + pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback) { + if (!inputEl.form) { + throw new Error("form events require the input to be inside a form"); + } + let uploads; + let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx, opts); + let refGenerator = () => { + return this.putRef([ + { el: inputEl, loading: true, lock: true }, + { el: inputEl.form, loading: true, lock: true } + ], phxEvent, "change", opts); + }; + let formData; + let meta = this.extractMeta(inputEl.form); + if (inputEl instanceof HTMLButtonElement) { + meta.submitter = inputEl; + } + if (inputEl.getAttribute(this.binding("change"))) { + formData = serializeForm(inputEl.form, __spreadValues({ _target: opts._target }, meta), [inputEl.name]); + } else { + formData = serializeForm(inputEl.form, __spreadValues({ _target: opts._target }, meta)); + } + if (dom_default.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0) { + LiveUploader.trackFiles(inputEl, Array.from(inputEl.files)); + } + uploads = LiveUploader.serializeUploads(inputEl); + let event = { + type: "form", + event: phxEvent, + value: formData, + uploads, + cid + }; + this.pushWithReply(refGenerator, "event", event).then(({ resp }) => { + if (dom_default.isUploadInput(inputEl) && dom_default.isAutoUpload(inputEl)) { + if (LiveUploader.filesAwaitingPreflight(inputEl).length > 0) { + let [ref, _els] = refGenerator(); + this.undoRefs(ref, phxEvent, [inputEl.form]); + this.uploadFiles(inputEl.form, phxEvent, targetCtx, ref, cid, (_uploads) => { + callback && callback(resp); + this.triggerAwaitingSubmit(inputEl.form, phxEvent); + this.undoRefs(ref, phxEvent); + }); + } + } else { + callback && callback(resp); + } + }); + } + triggerAwaitingSubmit(formEl, phxEvent) { + let awaitingSubmit = this.getScheduledSubmit(formEl); + if (awaitingSubmit) { + let [_el, _ref, _opts, callback] = awaitingSubmit; + this.cancelSubmit(formEl, phxEvent); + callback(); + } + } + getScheduledSubmit(formEl) { + return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl)); + } + scheduleSubmit(formEl, ref, opts, callback) { + if (this.getScheduledSubmit(formEl)) { + return true; + } + this.formSubmits.push([formEl, ref, opts, callback]); + } + cancelSubmit(formEl, phxEvent) { + this.formSubmits = this.formSubmits.filter(([el, ref, _callback]) => { + if (el.isSameNode(formEl)) { + this.undoRefs(ref, phxEvent); + return false; + } else { + return true; + } + }); + } + disableForm(formEl, phxEvent, opts = {}) { + let filterIgnored = (el) => { + let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form); + return !(userIgnored || closestPhxBinding(el, "data-phx-update=ignore", el.form)); + }; + let filterDisables = (el) => { + return el.hasAttribute(this.binding(PHX_DISABLE_WITH)); + }; + let filterButton = (el) => el.tagName == "BUTTON"; + let filterInput = (el) => ["INPUT", "TEXTAREA", "SELECT"].includes(el.tagName); + let formElements = Array.from(formEl.elements); + let disables = formElements.filter(filterDisables); + let buttons = formElements.filter(filterButton).filter(filterIgnored); + let inputs = formElements.filter(filterInput).filter(filterIgnored); + buttons.forEach((button) => { + button.setAttribute(PHX_DISABLED, button.disabled); + button.disabled = true; + }); + inputs.forEach((input) => { + input.setAttribute(PHX_READONLY, input.readOnly); + input.readOnly = true; + if (input.files) { + input.setAttribute(PHX_DISABLED, input.disabled); + input.disabled = true; + } + }); + let formEls = disables.concat(buttons).concat(inputs).map((el) => { + return { el, loading: true, lock: true }; + }); + let els = [{ el: formEl, loading: true, lock: false }].concat(formEls).reverse(); + return this.putRef(els, phxEvent, "submit", opts); + } + pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply) { + let refGenerator = () => this.disableForm(formEl, phxEvent, __spreadProps(__spreadValues({}, opts), { + form: formEl, + submitter + })); + let cid = this.targetComponentID(formEl, targetCtx); + if (LiveUploader.hasUploadsInProgress(formEl)) { + let [ref, _els] = refGenerator(); + let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply); + return this.scheduleSubmit(formEl, ref, opts, push); + } else if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) { + let [ref, els] = refGenerator(); + let proxyRefGen = () => [ref, els, opts]; + this.uploadFiles(formEl, phxEvent, targetCtx, ref, cid, (uploads) => { + if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) { + return this.undoRefs(ref, phxEvent); + } + let meta = this.extractMeta(formEl); + let formData = serializeForm(formEl, __spreadValues({ submitter }, meta)); + this.pushWithReply(proxyRefGen, "event", { + type: "form", + event: phxEvent, + value: formData, + cid + }).then(({ resp }) => onReply(resp)); + }); + } else if (!(formEl.hasAttribute(PHX_REF_SRC) && formEl.classList.contains("phx-submit-loading"))) { + let meta = this.extractMeta(formEl); + let formData = serializeForm(formEl, __spreadValues({ submitter }, meta)); + this.pushWithReply(refGenerator, "event", { + type: "form", + event: phxEvent, + value: formData, + cid + }).then(({ resp }) => onReply(resp)); + } + } + uploadFiles(formEl, phxEvent, targetCtx, ref, cid, onComplete) { + let joinCountAtUpload = this.joinCount; + let inputEls = LiveUploader.activeFileInputs(formEl); + let numFileInputsInProgress = inputEls.length; + inputEls.forEach((inputEl) => { + let uploader = new LiveUploader(inputEl, this, () => { + numFileInputsInProgress--; + if (numFileInputsInProgress === 0) { + onComplete(); + } + }); + let entries = uploader.entries().map((entry) => entry.toPreflightPayload()); + if (entries.length === 0) { + numFileInputsInProgress--; + return; + } + let payload = { + ref: inputEl.getAttribute(PHX_UPLOAD_REF), + entries, + cid: this.targetComponentID(inputEl.form, targetCtx) + }; + this.log("upload", () => ["sending preflight request", payload]); + this.pushWithReply(null, "allow_upload", payload).then(({ resp }) => { + this.log("upload", () => ["got preflight response", resp]); + uploader.entries().forEach((entry) => { + if (resp.entries && !resp.entries[entry.ref]) { + this.handleFailedEntryPreflight(entry.ref, "failed preflight", uploader); + } + }); + if (resp.error || Object.keys(resp.entries).length === 0) { + this.undoRefs(ref, phxEvent); + let errors = resp.error || []; + errors.map(([entry_ref, reason]) => { + this.handleFailedEntryPreflight(entry_ref, reason, uploader); + }); + } else { + let onError = (callback) => { + this.channel.onError(() => { + if (this.joinCount === joinCountAtUpload) { + callback(); + } + }); + }; + uploader.initAdapterUpload(resp, onError, this.liveSocket); + } + }); + }); + } + handleFailedEntryPreflight(uploadRef, reason, uploader) { + if (uploader.isAutoUpload()) { + let entry = uploader.entries().find((entry2) => entry2.ref === uploadRef.toString()); + if (entry) { + entry.cancel(); + } + } else { + uploader.entries().map((entry) => entry.cancel()); + } + this.log("upload", () => [`error for entry ${uploadRef}`, reason]); + } + dispatchUploads(targetCtx, name, filesOrBlobs) { + let targetElement = this.targetCtxElement(targetCtx) || this.el; + let inputs = dom_default.findUploadInputs(targetElement).filter((el) => el.name === name); + if (inputs.length === 0) { + logError(`no live file inputs found matching the name "${name}"`); + } else if (inputs.length > 1) { + logError(`duplicate live file inputs found matching the name "${name}"`); + } else { + dom_default.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, { detail: { files: filesOrBlobs } }); + } + } + targetCtxElement(targetCtx) { + if (isCid(targetCtx)) { + let [target] = dom_default.findComponentNodeList(this.el, targetCtx); + return target; + } else if (targetCtx) { + return targetCtx; + } else { + return null; + } + } + pushFormRecovery(oldForm, newForm, templateDom, callback) { + const phxChange = this.binding("change"); + const phxTarget = newForm.getAttribute(this.binding("target")) || newForm; + const phxEvent = newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) || newForm.getAttribute(this.binding("change")); + const inputs = Array.from(oldForm.elements).filter((el) => dom_default.isFormInput(el) && el.name && !el.hasAttribute(phxChange)); + if (inputs.length === 0) { + return; + } + inputs.forEach((input2) => input2.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input2)); + let input = inputs.find((el) => el.type !== "hidden") || inputs[0]; + let pending = 0; + this.withinTargets(phxTarget, (targetView, targetCtx) => { + const cid = this.targetComponentID(newForm, targetCtx); + pending++; + targetView.pushInput(input, targetCtx, cid, phxEvent, { _target: input.name }, () => { + pending--; + if (pending === 0) { + callback(); + } + }); + }, templateDom, templateDom); + } + pushLinkPatch(e, href, targetEl, callback) { + let linkRef = this.liveSocket.setPendingLink(href); + let loading = e.isTrusted && e.type !== "popstate"; + let refGen = targetEl ? () => this.putRef([{ el: targetEl, loading, lock: true }], null, "click") : null; + let fallback = () => this.liveSocket.redirect(window.location.href); + let url = href.startsWith("/") ? `${location.protocol}//${location.host}${href}` : href; + this.pushWithReply(refGen, "live_patch", { url }).then( + ({ resp }) => { + this.liveSocket.requestDOMUpdate(() => { + if (resp.link_redirect) { + this.liveSocket.replaceMain(href, null, callback, linkRef); + } else { + if (this.liveSocket.commitPendingLink(linkRef)) { + this.href = href; + } + this.applyPendingUpdates(); + callback && callback(linkRef); + } + }); + }, + ({ error: _error, timeout: _timeout }) => fallback() + ); + } + getFormsForRecovery() { + if (this.joinCount === 0) { + return {}; + } + let phxChange = this.binding("change"); + return dom_default.all(this.el, `form[${phxChange}]`).filter((form) => form.id).filter((form) => form.elements.length > 0).filter((form) => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== "ignore").map((form) => form.cloneNode(true)).reduce((acc, form) => { + acc[form.id] = form; + return acc; + }, {}); + } + maybePushComponentsDestroyed(destroyedCIDs) { + let willDestroyCIDs = destroyedCIDs.filter((cid) => { + return dom_default.findComponentNodeList(this.el, cid).length === 0; + }); + if (willDestroyCIDs.length > 0) { + willDestroyCIDs.forEach((cid) => this.rendered.resetRender(cid)); + this.pushWithReply(null, "cids_will_destroy", { cids: willDestroyCIDs }).then(() => { + this.liveSocket.requestDOMUpdate(() => { + let completelyDestroyCIDs = willDestroyCIDs.filter((cid) => { + return dom_default.findComponentNodeList(this.el, cid).length === 0; + }); + if (completelyDestroyCIDs.length > 0) { + this.pushWithReply(null, "cids_destroyed", { cids: completelyDestroyCIDs }).then(({ resp }) => { + this.rendered.pruneCIDs(resp.cids); + }); + } + }); + }); + } + } + ownsElement(el) { + let parentViewEl = el.closest(PHX_VIEW_SELECTOR); + return el.getAttribute(PHX_PARENT_ID) === this.id || parentViewEl && parentViewEl.id === this.id || !parentViewEl && this.isDead; + } + submitForm(form, targetCtx, phxEvent, submitter, opts = {}) { + dom_default.putPrivate(form, PHX_HAS_SUBMITTED, true); + const inputs = Array.from(form.elements); + inputs.forEach((input) => dom_default.putPrivate(input, PHX_HAS_SUBMITTED, true)); + this.liveSocket.blurActiveElement(this); + this.pushFormSubmit(form, targetCtx, phxEvent, submitter, opts, () => { + this.liveSocket.restorePreviouslyActiveFocus(); + }); + } + binding(kind) { + return this.liveSocket.binding(kind); + } + }; + var LiveSocket = class { + constructor(url, phxSocket, opts = {}) { + this.unloaded = false; + if (!phxSocket || phxSocket.constructor.name === "Object") { + throw new Error(` + a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example: + + import {Socket} from "phoenix" + import {LiveSocket} from "phoenix_live_view" + let liveSocket = new LiveSocket("/live", Socket, {...}) + `); + } + this.socket = new phxSocket(url, opts); + this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX; + this.opts = opts; + this.params = closure2(opts.params || {}); + this.viewLogger = opts.viewLogger; + this.metadataCallbacks = opts.metadata || {}; + this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {}); + this.activeElement = null; + this.prevActive = null; + this.silenced = false; + this.main = null; + this.outgoingMainEl = null; + this.clickStartedAtTarget = null; + this.linkRef = 1; + this.roots = {}; + this.href = window.location.href; + this.pendingLink = null; + this.currentLocation = clone(window.location); + this.hooks = opts.hooks || {}; + this.uploaders = opts.uploaders || {}; + this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT; + this.reloadWithJitterTimer = null; + this.maxReloads = opts.maxReloads || MAX_RELOADS; + this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN; + this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX; + this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER; + this.localStorage = opts.localStorage || window.localStorage; + this.sessionStorage = opts.sessionStorage || window.sessionStorage; + this.boundTopLevelEvents = false; + this.boundEventNames = /* @__PURE__ */ new Set(); + this.serverCloseRef = null; + this.domCallbacks = Object.assign( + { + jsQuerySelectorAll: null, + onPatchStart: closure2(), + onPatchEnd: closure2(), + onNodeAdded: closure2(), + onBeforeElUpdated: closure2() + }, + opts.dom || {} + ); + this.transitions = new TransitionSet(); + window.addEventListener("pagehide", (_e) => { + this.unloaded = true; + }); + this.socket.onOpen(() => { + if (this.isUnloaded()) { + window.location.reload(); + } + }); + } + // public + version() { + return "1.0.0-rc.7"; + } + isProfileEnabled() { + return this.sessionStorage.getItem(PHX_LV_PROFILE) === "true"; + } + isDebugEnabled() { + return this.sessionStorage.getItem(PHX_LV_DEBUG) === "true"; + } + isDebugDisabled() { + return this.sessionStorage.getItem(PHX_LV_DEBUG) === "false"; + } + enableDebug() { + this.sessionStorage.setItem(PHX_LV_DEBUG, "true"); + } + enableProfiling() { + this.sessionStorage.setItem(PHX_LV_PROFILE, "true"); + } + disableDebug() { + this.sessionStorage.setItem(PHX_LV_DEBUG, "false"); + } + disableProfiling() { + this.sessionStorage.removeItem(PHX_LV_PROFILE); + } + enableLatencySim(upperBoundMs) { + this.enableDebug(); + console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable"); + this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs); + } + disableLatencySim() { + this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM); + } + getLatencySim() { + let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM); + return str ? parseInt(str) : null; + } + getSocket() { + return this.socket; + } + connect() { + if (window.location.hostname === "localhost" && !this.isDebugDisabled()) { + this.enableDebug(); + } + let doConnect = () => { + this.resetReloadStatus(); + if (this.joinRootViews()) { + this.bindTopLevelEvents(); + this.socket.connect(); + } else if (this.main) { + this.socket.connect(); + } else { + this.bindTopLevelEvents({ dead: true }); + } + this.joinDeadView(); + }; + if (["complete", "loaded", "interactive"].indexOf(document.readyState) >= 0) { + doConnect(); + } else { + document.addEventListener("DOMContentLoaded", () => doConnect()); + } + } + disconnect(callback) { + clearTimeout(this.reloadWithJitterTimer); + if (this.serverCloseRef) { + this.socket.off(this.serverCloseRef); + this.serverCloseRef = null; + } + this.socket.disconnect(callback); + } + replaceTransport(transport) { + clearTimeout(this.reloadWithJitterTimer); + this.socket.replaceTransport(transport); + this.connect(); + } + execJS(el, encodedJS, eventType = null) { + let e = new CustomEvent("phx:exec", { detail: { sourceElement: el } }); + this.owner(el, (view) => js_default.exec(e, eventType, encodedJS, view, el)); + } + // private + execJSHookPush(el, phxEvent, data, callback) { + this.withinOwners(el, (view) => { + let e = new CustomEvent("phx:exec", { detail: { sourceElement: el } }); + js_default.exec(e, "hook", phxEvent, view, el, ["push", { data, callback }]); + }); + } + unload() { + if (this.unloaded) { + return; + } + if (this.main && this.isConnected()) { + this.log(this.main, "socket", () => ["disconnect for page nav"]); + } + this.unloaded = true; + this.destroyAllViews(); + this.disconnect(); + } + triggerDOM(kind, args) { + this.domCallbacks[kind](...args); + } + time(name, func) { + if (!this.isProfileEnabled() || !console.time) { + return func(); + } + console.time(name); + let result = func(); + console.timeEnd(name); + return result; + } + log(view, kind, msgCallback) { + if (this.viewLogger) { + let [msg, obj] = msgCallback(); + this.viewLogger(view, kind, msg, obj); + } else if (this.isDebugEnabled()) { + let [msg, obj] = msgCallback(); + debug(view, kind, msg, obj); + } + } + requestDOMUpdate(callback) { + this.transitions.after(callback); + } + transition(time, onStart, onDone = function() { + }) { + this.transitions.addTransition(time, onStart, onDone); + } + onChannel(channel, event, cb) { + channel.on(event, (data) => { + let latency = this.getLatencySim(); + if (!latency) { + cb(data); + } else { + setTimeout(() => cb(data), latency); + } + }); + } + reloadWithJitter(view, log) { + clearTimeout(this.reloadWithJitterTimer); + this.disconnect(); + let minMs = this.reloadJitterMin; + let maxMs = this.reloadJitterMax; + let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs; + let tries = browser_default.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, (count) => count + 1); + if (tries >= this.maxReloads) { + afterMs = this.failsafeJitter; + } + this.reloadWithJitterTimer = setTimeout(() => { + if (view.isDestroyed() || view.isConnected()) { + return; + } + view.destroy(); + log ? log() : this.log(view, "join", () => [`encountered ${tries} consecutive reloads`]); + if (tries >= this.maxReloads) { + this.log(view, "join", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`]); + } + if (this.hasPendingLink()) { + window.location = this.pendingLink; + } else { + window.location.reload(); + } + }, afterMs); + } + getHookCallbacks(name) { + return name && name.startsWith("Phoenix.") ? hooks_default[name.split(".")[1]] : this.hooks[name]; + } + isUnloaded() { + return this.unloaded; + } + isConnected() { + return this.socket.isConnected(); + } + getBindingPrefix() { + return this.bindingPrefix; + } + binding(kind) { + return `${this.getBindingPrefix()}${kind}`; + } + channel(topic, params) { + return this.socket.channel(topic, params); + } + joinDeadView() { + let body = document.body; + if (body && !this.isPhxView(body) && !this.isPhxView(document.firstElementChild)) { + let view = this.newRootView(body); + view.setHref(this.getHref()); + view.joinDead(); + if (!this.main) { + this.main = view; + } + window.requestAnimationFrame(() => view.execNewMounted()); + } + } + joinRootViews() { + let rootsFound = false; + dom_default.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, (rootEl) => { + if (!this.getRootById(rootEl.id)) { + let view = this.newRootView(rootEl); + view.setHref(this.getHref()); + view.join(); + if (rootEl.hasAttribute(PHX_MAIN)) { + this.main = view; + } + } + rootsFound = true; + }); + return rootsFound; + } + redirect(to, flash, reloadToken) { + if (reloadToken) { + browser_default.setCookie(PHX_RELOAD_STATUS, reloadToken, 60); + } + this.unload(); + browser_default.redirect(to, flash); + } + replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)) { + let liveReferer = this.currentLocation.href; + this.outgoingMainEl = this.outgoingMainEl || this.main.el; + let removeEls = dom_default.all(this.outgoingMainEl, `[${this.binding("remove")}]`); + let newMainEl = dom_default.cloneNode(this.outgoingMainEl, ""); + this.main.showLoader(this.loaderTimeout); + this.main.destroy(); + this.main = this.newRootView(newMainEl, flash, liveReferer); + this.main.setRedirect(href); + this.transitionRemoves(removeEls, true); + this.main.join((joinCount, onDone) => { + if (joinCount === 1 && this.commitPendingLink(linkRef)) { + this.requestDOMUpdate(() => { + removeEls.forEach((el) => el.remove()); + dom_default.findPhxSticky(document).forEach((el) => newMainEl.appendChild(el)); + this.outgoingMainEl.replaceWith(newMainEl); + this.outgoingMainEl = null; + callback && callback(linkRef); + onDone(); + }); + } + }); + } + transitionRemoves(elements, skipSticky, callback) { + let removeAttr = this.binding("remove"); + if (skipSticky) { + const stickies = dom_default.findPhxSticky(document) || []; + elements = elements.filter((el) => !dom_default.isChildOfAny(el, stickies)); + } + let silenceEvents = (e) => { + e.preventDefault(); + e.stopImmediatePropagation(); + }; + elements.forEach((el) => { + for (let event of this.boundEventNames) { + el.addEventListener(event, silenceEvents, true); + } + this.execJS(el, el.getAttribute(removeAttr), "remove"); + }); + this.requestDOMUpdate(() => { + elements.forEach((el) => { + for (let event of this.boundEventNames) { + el.removeEventListener(event, silenceEvents, true); + } + }); + callback && callback(); + }); + } + isPhxView(el) { + return el.getAttribute && el.getAttribute(PHX_SESSION) !== null; + } + newRootView(el, flash, liveReferer) { + let view = new View(el, this, null, flash, liveReferer); + this.roots[view.id] = view; + return view; + } + owner(childEl, callback) { + let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), (el) => this.getViewByEl(el)) || this.main; + return view && callback ? callback(view) : view; + } + withinOwners(childEl, callback) { + this.owner(childEl, (view) => callback(view, childEl)); + } + getViewByEl(el) { + let rootId = el.getAttribute(PHX_ROOT_ID); + return maybe(this.getRootById(rootId), (root) => root.getDescendentByEl(el)); + } + getRootById(id) { + return this.roots[id]; + } + destroyAllViews() { + for (let id in this.roots) { + this.roots[id].destroy(); + delete this.roots[id]; + } + this.main = null; + } + destroyViewByEl(el) { + let root = this.getRootById(el.getAttribute(PHX_ROOT_ID)); + if (root && root.id === el.id) { + root.destroy(); + delete this.roots[root.id]; + } else if (root) { + root.destroyDescendent(el.id); + } + } + getActiveElement() { + return document.activeElement; + } + dropActiveElement(view) { + if (this.prevActive && view.ownsElement(this.prevActive)) { + this.prevActive = null; + } + } + restorePreviouslyActiveFocus() { + if (this.prevActive && this.prevActive !== document.body) { + this.prevActive.focus(); + } + } + blurActiveElement() { + this.prevActive = this.getActiveElement(); + if (this.prevActive !== document.body) { + this.prevActive.blur(); + } + } + bindTopLevelEvents({ dead } = {}) { + if (this.boundTopLevelEvents) { + return; + } + this.boundTopLevelEvents = true; + this.serverCloseRef = this.socket.onClose((event) => { + if (event && event.code === 1e3 && this.main) { + return this.reloadWithJitter(this.main); + } + }); + document.body.addEventListener("click", function() { + }); + window.addEventListener("pageshow", (e) => { + if (e.persisted) { + this.getSocket().disconnect(); + this.withPageLoading({ to: window.location.href, kind: "redirect" }); + window.location.reload(); + } + }, true); + if (!dead) { + this.bindNav(); + } + this.bindClicks(); + if (!dead) { + this.bindForms(); + } + this.bind({ keyup: "keyup", keydown: "keydown" }, (e, type, view, targetEl, phxEvent, phxTarget) => { + let matchKey = targetEl.getAttribute(this.binding(PHX_KEY)); + let pressedKey = e.key && e.key.toLowerCase(); + if (matchKey && matchKey.toLowerCase() !== pressedKey) { + return; + } + let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl)); + js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); + }); + this.bind({ blur: "focusout", focus: "focusin" }, (e, type, view, targetEl, phxEvent, phxTarget) => { + if (!phxTarget) { + let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl)); + js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); + } + }); + this.bind({ blur: "blur", focus: "focus" }, (e, type, view, targetEl, phxEvent, phxTarget) => { + if (phxTarget === "window") { + let data = this.eventMeta(type, e, targetEl); + js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); + } + }); + this.on("dragover", (e) => e.preventDefault()); + this.on("drop", (e) => { + e.preventDefault(); + let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), (trueTarget) => { + return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET)); + }); + let dropTarget = dropTargetId && document.getElementById(dropTargetId); + let files = Array.from(e.dataTransfer.files || []); + if (!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)) { + return; + } + LiveUploader.trackFiles(dropTarget, files, e.dataTransfer); + dropTarget.dispatchEvent(new Event("input", { bubbles: true })); + }); + this.on(PHX_TRACK_UPLOADS, (e) => { + let uploadTarget = e.target; + if (!dom_default.isUploadInput(uploadTarget)) { + return; + } + let files = Array.from(e.detail.files || []).filter((f) => f instanceof File || f instanceof Blob); + LiveUploader.trackFiles(uploadTarget, files); + uploadTarget.dispatchEvent(new Event("input", { bubbles: true })); + }); + } + eventMeta(eventName, e, targetEl) { + let callback = this.metadataCallbacks[eventName]; + return callback ? callback(e, targetEl) : {}; + } + setPendingLink(href) { + this.linkRef++; + this.pendingLink = href; + this.resetReloadStatus(); + return this.linkRef; + } + // anytime we are navigating or connecting, drop reload cookie in case + // we issue the cookie but the next request was interrupted and the server never dropped it + resetReloadStatus() { + browser_default.deleteCookie(PHX_RELOAD_STATUS); + } + commitPendingLink(linkRef) { + if (this.linkRef !== linkRef) { + return false; + } else { + this.href = this.pendingLink; + this.pendingLink = null; + return true; + } + } + getHref() { + return this.href; + } + hasPendingLink() { + return !!this.pendingLink; + } + bind(events, callback) { + for (let event in events) { + let browserEventName = events[event]; + this.on(browserEventName, (e) => { + let binding = this.binding(event); + let windowBinding = this.binding(`window-${event}`); + let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding); + if (targetPhxEvent) { + this.debounce(e.target, e, browserEventName, () => { + this.withinOwners(e.target, (view) => { + callback(e, event, view, e.target, targetPhxEvent, null); + }); + }); + } else { + dom_default.all(document, `[${windowBinding}]`, (el) => { + let phxEvent = el.getAttribute(windowBinding); + this.debounce(el, e, browserEventName, () => { + this.withinOwners(el, (view) => { + callback(e, event, view, el, phxEvent, "window"); + }); + }); + }); + } + }); + } + } + bindClicks() { + this.on("mousedown", (e) => this.clickStartedAtTarget = e.target); + this.bindClick("click", "click"); + } + bindClick(eventName, bindingName) { + let click = this.binding(bindingName); + window.addEventListener(eventName, (e) => { + let target = null; + if (e.detail === 0) + this.clickStartedAtTarget = e.target; + let clickStartedAtTarget = this.clickStartedAtTarget || e.target; + target = closestPhxBinding(e.target, click); + this.dispatchClickAway(e, clickStartedAtTarget); + this.clickStartedAtTarget = null; + let phxEvent = target && target.getAttribute(click); + if (!phxEvent) { + if (dom_default.isNewPageClick(e, window.location)) { + this.unload(); + } + return; + } + if (target.getAttribute("href") === "#") { + e.preventDefault(); + } + if (target.hasAttribute(PHX_REF_SRC)) { + return; + } + this.debounce(target, e, "click", () => { + this.withinOwners(target, (view) => { + js_default.exec(e, "click", phxEvent, view, target, ["push", { data: this.eventMeta("click", e, target) }]); + }); + }); + }, false); + } + dispatchClickAway(e, clickStartedAt) { + let phxClickAway = this.binding("click-away"); + dom_default.all(document, `[${phxClickAway}]`, (el) => { + if (!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))) { + this.withinOwners(el, (view) => { + let phxEvent = el.getAttribute(phxClickAway); + if (js_default.isVisible(el) && js_default.isInViewport(el)) { + js_default.exec(e, "click", phxEvent, view, el, ["push", { data: this.eventMeta("click", e, e.target) }]); + } + }); + } + }); + } + bindNav() { + if (!browser_default.canPushState()) { + return; + } + if (history.scrollRestoration) { + history.scrollRestoration = "manual"; + } + let scrollTimer = null; + window.addEventListener("scroll", (_e) => { + clearTimeout(scrollTimer); + scrollTimer = setTimeout(() => { + browser_default.updateCurrentState((state) => Object.assign(state, { scroll: window.scrollY })); + }, 100); + }); + window.addEventListener("popstate", (event) => { + if (!this.registerNewLocation(window.location)) { + return; + } + let { type, id, root, scroll } = event.state || {}; + let href = window.location.href; + dom_default.dispatchEvent(window, "phx:navigate", { detail: { href, patch: type === "patch", pop: true } }); + this.requestDOMUpdate(() => { + if (this.main.isConnected() && (type === "patch" && id === this.main.id)) { + this.main.pushLinkPatch(event, href, null, () => { + this.maybeScroll(scroll); + }); + } else { + this.replaceMain(href, null, () => { + if (root) { + this.replaceRootHistory(); + } + this.maybeScroll(scroll); + }); + } + }); + }, false); + window.addEventListener("click", (e) => { + let target = closestPhxBinding(e.target, PHX_LIVE_LINK); + let type = target && target.getAttribute(PHX_LIVE_LINK); + if (!type || !this.isConnected() || !this.main || dom_default.wantsNewTab(e)) { + return; + } + let href = target.href instanceof SVGAnimatedString ? target.href.baseVal : target.href; + let linkState = target.getAttribute(PHX_LINK_STATE); + e.preventDefault(); + e.stopImmediatePropagation(); + if (this.pendingLink === href) { + return; + } + this.requestDOMUpdate(() => { + if (type === "patch") { + this.pushHistoryPatch(e, href, linkState, target); + } else if (type === "redirect") { + this.historyRedirect(e, href, linkState, null, target); + } else { + throw new Error(`expected ${PHX_LIVE_LINK} to be "patch" or "redirect", got: ${type}`); + } + let phxClick = target.getAttribute(this.binding("click")); + if (phxClick) { + this.requestDOMUpdate(() => this.execJS(target, phxClick, "click")); + } + }); + }, false); + } + maybeScroll(scroll) { + if (typeof scroll === "number") { + requestAnimationFrame(() => { + window.scrollTo(0, scroll); + }); + } + } + dispatchEvent(event, payload = {}) { + dom_default.dispatchEvent(window, `phx:${event}`, { detail: payload }); + } + dispatchEvents(events) { + events.forEach(([event, payload]) => this.dispatchEvent(event, payload)); + } + withPageLoading(info, callback) { + dom_default.dispatchEvent(window, "phx:page-loading-start", { detail: info }); + let done = () => dom_default.dispatchEvent(window, "phx:page-loading-stop", { detail: info }); + return callback ? callback(done) : done; + } + pushHistoryPatch(e, href, linkState, targetEl) { + if (!this.isConnected() || !this.main.isMain()) { + return browser_default.redirect(href); + } + this.withPageLoading({ to: href, kind: "patch" }, (done) => { + this.main.pushLinkPatch(e, href, targetEl, (linkRef) => { + this.historyPatch(href, linkState, linkRef); + done(); + }); + }); + } + historyPatch(href, linkState, linkRef = this.setPendingLink(href)) { + if (!this.commitPendingLink(linkRef)) { + return; + } + browser_default.pushState(linkState, { type: "patch", id: this.main.id }, href); + dom_default.dispatchEvent(window, "phx:navigate", { detail: { patch: true, href, pop: false } }); + this.registerNewLocation(window.location); + } + historyRedirect(e, href, linkState, flash, targetEl) { + if (targetEl && e.isTrusted && e.type !== "popstate") { + targetEl.classList.add("phx-click-loading"); + } + if (!this.isConnected() || !this.main.isMain()) { + return browser_default.redirect(href, flash); + } + if (/^\/$|^\/[^\/]+.*$/.test(href)) { + let { protocol, host } = window.location; + href = `${protocol}//${host}${href}`; + } + let scroll = window.scrollY; + this.withPageLoading({ to: href, kind: "redirect" }, (done) => { + this.replaceMain(href, flash, (linkRef) => { + if (linkRef === this.linkRef) { + browser_default.pushState(linkState, { type: "redirect", id: this.main.id, scroll }, href); + dom_default.dispatchEvent(window, "phx:navigate", { detail: { href, patch: false, pop: false } }); + this.registerNewLocation(window.location); + } + done(); + }); + }); + } + replaceRootHistory() { + browser_default.pushState("replace", { root: true, type: "patch", id: this.main.id }); + } + registerNewLocation(newLocation) { + let { pathname, search } = this.currentLocation; + if (pathname + search === newLocation.pathname + newLocation.search) { + return false; + } else { + this.currentLocation = clone(newLocation); + return true; + } + } + bindForms() { + let iterations = 0; + let externalFormSubmitted = false; + this.on("submit", (e) => { + let phxSubmit = e.target.getAttribute(this.binding("submit")); + let phxChange = e.target.getAttribute(this.binding("change")); + if (!externalFormSubmitted && phxChange && !phxSubmit) { + externalFormSubmitted = true; + e.preventDefault(); + this.withinOwners(e.target, (view) => { + view.disableForm(e.target); + window.requestAnimationFrame(() => { + if (dom_default.isUnloadableFormSubmit(e)) { + this.unload(); + } + e.target.submit(); + }); + }); + } + }); + this.on("submit", (e) => { + let phxEvent = e.target.getAttribute(this.binding("submit")); + if (!phxEvent) { + if (dom_default.isUnloadableFormSubmit(e)) { + this.unload(); + } + return; + } + e.preventDefault(); + e.target.disabled = true; + this.withinOwners(e.target, (view) => { + js_default.exec(e, "submit", phxEvent, view, e.target, ["push", { submitter: e.submitter }]); + }); + }); + for (let type of ["change", "input"]) { + this.on(type, (e) => { + if (e instanceof CustomEvent && e.target.form === void 0) { + throw new Error(`dispatching a custom ${type} event is only supported on input elements inside a form`); + } + let phxChange = this.binding("change"); + let input = e.target; + if (e.isComposing) { + const key = `composition-listener-${type}`; + if (!dom_default.private(input, key)) { + dom_default.putPrivate(input, key, true); + input.addEventListener("compositionend", () => { + input.dispatchEvent(new Event(type, { bubbles: true })); + dom_default.deletePrivate(input, key); + }, { once: true }); + } + return; + } + let inputEvent = input.getAttribute(phxChange); + let formEvent = input.form && input.form.getAttribute(phxChange); + let phxEvent = inputEvent || formEvent; + if (!phxEvent) { + return; + } + if (input.type === "number" && input.validity && input.validity.badInput) { + return; + } + let dispatcher = inputEvent ? input : input.form; + let currentIterations = iterations; + iterations++; + let { at, type: lastType } = dom_default.private(input, "prev-iteration") || {}; + if (at === currentIterations - 1 && type === "change" && lastType === "input") { + return; + } + dom_default.putPrivate(input, "prev-iteration", { at: currentIterations, type }); + this.debounce(input, e, type, () => { + this.withinOwners(dispatcher, (view) => { + dom_default.putPrivate(input, PHX_HAS_FOCUSED, true); + js_default.exec(e, "change", phxEvent, view, input, ["push", { _target: e.target.name, dispatcher }]); + }); + }); + }); + } + this.on("reset", (e) => { + let form = e.target; + dom_default.resetForm(form); + let input = Array.from(form.elements).find((el) => el.type === "reset"); + if (input) { + window.requestAnimationFrame(() => { + input.dispatchEvent(new Event("input", { bubbles: true, cancelable: false })); + }); + } + }); + } + debounce(el, event, eventType, callback) { + if (eventType === "blur" || eventType === "focusout") { + return callback(); + } + let phxDebounce = this.binding(PHX_DEBOUNCE); + let phxThrottle = this.binding(PHX_THROTTLE); + let defaultDebounce = this.defaults.debounce.toString(); + let defaultThrottle = this.defaults.throttle.toString(); + this.withinOwners(el, (view) => { + let asyncFilter = () => !view.isDestroyed() && document.body.contains(el); + dom_default.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, () => { + callback(); + }); + }); + } + silenceEvents(callback) { + this.silenced = true; + callback(); + this.silenced = false; + } + on(event, callback) { + this.boundEventNames.add(event); + window.addEventListener(event, (e) => { + if (!this.silenced) { + callback(e); + } + }); + } + jsQuerySelectorAll(sourceEl, query, defaultQuery) { + let all = this.domCallbacks.jsQuerySelectorAll; + return all ? all(sourceEl, query, defaultQuery) : defaultQuery(); + } + }; + var TransitionSet = class { + constructor() { + this.transitions = /* @__PURE__ */ new Set(); + this.pendingOps = []; + } + reset() { + this.transitions.forEach((timer) => { + clearTimeout(timer); + this.transitions.delete(timer); + }); + this.flushPendingOps(); + } + after(callback) { + if (this.size() === 0) { + callback(); + } else { + this.pushPendingOp(callback); + } + } + addTransition(time, onStart, onDone) { + onStart(); + let timer = setTimeout(() => { + this.transitions.delete(timer); + onDone(); + this.flushPendingOps(); + }, time); + this.transitions.add(timer); + } + pushPendingOp(op) { + this.pendingOps.push(op); + } + size() { + return this.transitions.size; + } + flushPendingOps() { + if (this.size() > 0) { + return; + } + let op = this.pendingOps.shift(); + if (op) { + op(); + this.flushPendingOps(); + } + } + }; + + // js/app.js + var import_topbar = __toESM(require_topbar()); + var csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content"); + var liveSocket = new LiveSocket("/live", Socket, { + longPollFallbackMs: 2500, + params: { _csrf_token: csrfToken } + }); + import_topbar.default.config({ barColors: { 0: "#29d" }, shadowColor: "rgba(0, 0, 0, .3)" }); + window.addEventListener("phx:page-loading-start", (_info) => import_topbar.default.show(300)); + window.addEventListener("phx:page-loading-stop", (_info) => import_topbar.default.hide()); + liveSocket.connect(); + window.liveSocket = liveSocket; +})(); +/** + * @license MIT + * topbar 2.0.0, 2023-02-04 + * https://buunguyen.github.io/topbar + * Copyright (c) 2021 Buu Nguyen + */ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vYXNzZXRzL3ZlbmRvci90b3BiYXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2h0bWwvcHJpdi9zdGF0aWMvcGhvZW5peF9odG1sLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC91dGlscy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9wdXNoLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC90aW1lci5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvY2hhbm5lbC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvYWpheC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvbG9uZ3BvbGwuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3ByZXNlbmNlLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9zZXJpYWxpemVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9zb2NrZXQuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2VudHJ5X3VwbG9hZGVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3V0aWxzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2Jyb3dzZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYXJpYS5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9qcy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaG9va3MuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZWxlbWVudF9yZWYuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZG9tX3Bvc3RfbW9ycGhfcmVzdG9yZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvbm9kZV9tb2R1bGVzL21vcnBoZG9tL2Rpc3QvbW9ycGhkb20tZXNtLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2RvbV9wYXRjaC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9yZW5kZXJlZC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy92aWV3X2hvb2suanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlldy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9saXZlX3NvY2tldC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9pbmRleC5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMvYXBwLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDIuMC4wLCAyMDIzLTAyLTA0XG4gKiBodHRwczovL2J1dW5ndXllbi5naXRodWIuaW8vdG9wYmFyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgQnV1IE5ndXllblxuICovXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzE1Nzk2NzFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGFzdFRpbWUgPSAwO1xuICAgIHZhciB2ZW5kb3JzID0gW1wibXNcIiwgXCJtb3pcIiwgXCJ3ZWJraXRcIiwgXCJvXCJdO1xuICAgIGZvciAodmFyIHggPSAwOyB4IDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsreCkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgIHdpbmRvd1t2ZW5kb3JzW3hdICsgXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl07XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICB3aW5kb3dbdmVuZG9yc1t4XSArIFwiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl0gfHxcbiAgICAgICAgd2luZG93W3ZlbmRvcnNbeF0gKyBcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiXTtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYWxsYmFjaywgZWxlbWVudCkge1xuICAgICAgICB2YXIgY3VyclRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgICAgIHZhciBpZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpO1xuICAgICAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICAgICAgbGFzdFRpbWUgPSBjdXJyVGltZSArIHRpbWVUb0NhbGw7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICAgIH07XG4gICAgaWYgKCF3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUpXG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgIH07XG4gIH0pKCk7XG5cbiAgdmFyIGNhbnZhcyxcbiAgICBjdXJyZW50UHJvZ3Jlc3MsXG4gICAgc2hvd2luZyxcbiAgICBwcm9ncmVzc1RpbWVySWQgPSBudWxsLFxuICAgIGZhZGVUaW1lcklkID0gbnVsbCxcbiAgICBkZWxheVRpbWVySWQgPSBudWxsLFxuICAgIGFkZEV2ZW50ID0gZnVuY3Rpb24gKGVsZW0sIHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgIGlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICBlbHNlIGlmIChlbGVtLmF0dGFjaEV2ZW50KSBlbGVtLmF0dGFjaEV2ZW50KFwib25cIiArIHR5cGUsIGhhbmRsZXIpO1xuICAgICAgZWxzZSBlbGVtW1wib25cIiArIHR5cGVdID0gaGFuZGxlcjtcbiAgICB9LFxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBhdXRvUnVuOiB0cnVlLFxuICAgICAgYmFyVGhpY2tuZXNzOiAzLFxuICAgICAgYmFyQ29sb3JzOiB7XG4gICAgICAgIDA6IFwicmdiYSgyNiwgIDE4OCwgMTU2LCAuOSlcIixcbiAgICAgICAgXCIuMjVcIjogXCJyZ2JhKDUyLCAgMTUyLCAyMTksIC45KVwiLFxuICAgICAgICBcIi41MFwiOiBcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXG4gICAgICAgIFwiLjc1XCI6IFwicmdiYSgyMzAsIDEyNiwgMzQsICAuOSlcIixcbiAgICAgICAgXCIxLjBcIjogXCJyZ2JhKDIxMSwgODQsICAwLCAgIC45KVwiLFxuICAgICAgfSxcbiAgICAgIHNoYWRvd0JsdXI6IDEwLFxuICAgICAgc2hhZG93Q29sb3I6IFwicmdiYSgwLCAgIDAsICAgMCwgICAuNilcIixcbiAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICB9LFxuICAgIHJlcGFpbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW52YXMud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBvcHRpb25zLmJhclRoaWNrbmVzcyAqIDU7IC8vIG5lZWQgc3BhY2UgZm9yIHNoYWRvd1xuXG4gICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5zaGFkb3dCbHVyID0gb3B0aW9ucy5zaGFkb3dCbHVyO1xuICAgICAgY3R4LnNoYWRvd0NvbG9yID0gb3B0aW9ucy5zaGFkb3dDb2xvcjtcblxuICAgICAgdmFyIGxpbmVHcmFkaWVudCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCBjYW52YXMud2lkdGgsIDApO1xuICAgICAgZm9yICh2YXIgc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylcbiAgICAgICAgbGluZUdyYWRpZW50LmFkZENvbG9yU3RvcChzdG9wLCBvcHRpb25zLmJhckNvbG9yc1tzdG9wXSk7XG4gICAgICBjdHgubGluZVdpZHRoID0gb3B0aW9ucy5iYXJUaGlja25lc3M7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHgubW92ZVRvKDAsIG9wdGlvbnMuYmFyVGhpY2tuZXNzIC8gMik7XG4gICAgICBjdHgubGluZVRvKFxuICAgICAgICBNYXRoLmNlaWwoY3VycmVudFByb2dyZXNzICogY2FudmFzLndpZHRoKSxcbiAgICAgICAgb3B0aW9ucy5iYXJUaGlja25lc3MgLyAyXG4gICAgICApO1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGluZUdyYWRpZW50O1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH0sXG4gICAgY3JlYXRlQ2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgIHZhciBzdHlsZSA9IGNhbnZhcy5zdHlsZTtcbiAgICAgIHN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgc3R5bGUudG9wID0gc3R5bGUubGVmdCA9IHN0eWxlLnJpZ2h0ID0gc3R5bGUubWFyZ2luID0gc3R5bGUucGFkZGluZyA9IDA7XG4gICAgICBzdHlsZS56SW5kZXggPSAxMDAwMDE7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIGNhbnZhcy5jbGFzc0xpc3QuYWRkKG9wdGlvbnMuY2xhc3NOYW1lKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgIGFkZEV2ZW50KHdpbmRvdywgXCJyZXNpemVcIiwgcmVwYWludCk7XG4gICAgfSxcbiAgICB0b3BiYXIgPSB7XG4gICAgICBjb25maWc6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvcHRzKVxuICAgICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpIG9wdGlvbnNba2V5XSA9IG9wdHNba2V5XTtcbiAgICAgIH0sXG4gICAgICBzaG93OiBmdW5jdGlvbiAoZGVsYXkpIHtcbiAgICAgICAgaWYgKHNob3dpbmcpIHJldHVybjtcbiAgICAgICAgaWYgKGRlbGF5KSB7XG4gICAgICAgICAgaWYgKGRlbGF5VGltZXJJZCkgcmV0dXJuO1xuICAgICAgICAgIGRlbGF5VGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4gdG9wYmFyLnNob3coKSwgZGVsYXkpO1xuICAgICAgICB9IGVsc2UgIHtcbiAgICAgICAgICBzaG93aW5nID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZmFkZVRpbWVySWQgIT09IG51bGwpIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShmYWRlVGltZXJJZCk7XG4gICAgICAgICAgaWYgKCFjYW52YXMpIGNyZWF0ZUNhbnZhcygpO1xuICAgICAgICAgIGNhbnZhcy5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgICAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICB0b3BiYXIucHJvZ3Jlc3MoMCk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuYXV0b1J1bikge1xuICAgICAgICAgICAgKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgICAgICAgICAgIHByb2dyZXNzVGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgICAgICAgICAgIHRvcGJhci5wcm9ncmVzcyhcbiAgICAgICAgICAgICAgICBcIitcIiArIDAuMDUgKiBNYXRoLnBvdygxIC0gTWF0aC5zcXJ0KGN1cnJlbnRQcm9ncmVzcyksIDIpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAodG8pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0byA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGN1cnJlbnRQcm9ncmVzcztcbiAgICAgICAgaWYgKHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRvID1cbiAgICAgICAgICAgICh0by5pbmRleE9mKFwiK1wiKSA+PSAwIHx8IHRvLmluZGV4T2YoXCItXCIpID49IDBcbiAgICAgICAgICAgICAgPyBjdXJyZW50UHJvZ3Jlc3NcbiAgICAgICAgICAgICAgOiAwKSArIHBhcnNlRmxvYXQodG8pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRQcm9ncmVzcyA9IHRvID4gMSA/IDEgOiB0bztcbiAgICAgICAgcmVwYWludCgpO1xuICAgICAgICByZXR1cm4gY3VycmVudFByb2dyZXNzO1xuICAgICAgfSxcbiAgICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5VGltZXJJZCk7XG4gICAgICAgIGRlbGF5VGltZXJJZCA9IG51bGw7XG4gICAgICAgIGlmICghc2hvd2luZykgcmV0dXJuO1xuICAgICAgICBzaG93aW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChwcm9ncmVzc1RpbWVySWQgIT0gbnVsbCkge1xuICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShwcm9ncmVzc1RpbWVySWQpO1xuICAgICAgICAgIHByb2dyZXNzVGltZXJJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgICAgICAgaWYgKHRvcGJhci5wcm9ncmVzcyhcIisuMVwiKSA+PSAxKSB7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUub3BhY2l0eSAtPSAwLjA1O1xuICAgICAgICAgICAgaWYgKGNhbnZhcy5zdHlsZS5vcGFjaXR5IDw9IDAuMDUpIHtcbiAgICAgICAgICAgICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgZmFkZVRpbWVySWQgPSBudWxsO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZhZGVUaW1lcklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHRvcGJhcjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdG9wYmFyO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMudG9wYmFyID0gdG9wYmFyO1xuICB9XG59LmNhbGwodGhpcywgd2luZG93LCBkb2N1bWVudCkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBQb2x5ZmlsbEV2ZW50ID0gZXZlbnRDb25zdHJ1Y3RvcigpO1xuXG4gIGZ1bmN0aW9uIGV2ZW50Q29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHdpbmRvdy5DdXN0b21FdmVudDtcbiAgICAvLyBJRTw9OSBTdXBwb3J0XG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHtidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogZmFsc2UsIGRldGFpbDogdW5kZWZpbmVkfTtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICByZXR1cm4gZXZ0O1xuICAgIH1cbiAgICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuICAgIHJldHVybiBDdXN0b21FdmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkSGlkZGVuSW5wdXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgaW5wdXQubmFtZSA9IG5hbWU7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDbGljayhlbGVtZW50LCB0YXJnZXRNb2RpZmllcktleSkge1xuICAgIHZhciB0byA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10b1wiKSxcbiAgICAgICAgbWV0aG9kID0gYnVpbGRIaWRkZW5JbnB1dChcIl9tZXRob2RcIiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSksXG4gICAgICAgIGNzcmYgPSBidWlsZEhpZGRlbklucHV0KFwiX2NzcmZfdG9rZW5cIiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNzcmZcIikpLFxuICAgICAgICBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIiksXG4gICAgICAgIHN1Ym1pdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKSxcbiAgICAgICAgdGFyZ2V0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7XG5cbiAgICBmb3JtLm1ldGhvZCA9IChlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpID09PSBcImdldFwiKSA/IFwiZ2V0XCIgOiBcInBvc3RcIjtcbiAgICBmb3JtLmFjdGlvbiA9IHRvO1xuICAgIGZvcm0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgaWYgKHRhcmdldCkgZm9ybS50YXJnZXQgPSB0YXJnZXQ7XG4gICAgZWxzZSBpZiAodGFyZ2V0TW9kaWZpZXJLZXkpIGZvcm0udGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3NyZik7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChtZXRob2QpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybSk7XG5cbiAgICAvLyBJbnNlcnQgYSBidXR0b24gYW5kIGNsaWNrIGl0IGluc3RlYWQgb2YgdXNpbmcgYGZvcm0uc3VibWl0YFxuICAgIC8vIGJlY2F1c2UgdGhlIGBzdWJtaXRgIGZ1bmN0aW9uIGRvZXMgbm90IGVtaXQgYSBgc3VibWl0YCBldmVudC5cbiAgICBzdWJtaXQudHlwZSA9IFwic3VibWl0XCI7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChzdWJtaXQpO1xuICAgIHN1Ym1pdC5jbGljaygpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBlLnRhcmdldDtcbiAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSkge1xuICAgICAgdmFyIHBob2VuaXhMaW5rRXZlbnQgPSBuZXcgUG9seWZpbGxFdmVudCgncGhvZW5peC5saW5rLmNsaWNrJywge1xuICAgICAgICBcImJ1YmJsZXNcIjogdHJ1ZSwgXCJjYW5jZWxhYmxlXCI6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWVsZW1lbnQuZGlzcGF0Y2hFdmVudChwaG9lbml4TGlua0V2ZW50KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpKSB7XG4gICAgICAgIGhhbmRsZUNsaWNrKGVsZW1lbnQsIGUubWV0YUtleSB8fCBlLnNoaWZ0S2V5KTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSwgZmFsc2UpO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwaG9lbml4LmxpbmsuY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBtZXNzYWdlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jb25maXJtXCIpO1xuICAgIGlmKG1lc3NhZ2UgJiYgIXdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCBmYWxzZSk7XG59KSgpO1xuIiwgIi8vIHdyYXBzIHZhbHVlIGluIGNsb3N1cmUgb3IgcmV0dXJucyBjbG9zdXJlXG5leHBvcnQgbGV0IGNsb3N1cmUgPSAodmFsdWUpID0+IHtcbiAgaWYodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpe1xuICAgIHJldHVybiB2YWx1ZVxuICB9IGVsc2Uge1xuICAgIGxldCBjbG9zdXJlID0gZnVuY3Rpb24gKCl7IHJldHVybiB2YWx1ZSB9XG4gICAgcmV0dXJuIGNsb3N1cmVcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBnbG9iYWxTZWxmID0gdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogbnVsbFxuZXhwb3J0IGNvbnN0IHBoeFdpbmRvdyA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiBudWxsXG5leHBvcnQgY29uc3QgZ2xvYmFsID0gZ2xvYmFsU2VsZiB8fCBwaHhXaW5kb3cgfHwgZ2xvYmFsXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBhY2NlcHQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGlmKGdsb2JhbC5YRG9tYWluUmVxdWVzdCl7XG4gICAgICBsZXQgcmVxID0gbmV3IGdsb2JhbC5YRG9tYWluUmVxdWVzdCgpIC8vIElFOCwgSUU5XG4gICAgICByZXR1cm4gdGhpcy54ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZXEgPSBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KCkgLy8gSUU3KywgRmlyZWZveCwgQ2hyb21lLCBPcGVyYSwgU2FmYXJpXG4gICAgICByZXR1cm4gdGhpcy54aHJSZXF1ZXN0KHJlcSwgbWV0aG9kLCBlbmRQb2ludCwgYWNjZXB0LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gICAgcmV0dXJuIHJlcVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBhY2NlcHQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQsIHRydWUpXG4gICAgcmVxLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgYWNjZXB0KVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbClcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcblxubGV0IGFycmF5QnVmZmVyVG9CYXNlNjQgPSAoYnVmZmVyKSA9PiB7XG4gIGxldCBiaW5hcnkgPSBcIlwiXG4gIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcilcbiAgbGV0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGhcbiAgZm9yKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKXsgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pIH1cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb25nUG9sbCB7XG5cbiAgY29uc3RydWN0b3IoZW5kUG9pbnQpe1xuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5yZXFzID0gbmV3IFNldCgpXG4gICAgdGhpcy5hd2FpdGluZ0JhdGNoQWNrID0gZmFsc2VcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRCYXRjaFRpbWVyID0gbnVsbFxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxlciB0byBmaW5pc2ggc2V0dGluZyB1cCBvdXIgY2FsbGJhY2tzIGFuZCB0aW1lb3V0IHByb3BlcnRpZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9sbCgpLCAwKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICB0aGlzLmFqYXgoXCJHRVRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIG51bGwsICgpID0+IHRoaXMub250aW1lb3V0KCksIHJlc3AgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdHMgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHdlIGNvbGxlY3QgYWxsIHB1c2hlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBieVxuICAvLyBzZXRUaW1lb3V0IDAsIHdoaWNoIG9wdGltaXplcyBiYWNrLXRvLWJhY2sgcHJvY2VkdXJhbFxuICAvLyBwdXNoZXMgYWdhaW5zdCBhbiBlbXB0eSBidWZmZXJcblxuICBzZW5kKGJvZHkpe1xuICAgIGlmKHR5cGVvZihib2R5KSAhPT0gXCJzdHJpbmdcIil7IGJvZHkgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KGJvZHkpIH1cbiAgICBpZih0aGlzLmN1cnJlbnRCYXRjaCl7XG4gICAgICB0aGlzLmN1cnJlbnRCYXRjaC5wdXNoKGJvZHkpXG4gICAgfSBlbHNlIGlmKHRoaXMuYXdhaXRpbmdCYXRjaEFjayl7XG4gICAgICB0aGlzLmJhdGNoQnVmZmVyLnB1c2goYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50QmF0Y2ggPSBbYm9keV1cbiAgICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5jdXJyZW50QmF0Y2gpXG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gbnVsbFxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBiYXRjaFNlbmQobWVzc2FnZXMpe1xuICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IHRydWVcbiAgICB0aGlzLmFqYXgoXCJQT1NUXCIsIFwiYXBwbGljYXRpb24veC1uZGpzb25cIiwgbWVzc2FnZXMuam9pbihcIlxcblwiKSwgKCkgPT4gdGhpcy5vbmVycm9yKFwidGltZW91dFwiKSwgcmVzcCA9PiB7XG4gICAgICB0aGlzLmF3YWl0aW5nQmF0Y2hBY2sgPSBmYWxzZVxuICAgICAgaWYoIXJlc3AgfHwgcmVzcC5zdGF0dXMgIT09IDIwMCl7XG4gICAgICAgIHRoaXMub25lcnJvcihyZXNwICYmIHJlc3Auc3RhdHVzKVxuICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgZmFsc2UpXG4gICAgICB9IGVsc2UgaWYodGhpcy5iYXRjaEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5iYXRjaEJ1ZmZlcilcbiAgICAgICAgdGhpcy5iYXRjaEJ1ZmZlciA9IFtdXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNsb3NlKGNvZGUsIHJlYXNvbiwgd2FzQ2xlYW4pe1xuICAgIGZvcihsZXQgcmVxIG9mIHRoaXMucmVxcyl7IHJlcS5hYm9ydCgpIH1cbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBTT0NLRVRfU1RBVEVTLmNsb3NlZFxuICAgIGxldCBvcHRzID0gT2JqZWN0LmFzc2lnbih7Y29kZTogMTAwMCwgcmVhc29uOiB1bmRlZmluZWQsIHdhc0NsZWFuOiB0cnVlfSwge2NvZGUsIHJlYXNvbiwgd2FzQ2xlYW59KVxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmN1cnJlbnRCYXRjaFRpbWVyKVxuICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBudWxsXG4gICAgaWYodHlwZW9mKENsb3NlRXZlbnQpICE9PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgIHRoaXMub25jbG9zZShuZXcgQ2xvc2VFdmVudChcImNsb3NlXCIsIG9wdHMpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2xvc2Uob3B0cylcbiAgICB9XG4gIH1cblxuICBhamF4KG1ldGhvZCwgY29udGVudFR5cGUsIGJvZHksIG9uQ2FsbGVyVGltZW91dCwgY2FsbGJhY2spe1xuICAgIGxldCByZXFcbiAgICBsZXQgb250aW1lb3V0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZXFzLmRlbGV0ZShyZXEpXG4gICAgICBvbkNhbGxlclRpbWVvdXQoKVxuICAgIH1cbiAgICByZXEgPSBBamF4LnJlcXVlc3QobWV0aG9kLCB0aGlzLmVuZHBvaW50VVJMKCksIGNvbnRlbnRUeXBlLCBib2R5LCB0aGlzLnRpbWVvdXQsIG9udGltZW91dCwgcmVzcCA9PiB7XG4gICAgICB0aGlzLnJlcXMuZGVsZXRlKHJlcSlcbiAgICAgIGlmKHRoaXMuaXNBY3RpdmUoKSl7IGNhbGxiYWNrKHJlc3ApIH1cbiAgICB9KVxuICAgIHRoaXMucmVxcy5hZGQocmVxKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2xvc3VyZVxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBBamF4IGZyb20gXCIuL2FqYXhcIlxuaW1wb3J0IENoYW5uZWwgZnJvbSBcIi4vY2hhbm5lbFwiXG5pbXBvcnQgTG9uZ1BvbGwgZnJvbSBcIi4vbG9uZ3BvbGxcIlxuaW1wb3J0IFNlcmlhbGl6ZXIgZnJvbSBcIi4vc2VyaWFsaXplclwiXG5pbXBvcnQgVGltZXIgZnJvbSBcIi4vdGltZXJcIlxuXG4vKiogSW5pdGlhbGl6ZXMgdGhlIFNvY2tldCAqXG4gKlxuICogRm9yIElFOCBzdXBwb3J0IHVzZSBhbiBFUzUtc2hpbSAoaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmRQb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3M6Ly9leGFtcGxlLmNvbS9zb2NrZXRcImAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwid3NzOi8vZXhhbXBsZS5jb21cImBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXCIvc29ja2V0XCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLnRyYW5zcG9ydF0gLSBUaGUgV2Vic29ja2V0IFRyYW5zcG9ydCwgZm9yIGV4YW1wbGUgV2ViU29ja2V0IG9yIFBob2VuaXguTG9uZ1BvbGwuXG4gKlxuICogRGVmYXVsdHMgdG8gV2ViU29ja2V0IHdpdGggYXV0b21hdGljIExvbmdQb2xsIGZhbGxiYWNrIGlmIFdlYlNvY2tldCBpcyBub3QgZGVmaW5lZC5cbiAqIFRvIGZhbGxiYWNrIHRvIExvbmdQb2xsIHdoZW4gV2ViU29ja2V0IGF0dGVtcHRzIGZhaWwsIHVzZSBgbG9uZ1BvbGxGYWxsYmFja01zOiAyNTAwYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb25nUG9sbEZhbGxiYWNrTXNdIC0gVGhlIG1pbGxpc2Vjb25kIHRpbWUgdG8gYXR0ZW1wdCB0aGUgcHJpbWFyeSB0cmFuc3BvcnRcbiAqIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdGhlIExvbmdQb2xsIHRyYW5zcG9ydC4gRGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5kZWJ1Z10gLSBXaGVuIHRydWUsIGVuYWJsZXMgZGVidWcgbG9nZ2luZy4gRGVmYXVsdCBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5lbmNvZGVdIC0gVGhlIGZ1bmN0aW9uIHRvIGVuY29kZSBvdXRnb2luZyBtZXNzYWdlcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBKU09OIGVuY29kZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZGVjb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBkZWNvZGUgaW5jb21pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTjpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAocGF5bG9hZCwgY2FsbGJhY2spID0+IGNhbGxiYWNrKEpTT04ucGFyc2UocGF5bG9hZCkpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZW91dF0gLSBUaGUgZGVmYXVsdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB0cmlnZ2VyIHB1c2ggdGltZW91dHMuXG4gKlxuICogRGVmYXVsdHMgYERFRkFVTFRfVElNRU9VVGBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5oZWFydGJlYXRJbnRlcnZhbE1zXSAtIFRoZSBtaWxsaXNlYyBpbnRlcnZhbCB0byBzZW5kIGEgaGVhcnRiZWF0IG1lc3NhZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxpc2VjXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLlxuICpcbiAqIERlZmF1bHRzIHRvIHN0ZXBwZWQgYmFja29mZiBvZjpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbih0cmllcyl7XG4gKiAgIHJldHVybiBbMTAsIDUwLCAxMDAsIDE1MCwgMjAwLCAyNTAsIDUwMCwgMTAwMCwgMjAwMF1bdHJpZXMgLSAxXSB8fCA1MDAwXG4gKiB9XG4gKiBgYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnJlam9pbkFmdGVyTXNdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWlsbGlzZWNcbiAqIHJlam9pbiBpbnRlcnZhbCBmb3IgaW5kaXZpZHVhbCBjaGFubmVscy5cbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbih0cmllcyl7XG4gKiAgIHJldHVybiBbMTAwMCwgMjAwMCwgNTAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICogfVxuICogYGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmxvZ2dlcl0gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gZm9yIHNwZWNpYWxpemVkIGxvZ2dpbmcsIGllOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKGtpbmQsIG1zZywgZGF0YSkge1xuICogICBjb25zb2xlLmxvZyhgJHtraW5kfTogJHttc2d9YCwgZGF0YSlcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5sb25ncG9sbGVyVGltZW91dF0gLSBUaGUgbWF4aW11bSB0aW1lb3V0IG9mIGEgbG9uZyBwb2xsIEFKQVggcmVxdWVzdC5cbiAqXG4gKiBEZWZhdWx0cyB0byAyMHMgKGRvdWJsZSB0aGUgc2VydmVyIGxvbmcgcG9sbCB0aW1lcikuXG4gKlxuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gW29wdHMucGFyYW1zXSAtIFRoZSBvcHRpb25hbCBwYXJhbXMgdG8gcGFzcyB3aGVuIGNvbm5lY3RpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iaW5hcnlUeXBlXSAtIFRoZSBiaW5hcnkgdHlwZSB0byB1c2UgZm9yIGJpbmFyeSBXZWJTb2NrZXQgZnJhbWVzLlxuICpcbiAqIERlZmF1bHRzIHRvIFwiYXJyYXlidWZmZXJcIlxuICpcbiAqIEBwYXJhbSB7dnNufSBbb3B0cy52c25dIC0gVGhlIHNlcmlhbGl6ZXIncyBwcm90b2NvbCB2ZXJzaW9uIHRvIHNlbmQgb24gY29ubmVjdC5cbiAqXG4gKiBEZWZhdWx0cyB0byBERUZBVUxUX1ZTTi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMuc2Vzc2lvblN0b3JhZ2VdIC0gQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICogUGhvZW5peCB1c2VzIHNlc3Npb25TdG9yYWdlIGZvciBsb25ncG9sbCBmYWxsYmFjayBoaXN0b3J5LiBPdmVycmlkaW5nIHRoZSBzdG9yZSBpc1xuICogdXNlZnVsIHdoZW4gUGhvZW5peCB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICogaGFwcGVuIGlmIGEgc2l0ZSBsb2FkcyBhIGNyb3NzLWRvbWFpbiBjaGFubmVsIGluIGFuIGlmcmFtZS4gRXhhbXBsZSB1c2FnZTpcbiAqXG4gKiAgICAgY2xhc3MgSW5NZW1vcnlTdG9yYWdlIHtcbiAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gKiAgICAgICBnZXRJdGVtKGtleU5hbWUpIHsgcmV0dXJuIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB8fCBudWxsIH1cbiAqICAgICAgIHJlbW92ZUl0ZW0oa2V5TmFtZSkgeyBkZWxldGUgdGhpcy5zdG9yYWdlW2tleU5hbWVdIH1cbiAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICogICAgIH1cbiAqXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU29ja2V0IHtcbiAgY29uc3RydWN0b3IoZW5kUG9pbnQsIG9wdHMgPSB7fSl7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyA9IHtvcGVuOiBbXSwgY2xvc2U6IFtdLCBlcnJvcjogW10sIG1lc3NhZ2U6IFtdfVxuICAgIHRoaXMuY2hhbm5lbHMgPSBbXVxuICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5yZWYgPSAwXG4gICAgdGhpcy50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IERFRkFVTFRfVElNRU9VVFxuICAgIHRoaXMudHJhbnNwb3J0ID0gb3B0cy50cmFuc3BvcnQgfHwgZ2xvYmFsLldlYlNvY2tldCB8fCBMb25nUG9sbFxuICAgIHRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrID0gZmFsc2VcbiAgICB0aGlzLmxvbmdQb2xsRmFsbGJhY2tNcyA9IG9wdHMubG9uZ1BvbGxGYWxsYmFja01zXG4gICAgdGhpcy5mYWxsYmFja1RpbWVyID0gbnVsbFxuICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gb3B0cy5zZXNzaW9uU3RvcmFnZSB8fCAoZ2xvYmFsICYmIGdsb2JhbC5zZXNzaW9uU3RvcmFnZSlcbiAgICB0aGlzLmVzdGFibGlzaGVkQ29ubmVjdGlvbnMgPSAwXG4gICAgdGhpcy5kZWZhdWx0RW5jb2RlciA9IFNlcmlhbGl6ZXIuZW5jb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmRlZmF1bHREZWNvZGVyID0gU2VyaWFsaXplci5kZWNvZGUuYmluZChTZXJpYWxpemVyKVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgaWYoIXRoaXMubG9nZ2VyICYmIG9wdHMuZGVidWcpe1xuICAgICAgdGhpcy5sb2dnZXIgPSAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgfVxuICAgIHRoaXMubG9uZ3BvbGxlclRpbWVvdXQgPSBvcHRzLmxvbmdwb2xsZXJUaW1lb3V0IHx8IDIwMDAwXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKG9wdHMucGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gXG4gICAgdGhpcy52c24gPSBvcHRzLnZzbiB8fCBERUZBVUxUX1ZTTlxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLmNvbm5lY3QoKSlcbiAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgTG9uZ1BvbGwgdHJhbnNwb3J0IHJlZmVyZW5jZVxuICAgKi9cbiAgZ2V0TG9uZ1BvbGxUcmFuc3BvcnQoKXsgcmV0dXJuIExvbmdQb2xsIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgYW5kIHJlcGxhY2VzIHRoZSBhY3RpdmUgdHJhbnNwb3J0XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5ld1RyYW5zcG9ydCAtIFRoZSBuZXcgdHJhbnNwb3J0IGNsYXNzIHRvIGluc3RhbnRpYXRlXG4gICAqXG4gICAqL1xuICByZXBsYWNlVHJhbnNwb3J0KG5ld1RyYW5zcG9ydCl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IHRydWVcbiAgICBjbGVhclRpbWVvdXQodGhpcy5mYWxsYmFja1RpbWVyKVxuICAgIHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKVxuICAgIGlmKHRoaXMuY29ubil7XG4gICAgICB0aGlzLmNvbm4uY2xvc2UoKVxuICAgICAgdGhpcy5jb25uID0gbnVsbFxuICAgIH1cbiAgICB0aGlzLnRyYW5zcG9ydCA9IG5ld1RyYW5zcG9ydFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNvY2tldCBwcm90b2NvbFxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcHJvdG9jb2woKXsgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9eaHR0cHMvKSA/IFwid3NzXCIgOiBcIndzXCIgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIHNvY2tldCB1cmxcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVuZFBvaW50VVJMKCl7XG4gICAgbGV0IHVyaSA9IEFqYXguYXBwZW5kUGFyYW1zKFxuICAgICAgQWpheC5hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCwgdGhpcy5wYXJhbXMoKSksIHt2c246IHRoaXMudnNufSlcbiAgICBpZih1cmkuY2hhckF0KDApICE9PSBcIi9cIil7IHJldHVybiB1cmkgfVxuICAgIGlmKHVyaS5jaGFyQXQoMSkgPT09IFwiL1wiKXsgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06JHt1cml9YCB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5wcm90b2NvbCgpfTovLyR7bG9jYXRpb24uaG9zdH0ke3VyaX1gXG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldFxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Nsb3NlRXZlbnQjU3RhdHVzX2NvZGVzIGZvciB2YWxpZCBzdGF0dXMgY29kZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gT3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIHNvY2tldCBpcyBkaXNjb25uZWN0ZWQuXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gY29kZSAtIEEgc3RhdHVzIGNvZGUgZm9yIGRpc2Nvbm5lY3Rpb24gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIEEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIHRvIGRpc2Nvbm5lY3QuIChPcHRpb25hbClcbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IHRydWVcbiAgICBjbGVhclRpbWVvdXQodGhpcy5mYWxsYmFja1RpbWVyKVxuICAgIHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKVxuICAgIHRoaXMudGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uKXsgcmV0dXJuIH1cbiAgICBpZih0aGlzLmxvbmdQb2xsRmFsbGJhY2tNcyAmJiB0aGlzLnRyYW5zcG9ydCAhPT0gTG9uZ1BvbGwpe1xuICAgICAgdGhpcy5jb25uZWN0V2l0aEZhbGxiYWNrKExvbmdQb2xsLCB0aGlzLmxvbmdQb2xsRmFsbGJhY2tNcylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc3BvcnRDb25uZWN0KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9ncyB0aGUgbWVzc2FnZS4gT3ZlcnJpZGUgYHRoaXMubG9nZ2VyYCBmb3Igc3BlY2lhbGl6ZWQgbG9nZ2luZy4gbm9vcHMgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2luZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNnXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBsb2coa2luZCwgbXNnLCBkYXRhKXsgdGhpcy5sb2dnZXIgJiYgdGhpcy5sb2dnZXIoa2luZCwgbXNnLCBkYXRhKSB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIGxvZ2dlciBoYXMgYmVlbiBzZXQgb24gdGhpcyBzb2NrZXQuXG4gICAqL1xuICBoYXNMb2dnZXIoKXsgcmV0dXJuIHRoaXMubG9nZ2VyICE9PSBudWxsIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBvcGVuIGV2ZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZSBzb2NrZXQub25PcGVuKGZ1bmN0aW9uKCl7IGNvbnNvbGUuaW5mbyhcInRoZSBzb2NrZXQgd2FzIG9wZW5lZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25PcGVuKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm9wZW4ucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gY2xvc2UgZXZlbnRzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkNsb3NlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmNsb3NlLnB1c2goW3JlZiwgY2FsbGJhY2tdKVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIGVycm9yIGV2ZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZSBzb2NrZXQub25FcnJvcihmdW5jdGlvbihlcnJvcil7IGFsZXJ0KFwiQW4gZXJyb3Igb2NjdXJyZWRcIikgfSlcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uRXJyb3IoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gbWVzc2FnZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uTWVzc2FnZShjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlLnB1c2goW3JlZiwgY2FsbGJhY2tdKVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5ncyB0aGUgc2VydmVyIGFuZCBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBSVFQgaW4gbWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGluZyB3YXMgcHVzaGVkIG9yIGZhbHNlIGlmIHVuYWJsZSB0byBiZSBwdXNoZWQuXG4gICAqL1xuICBwaW5nKGNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5pc0Nvbm5lY3RlZCgpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIHRoaXMucHVzaCh7dG9waWM6IFwicGhvZW5peFwiLCBldmVudDogXCJoZWFydGJlYXRcIiwgcGF5bG9hZDoge30sIHJlZjogcmVmfSlcbiAgICBsZXQgb25Nc2dSZWYgPSB0aGlzLm9uTWVzc2FnZShtc2cgPT4ge1xuICAgICAgaWYobXNnLnJlZiA9PT0gcmVmKXtcbiAgICAgICAgdGhpcy5vZmYoW29uTXNnUmVmXSlcbiAgICAgICAgY2FsbGJhY2soRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgdHJhbnNwb3J0Q29ubmVjdCgpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCkpXG4gICAgdGhpcy5jb25uLmJpbmFyeVR5cGUgPSB0aGlzLmJpbmFyeVR5cGVcbiAgICB0aGlzLmNvbm4udGltZW91dCA9IHRoaXMubG9uZ3BvbGxlclRpbWVvdXRcbiAgICB0aGlzLmNvbm4ub25vcGVuID0gKCkgPT4gdGhpcy5vbkNvbm5PcGVuKClcbiAgICB0aGlzLmNvbm4ub25lcnJvciA9IGVycm9yID0+IHRoaXMub25Db25uRXJyb3IoZXJyb3IpXG4gICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGV2ZW50ID0+IHRoaXMub25Db25uTWVzc2FnZShldmVudClcbiAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGV2ZW50ID0+IHRoaXMub25Db25uQ2xvc2UoZXZlbnQpXG4gIH1cblxuICBnZXRTZXNzaW9uKGtleSl7IHJldHVybiB0aGlzLnNlc3Npb25TdG9yZSAmJiB0aGlzLnNlc3Npb25TdG9yZS5nZXRJdGVtKGtleSkgfVxuXG4gIHN0b3JlU2Vzc2lvbihrZXksIHZhbCl7IHRoaXMuc2Vzc2lvblN0b3JlICYmIHRoaXMuc2Vzc2lvblN0b3JlLnNldEl0ZW0oa2V5LCB2YWwpIH1cblxuICBjb25uZWN0V2l0aEZhbGxiYWNrKGZhbGxiYWNrVHJhbnNwb3J0LCBmYWxsYmFja1RocmVzaG9sZCA9IDI1MDApe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgbGV0IGVzdGFibGlzaGVkID0gZmFsc2VcbiAgICBsZXQgcHJpbWFyeVRyYW5zcG9ydCA9IHRydWVcbiAgICBsZXQgb3BlblJlZiwgZXJyb3JSZWZcbiAgICBsZXQgZmFsbGJhY2sgPSAocmVhc29uKSA9PiB7XG4gICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgZmFsbGluZyBiYWNrIHRvICR7ZmFsbGJhY2tUcmFuc3BvcnQubmFtZX0uLi5gLCByZWFzb24pXG4gICAgICB0aGlzLm9mZihbb3BlblJlZiwgZXJyb3JSZWZdKVxuICAgICAgcHJpbWFyeVRyYW5zcG9ydCA9IGZhbHNlXG4gICAgICB0aGlzLnJlcGxhY2VUcmFuc3BvcnQoZmFsbGJhY2tUcmFuc3BvcnQpXG4gICAgICB0aGlzLnRyYW5zcG9ydENvbm5lY3QoKVxuICAgIH1cbiAgICBpZih0aGlzLmdldFNlc3Npb24oYHBoeDpmYWxsYmFjazoke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9YCkpeyByZXR1cm4gZmFsbGJhY2soXCJtZW1vcml6ZWRcIikgfVxuXG4gICAgdGhpcy5mYWxsYmFja1RpbWVyID0gc2V0VGltZW91dChmYWxsYmFjaywgZmFsbGJhY2tUaHJlc2hvbGQpXG5cbiAgICBlcnJvclJlZiA9IHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgXCJlcnJvclwiLCByZWFzb24pXG4gICAgICBpZihwcmltYXJ5VHJhbnNwb3J0ICYmICFlc3RhYmxpc2hlZCl7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICAgIGZhbGxiYWNrKHJlYXNvbilcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMub25PcGVuKCgpID0+IHtcbiAgICAgIGVzdGFibGlzaGVkID0gdHJ1ZVxuICAgICAgaWYoIXByaW1hcnlUcmFuc3BvcnQpe1xuICAgICAgICAvLyBvbmx5IG1lbW9yaXplIExQIGlmIHdlIG5ldmVyIGNvbm5lY3RlZCB0byBwcmltYXJ5XG4gICAgICAgIGlmKCF0aGlzLnByaW1hcnlQYXNzZWRIZWFsdGhDaGVjayl7IHRoaXMuc3RvcmVTZXNzaW9uKGBwaHg6ZmFsbGJhY2s6JHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfWAsIFwidHJ1ZVwiKSB9XG4gICAgICAgIHJldHVybiB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgZXN0YWJsaXNoZWQgJHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfSBmYWxsYmFja2ApXG4gICAgICB9XG4gICAgICAvLyBpZiB3ZSd2ZSBlc3RhYmxpc2hlZCBwcmltYXJ5LCBnaXZlIHRoZSBmYWxsYmFjayBhIG5ldyBwZXJpb2QgdG8gYXR0ZW1wdCBwaW5nXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mYWxsYmFja1RpbWVyKVxuICAgICAgdGhpcy5mYWxsYmFja1RpbWVyID0gc2V0VGltZW91dChmYWxsYmFjaywgZmFsbGJhY2tUaHJlc2hvbGQpXG4gICAgICB0aGlzLnBpbmcocnR0ID0+IHtcbiAgICAgICAgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgXCJjb25uZWN0ZWQgdG8gcHJpbWFyeSBhZnRlclwiLCBydHQpXG4gICAgICAgIHRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrID0gdHJ1ZVxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5mYWxsYmFja1RpbWVyKVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMudHJhbnNwb3J0Q29ubmVjdCgpXG4gIH1cblxuICBjbGVhckhlYXJ0YmVhdHMoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lb3V0VGltZXIpXG4gIH1cblxuICBvbkNvbm5PcGVuKCl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgYCR7dGhpcy50cmFuc3BvcnQubmFtZX0gY29ubmVjdGVkIHRvICR7dGhpcy5lbmRQb2ludFVSTCgpfWApXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gZmFsc2VcbiAgICB0aGlzLmVzdGFibGlzaGVkQ29ubmVjdGlvbnMrK1xuICAgIHRoaXMuZmx1c2hTZW5kQnVmZmVyKClcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICB0aGlzLnJlc2V0SGVhcnRiZWF0KClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm9wZW4uZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiBjYWxsYmFjaygpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIGhlYXJ0YmVhdFRpbWVvdXQoKXtcbiAgICBpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSl7IHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIFwiaGVhcnRiZWF0IHRpbWVvdXQuIEF0dGVtcHRpbmcgdG8gcmUtZXN0YWJsaXNoIGNvbm5lY3Rpb25cIikgfVxuICAgICAgdGhpcy50cmlnZ2VyQ2hhbkVycm9yKClcbiAgICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgICB0aGlzLnRlYXJkb3duKCgpID0+IHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCksIFdTX0NMT1NFX05PUk1BTCwgXCJoZWFydGJlYXQgdGltZW91dFwiKVxuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5jb25uICYmIHRoaXMuY29ubi5za2lwSGVhcnRiZWF0KXsgcmV0dXJuIH1cbiAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsXG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdHMoKVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gIH1cblxuICB0ZWFyZG93bihjYWxsYmFjaywgY29kZSwgcmVhc29uKXtcbiAgICBpZighdGhpcy5jb25uKXtcbiAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfVxuXG4gICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZSgoKSA9PiB7XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5jb25uLm9ub3BlbiA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgICAgICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgICAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHdhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgIXRoaXMuY29ubi5idWZmZXJlZEFtb3VudCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoY2FsbGJhY2ssIHRyaWVzICsgMSlcbiAgICB9LCAxNTAgKiB0cmllcylcbiAgfVxuXG4gIHdhaXRGb3JTb2NrZXRDbG9zZWQoY2FsbGJhY2ssIHRyaWVzID0gMSl7XG4gICAgaWYodHJpZXMgPT09IDUgfHwgIXRoaXMuY29ubiB8fCB0aGlzLmNvbm4ucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5jbG9zZWQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JTb2NrZXRDbG9zZWQoY2FsbGJhY2ssIHRyaWVzICsgMSlcbiAgICB9LCAxNTAgKiB0cmllcylcbiAgfVxuXG4gIG9uQ29ubkNsb3NlKGV2ZW50KXtcbiAgICBsZXQgY2xvc2VDb2RlID0gZXZlbnQgJiYgZXZlbnQuY29kZVxuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIFwiY2xvc2VcIiwgZXZlbnQpXG4gICAgdGhpcy50cmlnZ2VyQ2hhbkVycm9yKClcbiAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgaWYoIXRoaXMuY2xvc2VXYXNDbGVhbiAmJiBjbG9zZUNvZGUgIT09IDEwMDApe1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKVxuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmNsb3NlLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soZXZlbnQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNvbm5FcnJvcihlcnJvcil7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgZXJyb3IpXG4gICAgbGV0IHRyYW5zcG9ydEJlZm9yZSA9IHRoaXMudHJhbnNwb3J0XG4gICAgbGV0IGVzdGFibGlzaGVkQmVmb3JlID0gdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IHtcbiAgICAgIGNhbGxiYWNrKGVycm9yLCB0cmFuc3BvcnRCZWZvcmUsIGVzdGFibGlzaGVkQmVmb3JlKVxuICAgIH0pXG4gICAgaWYodHJhbnNwb3J0QmVmb3JlID09PSB0aGlzLnRyYW5zcG9ydCB8fCBlc3RhYmxpc2hlZEJlZm9yZSA+IDApe1xuICAgICAgdGhpcy50cmlnZ2VyQ2hhbkVycm9yKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXJDaGFuRXJyb3IoKXtcbiAgICB0aGlzLmNoYW5uZWxzLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBpZighKGNoYW5uZWwuaXNFcnJvcmVkKCkgfHwgY2hhbm5lbC5pc0xlYXZpbmcoKSB8fCBjaGFubmVsLmlzQ2xvc2VkKCkpKXtcbiAgICAgICAgY2hhbm5lbC50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmVycm9yKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGNvbm5lY3Rpb25TdGF0ZSgpe1xuICAgIHN3aXRjaCh0aGlzLmNvbm4gJiYgdGhpcy5jb25uLnJlYWR5U3RhdGUpe1xuICAgICAgY2FzZSBTT0NLRVRfU1RBVEVTLmNvbm5lY3Rpbmc6IHJldHVybiBcImNvbm5lY3RpbmdcIlxuICAgICAgY2FzZSBTT0NLRVRfU1RBVEVTLm9wZW46IHJldHVybiBcIm9wZW5cIlxuICAgICAgY2FzZSBTT0NLRVRfU1RBVEVTLmNsb3Npbmc6IHJldHVybiBcImNsb3NpbmdcIlxuICAgICAgZGVmYXVsdDogcmV0dXJuIFwiY2xvc2VkXCJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Nvbm5lY3RlZCgpeyByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdGUoKSA9PT0gXCJvcGVuXCIgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge0NoYW5uZWx9XG4gICAqL1xuICByZW1vdmUoY2hhbm5lbCl7XG4gICAgdGhpcy5vZmYoY2hhbm5lbC5zdGF0ZUNoYW5nZVJlZnMpXG4gICAgdGhpcy5jaGFubmVscyA9IHRoaXMuY2hhbm5lbHMuZmlsdGVyKGMgPT4gYyAhPT0gY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgIHJlZ2lzdHJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7cmVmc30gLSBsaXN0IG9mIHJlZnMgcmV0dXJuZWQgYnkgY2FsbHMgdG9cbiAgICogICAgICAgICAgICAgICAgIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgXG4gICAqL1xuICBvZmYocmVmcyl7XG4gICAgZm9yKGxldCBrZXkgaW4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyl7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0gPSB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0uZmlsdGVyKChbcmVmXSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVmcy5pbmRleE9mKHJlZikgPT09IC0xXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgYSBuZXcgY2hhbm5lbCBmb3IgdGhlIGdpdmVuIHRvcGljXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2hhblBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtDaGFubmVsfVxuICAgKi9cbiAgY2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcyA9IHt9KXtcbiAgICBsZXQgY2hhbiA9IG5ldyBDaGFubmVsKHRvcGljLCBjaGFuUGFyYW1zLCB0aGlzKVxuICAgIHRoaXMuY2hhbm5lbHMucHVzaChjaGFuKVxuICAgIHJldHVybiBjaGFuXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIHB1c2goZGF0YSl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSl7XG4gICAgICBsZXQge3RvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luX3JlZn0gPSBkYXRhXG4gICAgICB0aGlzLmxvZyhcInB1c2hcIiwgYCR7dG9waWN9ICR7ZXZlbnR9ICgke2pvaW5fcmVmfSwgJHtyZWZ9KWAsIHBheWxvYWQpXG4gICAgfVxuXG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtcbiAgICAgIHRoaXMuZW5jb2RlKGRhdGEsIHJlc3VsdCA9PiB0aGlzLmNvbm4uc2VuZChyZXN1bHQpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaCgoKSA9PiB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmV4dCBtZXNzYWdlIHJlZiwgYWNjb3VudGluZyBmb3Igb3ZlcmZsb3dzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBtYWtlUmVmKCl7XG4gICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmICsgMVxuICAgIGlmKG5ld1JlZiA9PT0gdGhpcy5yZWYpeyB0aGlzLnJlZiA9IDAgfSBlbHNlIHsgdGhpcy5yZWYgPSBuZXdSZWYgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVmLnRvU3RyaW5nKClcbiAgfVxuXG4gIHNlbmRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgJiYgIXRoaXMuaXNDb25uZWN0ZWQoKSl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnB1c2goe3RvcGljOiBcInBob2VuaXhcIiwgZXZlbnQ6IFwiaGVhcnRiZWF0XCIsIHBheWxvYWQ6IHt9LCByZWY6IHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZn0pXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGVhcnRiZWF0VGltZW91dCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gIH1cblxuICBmbHVzaFNlbmRCdWZmZXIoKXtcbiAgICBpZih0aGlzLmlzQ29ubmVjdGVkKCkgJiYgdGhpcy5zZW5kQnVmZmVyLmxlbmd0aCA+IDApe1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soKSlcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdXG4gICAgfVxuICB9XG5cbiAgb25Db25uTWVzc2FnZShyYXdNZXNzYWdlKXtcbiAgICB0aGlzLmRlY29kZShyYXdNZXNzYWdlLmRhdGEsIG1zZyA9PiB7XG4gICAgICBsZXQge3RvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luX3JlZn0gPSBtc2dcbiAgICAgIGlmKHJlZiAmJiByZWYgPT09IHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZil7XG4gICAgICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInJlY2VpdmVcIiwgYCR7cGF5bG9hZC5zdGF0dXMgfHwgXCJcIn0gJHt0b3BpY30gJHtldmVudH0gJHtyZWYgJiYgXCIoXCIgKyByZWYgKyBcIilcIiB8fCBcIlwifWAsIHBheWxvYWQpXG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLmNoYW5uZWxzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbaV1cbiAgICAgICAgaWYoIWNoYW5uZWwuaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luX3JlZikpeyBjb250aW51ZSB9XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luX3JlZilcbiAgICAgIH1cblxuICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGxldCBbLCBjYWxsYmFja10gPSB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2VbaV1cbiAgICAgICAgY2FsbGJhY2sobXNnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBsZWF2ZU9wZW5Ub3BpYyh0b3BpYyl7XG4gICAgbGV0IGR1cENoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmZpbmQoYyA9PiBjLnRvcGljID09PSB0b3BpYyAmJiAoYy5pc0pvaW5lZCgpIHx8IGMuaXNKb2luaW5nKCkpKVxuICAgIGlmKGR1cENoYW5uZWwpe1xuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgYGxlYXZpbmcgZHVwbGljYXRlIHRvcGljIFwiJHt0b3BpY31cImApXG4gICAgICBkdXBDaGFubmVsLmxlYXZlKClcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgQ09OU0VDVVRJVkVfUkVMT0FEUyA9IFwiY29uc2VjdXRpdmUtcmVsb2Fkc1wiXG5leHBvcnQgY29uc3QgTUFYX1JFTE9BRFMgPSAxMFxuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUlOID0gNTAwMFxuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUFYID0gMTAwMDBcbmV4cG9ydCBjb25zdCBGQUlMU0FGRV9KSVRURVIgPSAzMDAwMFxuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLCBcInBoeC1rZXl1cC1sb2FkaW5nXCIsIFwicGh4LWJsdXItbG9hZGluZ1wiLCBcInBoeC1mb2N1cy1sb2FkaW5nXCIsXG4gIFwicGh4LWhvb2stbG9hZGluZ1wiXG5dXG5leHBvcnQgY29uc3QgUEhYX0NPTVBPTkVOVCA9IFwiZGF0YS1waHgtY29tcG9uZW50XCJcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJBQ0tfU1RBVElDID0gXCJ0cmFjay1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSU5LX1NUQVRFID0gXCJkYXRhLXBoeC1saW5rLXN0YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQURJTkcgPSBcImRhdGEtcGh4LXJlZi1sb2FkaW5nXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVGX1NSQyA9IFwiZGF0YS1waHgtcmVmLXNyY1wiXG5leHBvcnQgY29uc3QgUEhYX1JFRl9MT0NLID0gXCJkYXRhLXBoeC1yZWYtbG9ja1wiXG5leHBvcnQgY29uc3QgUEhYX1RSQUNLX1VQTE9BRFMgPSBcInRyYWNrLXVwbG9hZHNcIlxuZXhwb3J0IGNvbnN0IFBIWF9VUExPQURfUkVGID0gXCJkYXRhLXBoeC11cGxvYWQtcmVmXCJcbmV4cG9ydCBjb25zdCBQSFhfUFJFRkxJR0hURURfUkVGUyA9IFwiZGF0YS1waHgtcHJlZmxpZ2h0ZWQtcmVmc1wiXG5leHBvcnQgY29uc3QgUEhYX0RPTkVfUkVGUyA9IFwiZGF0YS1waHgtZG9uZS1yZWZzXCJcbmV4cG9ydCBjb25zdCBQSFhfRFJPUF9UQVJHRVQgPSBcImRyb3AtdGFyZ2V0XCJcbmV4cG9ydCBjb25zdCBQSFhfQUNUSVZFX0VOVFJZX1JFRlMgPSBcImRhdGEtcGh4LWFjdGl2ZS1yZWZzXCJcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9GSUxFX1VQREFURUQgPSBcInBoeDpsaXZlLWZpbGU6dXBkYXRlZFwiXG5leHBvcnQgY29uc3QgUEhYX1NLSVAgPSBcImRhdGEtcGh4LXNraXBcIlxuZXhwb3J0IGNvbnN0IFBIWF9NQUdJQ19JRCA9IFwiZGF0YS1waHgtaWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9QUlVORSA9IFwiZGF0YS1waHgtcHJ1bmVcIlxuZXhwb3J0IGNvbnN0IFBIWF9DT05ORUNURURfQ0xBU1MgPSBcInBoeC1jb25uZWN0ZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9MT0FESU5HX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX0VSUk9SX0NMQVNTID0gXCJwaHgtZXJyb3JcIlxuZXhwb3J0IGNvbnN0IFBIWF9DTElFTlRfRVJST1JfQ0xBU1MgPSBcInBoeC1jbGllbnQtZXJyb3JcIlxuZXhwb3J0IGNvbnN0IFBIWF9TRVJWRVJfRVJST1JfQ0xBU1MgPSBcInBoeC1zZXJ2ZXItZXJyb3JcIlxuZXhwb3J0IGNvbnN0IFBIWF9QQVJFTlRfSUQgPSBcImRhdGEtcGh4LXBhcmVudC1pZFwiXG5leHBvcnQgY29uc3QgUEhYX01BSU4gPSBcImRhdGEtcGh4LW1haW5cIlxuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCJcbmV4cG9ydCBjb25zdCBQSFhfVklFV1BPUlRfVE9QID0gXCJ2aWV3cG9ydC10b3BcIlxuZXhwb3J0IGNvbnN0IFBIWF9WSUVXUE9SVF9CT1RUT00gPSBcInZpZXdwb3J0LWJvdHRvbVwiXG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiXG5leHBvcnQgY29uc3QgUEhYX0hBU19GT0NVU0VEID0gXCJwaHgtaGFzLWZvY3VzZWRcIlxuZXhwb3J0IGNvbnN0IEZPQ1VTQUJMRV9JTlBVVFMgPSBbXCJ0ZXh0XCIsIFwidGV4dGFyZWFcIiwgXCJudW1iZXJcIiwgXCJlbWFpbFwiLCBcInBhc3N3b3JkXCIsIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZGF0ZVwiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcImNvbG9yXCIsIFwicmFuZ2VcIl1cbmV4cG9ydCBjb25zdCBDSEVDS0FCTEVfSU5QVVRTID0gW1wiY2hlY2tib3hcIiwgXCJyYWRpb1wiXVxuZXhwb3J0IGNvbnN0IFBIWF9IQVNfU1VCTUlUVEVEID0gXCJwaHgtaGFzLXN1Ym1pdHRlZFwiXG5leHBvcnQgY29uc3QgUEhYX1NFU1NJT04gPSBcImRhdGEtcGh4LXNlc3Npb25cIlxuZXhwb3J0IGNvbnN0IFBIWF9WSUVXX1NFTEVDVE9SID0gYFske1BIWF9TRVNTSU9OfV1gXG5leHBvcnQgY29uc3QgUEhYX1NUSUNLWSA9IFwiZGF0YS1waHgtc3RpY2t5XCJcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9SRUFET05MWSA9IFwiZGF0YS1waHgtcmVhZG9ubHlcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFRCA9IFwiZGF0YS1waHgtZGlzYWJsZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFID0gXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiXG5leHBvcnQgY29uc3QgUEhYX0hPT0sgPSBcImhvb2tcIlxuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIlxuZXhwb3J0IGNvbnN0IFBIWF9USFJPVFRMRSA9IFwidGhyb3R0bGVcIlxuZXhwb3J0IGNvbnN0IFBIWF9VUERBVEUgPSBcInVwZGF0ZVwiXG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTSA9IFwic3RyZWFtXCJcbmV4cG9ydCBjb25zdCBQSFhfU1RSRUFNX1JFRiA9IFwiZGF0YS1waHgtc3RyZWFtXCJcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIlxuZXhwb3J0IGNvbnN0IFBIWF9QUklWQVRFID0gXCJwaHhQcml2YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfQVVUT19SRUNPVkVSID0gXCJhdXRvLXJlY292ZXJcIlxuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCJcbmV4cG9ydCBjb25zdCBQSFhfTFZfUFJPRklMRSA9IFwicGh4OmxpdmUtc29ja2V0OnByb2ZpbGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX0xWX0xBVEVOQ1lfU0lNID0gXCJwaHg6bGl2ZS1zb2NrZXQ6bGF0ZW5jeS1zaW1cIlxuZXhwb3J0IGNvbnN0IFBIWF9QUk9HUkVTUyA9IFwicHJvZ3Jlc3NcIlxuZXhwb3J0IGNvbnN0IFBIWF9NT1VOVEVEID0gXCJtb3VudGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVMT0FEX1NUQVRVUyA9IFwiX19waG9lbml4X3JlbG9hZF9zdGF0dXNfX1wiXG5leHBvcnQgY29uc3QgTE9BREVSX1RJTUVPVVQgPSAxXG5leHBvcnQgY29uc3QgTUFYX0NISUxEX0pPSU5fQVRURU1QVFMgPSAzXG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMFxuZXhwb3J0IGNvbnN0IEJJTkRJTkdfUFJFRklYID0gXCJwaHgtXCJcbmV4cG9ydCBjb25zdCBQVVNIX1RJTUVPVVQgPSAzMDAwMFxuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCJcbmV4cG9ydCBjb25zdCBSRVNQT05TRV9VUkxfSEVBREVSID0gXCJ4LXJlc3BvbnNlLXVybFwiXG5leHBvcnQgY29uc3QgREVCT1VOQ0VfVFJJR0dFUiA9IFwiZGVib3VuY2UtdHJpZ2dlclwiXG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIlxuZXhwb3J0IGNvbnN0IERFQk9VTkNFX1BSRVZfS0VZID0gXCJkZWJvdW5jZS1wcmV2LWtleVwiXG5leHBvcnQgY29uc3QgREVGQVVMVFMgPSB7XG4gIGRlYm91bmNlOiAzMDAsXG4gIHRocm90dGxlOiAzMDBcbn1cbmV4cG9ydCBjb25zdCBQSFhfUEVORElOR19BVFRSUyA9IFtQSFhfUkVGX0xPQURJTkcsIFBIWF9SRUZfU1JDLCBQSFhfUkVGX0xPQ0tdXG4vLyBSZW5kZXJlZFxuZXhwb3J0IGNvbnN0IERZTkFNSUNTID0gXCJkXCJcbmV4cG9ydCBjb25zdCBTVEFUSUMgPSBcInNcIlxuZXhwb3J0IGNvbnN0IFJPT1QgPSBcInJcIlxuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIlxuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiXG5leHBvcnQgY29uc3QgUkVQTFkgPSBcInJcIlxuZXhwb3J0IGNvbnN0IFRJVExFID0gXCJ0XCJcbmV4cG9ydCBjb25zdCBURU1QTEFURVMgPSBcInBcIlxuZXhwb3J0IGNvbnN0IFNUUkVBTSA9IFwic3RyZWFtXCJcbiIsICJpbXBvcnQge1xuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVudHJ5VXBsb2FkZXIge1xuICBjb25zdHJ1Y3RvcihlbnRyeSwgY2h1bmtTaXplLCBsaXZlU29ja2V0KXtcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0XG4gICAgdGhpcy5lbnRyeSA9IGVudHJ5XG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemVcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsXG4gICAgdGhpcy5lcnJvcmVkID0gZmFsc2VcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwgPSBsaXZlU29ja2V0LmNoYW5uZWwoYGx2dToke2VudHJ5LnJlZn1gLCB7dG9rZW46IGVudHJ5Lm1ldGFkYXRhKCl9KVxuICB9XG5cbiAgZXJyb3IocmVhc29uKXtcbiAgICBpZih0aGlzLmVycm9yZWQpeyByZXR1cm4gfVxuICAgIHRoaXMudXBsb2FkQ2hhbm5lbC5sZWF2ZSgpXG4gICAgdGhpcy5lcnJvcmVkID0gdHJ1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpXG4gICAgdGhpcy5lbnRyeS5lcnJvcihyZWFzb24pXG4gIH1cblxuICB1cGxvYWQoKXtcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwub25FcnJvcihyZWFzb24gPT4gdGhpcy5lcnJvcihyZWFzb24pKVxuICAgIHRoaXMudXBsb2FkQ2hhbm5lbC5qb2luKClcbiAgICAgIC5yZWNlaXZlKFwib2tcIiwgX2RhdGEgPT4gdGhpcy5yZWFkTmV4dENodW5rKCkpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIHJlYXNvbiA9PiB0aGlzLmVycm9yKHJlYXNvbikpXG4gIH1cblxuICBpc0RvbmUoKXsgcmV0dXJuIHRoaXMub2Zmc2V0ID49IHRoaXMuZW50cnkuZmlsZS5zaXplIH1cblxuICByZWFkTmV4dENodW5rKCl7XG4gICAgbGV0IHJlYWRlciA9IG5ldyB3aW5kb3cuRmlsZVJlYWRlcigpXG4gICAgbGV0IGJsb2IgPSB0aGlzLmVudHJ5LmZpbGUuc2xpY2UodGhpcy5vZmZzZXQsIHRoaXMuY2h1bmtTaXplICsgdGhpcy5vZmZzZXQpXG4gICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICBpZihlLnRhcmdldC5lcnJvciA9PT0gbnVsbCl7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IGUudGFyZ2V0LnJlc3VsdC5ieXRlTGVuZ3RoXG4gICAgICAgIHRoaXMucHVzaENodW5rKGUudGFyZ2V0LnJlc3VsdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcihcIlJlYWQgZXJyb3I6IFwiICsgZS50YXJnZXQuZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICB9XG5cbiAgcHVzaENodW5rKGNodW5rKXtcbiAgICBpZighdGhpcy51cGxvYWRDaGFubmVsLmlzSm9pbmVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMudXBsb2FkQ2hhbm5lbC5wdXNoKFwiY2h1bmtcIiwgY2h1bmspXG4gICAgICAucmVjZWl2ZShcIm9rXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5lbnRyeS5wcm9ncmVzcygodGhpcy5vZmZzZXQgLyB0aGlzLmVudHJ5LmZpbGUuc2l6ZSkgKiAxMDApXG4gICAgICAgIGlmKCF0aGlzLmlzRG9uZSgpKXtcbiAgICAgICAgICB0aGlzLmNodW5rVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVhZE5leHRDaHVuaygpLCB0aGlzLmxpdmVTb2NrZXQuZ2V0TGF0ZW5jeVNpbSgpIHx8IDApXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsICh7cmVhc29ufSkgPT4gdGhpcy5lcnJvcihyZWFzb24pKVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgUEhYX1ZJRVdfU0VMRUNUT1Jcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIlxuXG5leHBvcnQgbGV0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopXG5cbmV4cG9ydCBsZXQgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGxldCB0eXBlID0gdHlwZW9mKGNpZClcbiAgcmV0dXJuIHR5cGUgPT09IFwibnVtYmVyXCIgfHwgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgL14oMHxbMS05XVxcZCopJC8udGVzdChjaWQpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RHVwbGljYXRlSWRzKCl7XG4gIGxldCBpZHMgPSBuZXcgU2V0KClcbiAgbGV0IGVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIipbaWRdXCIpXG4gIGZvcihsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcbiAgICBpZihpZHMuaGFzKGVsZW1zW2ldLmlkKSl7XG4gICAgICBjb25zb2xlLmVycm9yKGBNdWx0aXBsZSBJRHMgZGV0ZWN0ZWQ6ICR7ZWxlbXNbaV0uaWR9LiBFbnN1cmUgdW5pcXVlIGVsZW1lbnQgaWRzLmApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcy5hZGQoZWxlbXNbaV0uaWQpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBsZXQgZGVidWcgPSAodmlldywga2luZCwgbXNnLCBvYmopID0+IHtcbiAgaWYodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpe1xuICAgIGNvbnNvbGUubG9nKGAke3ZpZXcuaWR9ICR7a2luZH06ICR7bXNnfSAtIGAsIG9iailcbiAgfVxufVxuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGxldCBjbG9zdXJlID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiID8gdmFsIDogZnVuY3Rpb24gKCl7IHJldHVybiB2YWwgfVxuXG5leHBvcnQgbGV0IGNsb25lID0gKG9iaikgPT4geyByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKSB9XG5cbmV4cG9ydCBsZXQgY2xvc2VzdFBoeEJpbmRpbmcgPSAoZWwsIGJpbmRpbmcsIGJvcmRlckVsKSA9PiB7XG4gIGRvIHtcbiAgICBpZihlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSAmJiAhZWwuZGlzYWJsZWQpeyByZXR1cm4gZWwgfVxuICAgIGVsID0gZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlXG4gIH0gd2hpbGUoZWwgIT09IG51bGwgJiYgZWwubm9kZVR5cGUgPT09IDEgJiYgISgoYm9yZGVyRWwgJiYgYm9yZGVyRWwuaXNTYW1lTm9kZShlbCkpIHx8IGVsLm1hdGNoZXMoUEhYX1ZJRVdfU0VMRUNUT1IpKSlcbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGxldCBpc09iamVjdCA9IChvYmopID0+IHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmICEob2JqIGluc3RhbmNlb2YgQXJyYXkpXG59XG5cbmV4cG9ydCBsZXQgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PiBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMilcblxuZXhwb3J0IGxldCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IobGV0IHggaW4gb2JqKXsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGxldCBtYXliZSA9IChlbCwgY2FsbGJhY2spID0+IGVsICYmIGNhbGxiYWNrKGVsKVxuXG5leHBvcnQgbGV0IGNoYW5uZWxVcGxvYWRlciA9IGZ1bmN0aW9uIChlbnRyaWVzLCBvbkVycm9yLCByZXNwLCBsaXZlU29ja2V0KXtcbiAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICBsZXQgZW50cnlVcGxvYWRlciA9IG5ldyBFbnRyeVVwbG9hZGVyKGVudHJ5LCByZXNwLmNvbmZpZy5jaHVua19zaXplLCBsaXZlU29ja2V0KVxuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKClcbiAgfSlcbn1cbiIsICJsZXQgQnJvd3NlciA9IHtcbiAgY2FuUHVzaFN0YXRlKCl7IHJldHVybiAodHlwZW9mIChoaXN0b3J5LnB1c2hTdGF0ZSkgIT09IFwidW5kZWZpbmVkXCIpIH0sXG5cbiAgZHJvcExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpe1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSlcbiAgfSxcblxuICB1cGRhdGVMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5LCBpbml0aWFsLCBmdW5jKXtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSlcbiAgICBsZXQga2V5ID0gdGhpcy5sb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSlcbiAgICBsZXQgbmV3VmFsID0gY3VycmVudCA9PT0gbnVsbCA/IGluaXRpYWwgOiBmdW5jKGN1cnJlbnQpXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShuZXdWYWwpKVxuICAgIHJldHVybiBuZXdWYWxcbiAgfSxcblxuICBnZXRMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5KXtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSkpXG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5jYW5QdXNoU3RhdGUoKSl7IHJldHVybiB9XG4gICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksIFwiXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9LFxuXG4gIHB1c2hTdGF0ZShraW5kLCBtZXRhLCB0byl7XG4gICAgaWYodGhpcy5jYW5QdXNoU3RhdGUoKSl7XG4gICAgICBpZih0byAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYpe1xuICAgICAgICBpZihtZXRhLnR5cGUgPT0gXCJyZWRpcmVjdFwiICYmIG1ldGEuc2Nyb2xsKXtcbiAgICAgICAgICAvLyBJZiB3ZSdyZSByZWRpcmVjdGluZyBzdG9yZSB0aGUgY3VycmVudCBzY3JvbGxZIGZvciB0aGUgY3VycmVudCBoaXN0b3J5IHN0YXRlLlxuICAgICAgICAgIGxldCBjdXJyZW50U3RhdGUgPSBoaXN0b3J5LnN0YXRlIHx8IHt9XG4gICAgICAgICAgY3VycmVudFN0YXRlLnNjcm9sbCA9IG1ldGEuc2Nyb2xsXG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBtZXRhLnNjcm9sbCAvLyBPbmx5IHN0b3JlIHRoZSBzY3JvbGwgaW4gdGhlIHJlZGlyZWN0IGNhc2UuXG4gICAgICAgIGhpc3Rvcnlba2luZCArIFwiU3RhdGVcIl0obWV0YSwgXCJcIiwgdG8gfHwgbnVsbCkgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbmF2aWdhdGUsIHdlJ2QgY2FsbCBwdXNoU3RhdGUgaW1tZWRpYXRlbHkgYmVmb3JlIHBhdGNoaW5nIHRoZSBET00sXG4gICAgICAgIC8vIGp1bXBpbmcgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLCBlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIERPTSBwYXRjaCkgYW5kIG9ubHkgdGhlbiB0cnlcbiAgICAgICAgLy8gdG8gc2Nyb2xsIHRvIHRoZSBoYXNoRWxcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgbGV0IGhhc2hFbCA9IHRoaXMuZ2V0SGFzaFRhcmdldEVsKHdpbmRvdy5sb2NhdGlvbi5oYXNoKVxuICBcbiAgICAgICAgICBpZihoYXNoRWwpe1xuICAgICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgICB9IGVsc2UgaWYobWV0YS50eXBlID09PSBcInJlZGlyZWN0XCIpe1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWRpcmVjdCh0bylcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlLCBtYXhBZ2VTZWNvbmRzKXtcbiAgICBsZXQgZXhwaXJlcyA9IHR5cGVvZihtYXhBZ2VTZWNvbmRzKSA9PT0gXCJudW1iZXJcIiA/IGAgbWF4LWFnZT0ke21heEFnZVNlY29uZHN9O2AgOiBcIlwiXG4gICAgZG9jdW1lbnQuY29va2llID0gYCR7bmFtZX09JHt2YWx1ZX07JHtleHBpcmVzfSBwYXRoPS9gXG4gIH0sXG5cbiAgZ2V0Q29va2llKG5hbWUpe1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShuZXcgUmVnRXhwKGAoPzooPzpefC4qO1xccyopJHtuYW1lfVxccypcXD1cXHMqKFteO10qKS4qJCl8Xi4qJGApLCBcIiQxXCIpXG4gIH0sXG5cbiAgZGVsZXRlQ29va2llKG5hbWUpe1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgbWF4LWFnZT0tMTsgcGF0aD0vYFxuICB9LFxuXG4gIHJlZGlyZWN0KHRvVVJMLCBmbGFzaCl7XG4gICAgaWYoZmxhc2gpeyB0aGlzLnNldENvb2tpZShcIl9fcGhvZW5peF9mbGFzaF9fXCIsIGZsYXNoLCA2MCkgfVxuICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRvVVJMXG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpeyByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gIH0sXG5cbiAgZ2V0SGFzaFRhcmdldEVsKG1heWJlSGFzaCl7XG4gICAgbGV0IGhhc2ggPSBtYXliZUhhc2gudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSlcbiAgICBpZihoYXNoID09PSBcIlwiKXsgcmV0dXJuIH1cbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGFzaCkgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQnJvd3NlclxuIiwgImxldCBBUklBID0ge1xuICBhbnlPZihpbnN0YW5jZSwgY2xhc3Nlcyl7IHJldHVybiBjbGFzc2VzLmZpbmQobmFtZSA9PiBpbnN0YW5jZSBpbnN0YW5jZW9mIG5hbWUpIH0sXG5cbiAgaXNGb2N1c2FibGUoZWwsIGludGVyYWN0aXZlT25seSl7XG4gICAgcmV0dXJuKFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWwucmVsICE9PSBcImlnbm9yZVwiKSB8fFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFyZWFFbGVtZW50ICYmIGVsLmhyZWYgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICghZWwuZGlzYWJsZWQgJiYgKHRoaXMuYW55T2YoZWwsIFtIVE1MSW5wdXRFbGVtZW50LCBIVE1MU2VsZWN0RWxlbWVudCwgSFRNTFRleHRBcmVhRWxlbWVudCwgSFRNTEJ1dHRvbkVsZW1lbnRdKSkpIHx8XG4gICAgICAoZWwgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkgfHxcbiAgICAgIChlbC50YWJJbmRleCA+IDAgfHwgKCFpbnRlcmFjdGl2ZU9ubHkgJiYgZWwuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikgIT09IG51bGwgJiYgZWwuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgIT09IFwidHJ1ZVwiKSlcbiAgICApXG4gIH0sXG5cbiAgYXR0ZW1wdEZvY3VzKGVsLCBpbnRlcmFjdGl2ZU9ubHkpe1xuICAgIGlmKHRoaXMuaXNGb2N1c2FibGUoZWwsIGludGVyYWN0aXZlT25seSkpeyB0cnl7IGVsLmZvY3VzKCkgfSBjYXRjaChlKXt9IH1cbiAgICByZXR1cm4gISFkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuaXNTYW1lTm9kZShlbClcbiAgfSxcblxuICBmb2N1c0ZpcnN0SW50ZXJhY3RpdmUoZWwpe1xuICAgIGxldCBjaGlsZCA9IGVsLmZpcnN0RWxlbWVudENoaWxkXG4gICAgd2hpbGUoY2hpbGQpe1xuICAgICAgaWYodGhpcy5hdHRlbXB0Rm9jdXMoY2hpbGQsIHRydWUpIHx8IHRoaXMuZm9jdXNGaXJzdEludGVyYWN0aXZlKGNoaWxkLCB0cnVlKSl7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLm5leHRFbGVtZW50U2libGluZ1xuICAgIH1cbiAgfSxcblxuICBmb2N1c0ZpcnN0KGVsKXtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZFxuICAgIHdoaWxlKGNoaWxkKXtcbiAgICAgIGlmKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzRmlyc3QoY2hpbGQpKXtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgfVxuICB9LFxuXG4gIGZvY3VzTGFzdChlbCl7XG4gICAgbGV0IGNoaWxkID0gZWwubGFzdEVsZW1lbnRDaGlsZFxuICAgIHdoaWxlKGNoaWxkKXtcbiAgICAgIGlmKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzTGFzdChjaGlsZCkpe1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgY2hpbGQgPSBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG4gICAgfVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCBBUklBXG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IEFSSUEgZnJvbSBcIi4vYXJpYVwiXG5cbmxldCBmb2N1c1N0YWNrID0gW11cbmxldCBkZWZhdWx0X3RyYW5zaXRpb25fdGltZSA9IDIwMFxuXG5sZXQgSlMgPSB7XG4gIC8vIHByaXZhdGVcbiAgZXhlYyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZGVmYXVsdHMpe1xuICAgIGxldCBbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXSA9IGRlZmF1bHRzIHx8IFtudWxsLCB7Y2FsbGJhY2s6IGRlZmF1bHRzICYmIGRlZmF1bHRzLmNhbGxiYWNrfV1cbiAgICBsZXQgY29tbWFuZHMgPSBwaHhFdmVudC5jaGFyQXQoMCkgPT09IFwiW1wiID9cbiAgICAgIEpTT04ucGFyc2UocGh4RXZlbnQpIDogW1tkZWZhdWx0S2luZCwgZGVmYXVsdEFyZ3NdXVxuXG4gICAgY29tbWFuZHMuZm9yRWFjaCgoW2tpbmQsIGFyZ3NdKSA9PiB7XG4gICAgICBpZihraW5kID09PSBkZWZhdWx0S2luZCAmJiBkZWZhdWx0QXJncy5kYXRhKXtcbiAgICAgICAgYXJncy5kYXRhID0gT2JqZWN0LmFzc2lnbihhcmdzLmRhdGEgfHwge30sIGRlZmF1bHRBcmdzLmRhdGEpXG4gICAgICAgIGFyZ3MuY2FsbGJhY2sgPSBhcmdzLmNhbGxiYWNrIHx8IGRlZmF1bHRBcmdzLmNhbGxiYWNrXG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlclRvRWxzKHZpZXcubGl2ZVNvY2tldCwgc291cmNlRWwsIGFyZ3MpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpXG4gICAgICB9KVxuICAgIH0pXG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKXtcbiAgICByZXR1cm4gISEoZWwub2Zmc2V0V2lkdGggfHwgZWwub2Zmc2V0SGVpZ2h0IHx8IGVsLmdldENsaWVudFJlY3RzKCkubGVuZ3RoID4gMClcbiAgfSxcblxuICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSB2aWV3cG9ydFxuICBpc0luVmlld3BvcnQoZWwpe1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgY29uc3Qgd2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGhcblxuICAgIHJldHVybiAoXG4gICAgICByZWN0LnJpZ2h0ID4gMCAmJlxuICAgICAgcmVjdC5ib3R0b20gPiAwICYmXG4gICAgICByZWN0LmxlZnQgPCB3aW5kb3dXaWR0aCAmJlxuICAgICAgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHRcbiAgICApXG4gIH0sXG5cbiAgLy8gcHJpdmF0ZVxuXG4gIC8vIGNvbW1hbmRzXG5cbiAgZXhlY19leGVjKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge2F0dHIsIHRvfSl7XG4gICAgbGV0IG5vZGVzID0gdG8gPyBET00uYWxsKGRvY3VtZW50LCB0bykgOiBbc291cmNlRWxdXG4gICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIGxldCBlbmNvZGVkSlMgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyKVxuICAgICAgaWYoIWVuY29kZWRKUyl7IHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgJHthdHRyfSB0byBjb250YWluIEpTIGNvbW1hbmQgb24gXCIke3RvfVwiYCkgfVxuICAgICAgdmlldy5saXZlU29ja2V0LmV4ZWNKUyhub2RlLCBlbmNvZGVkSlMsIGV2ZW50VHlwZSlcbiAgICB9KVxuICB9LFxuXG4gIGV4ZWNfZGlzcGF0Y2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7dG8sIGV2ZW50LCBkZXRhaWwsIGJ1YmJsZXN9KXtcbiAgICBkZXRhaWwgPSBkZXRhaWwgfHwge31cbiAgICBkZXRhaWwuZGlzcGF0Y2hlciA9IHNvdXJjZUVsXG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCB7ZGV0YWlsLCBidWJibGVzfSlcbiAgfSxcblxuICBleGVjX3B1c2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKXtcbiAgICBsZXQge2V2ZW50LCBkYXRhLCB0YXJnZXQsIHBhZ2VfbG9hZGluZywgbG9hZGluZywgdmFsdWUsIGRpc3BhdGNoZXIsIGNhbGxiYWNrfSA9IGFyZ3NcbiAgICBsZXQgcHVzaE9wdHMgPSB7bG9hZGluZywgdmFsdWUsIHRhcmdldCwgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZ31cbiAgICBsZXQgdGFyZ2V0U3JjID0gZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWxcbiAgICBsZXQgcGh4VGFyZ2V0ID0gdGFyZ2V0IHx8IHRhcmdldFNyYy5nZXRBdHRyaWJ1dGUodmlldy5iaW5kaW5nKFwidGFyZ2V0XCIpKSB8fCB0YXJnZXRTcmNcbiAgICB2aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZighdGFyZ2V0Vmlldy5pc0Nvbm5lY3RlZCgpKXsgcmV0dXJuIH1cbiAgICAgIGlmKGV2ZW50VHlwZSA9PT0gXCJjaGFuZ2VcIil7XG4gICAgICAgIGxldCB7bmV3Q2lkLCBfdGFyZ2V0fSA9IGFyZ3NcbiAgICAgICAgX3RhcmdldCA9IF90YXJnZXQgfHwgKERPTS5pc0Zvcm1JbnB1dChzb3VyY2VFbCkgPyBzb3VyY2VFbC5uYW1lIDogdW5kZWZpbmVkKVxuICAgICAgICBpZihfdGFyZ2V0KXsgcHVzaE9wdHMuX3RhcmdldCA9IF90YXJnZXQgfVxuICAgICAgICB0YXJnZXRWaWV3LnB1c2hJbnB1dChzb3VyY2VFbCwgdGFyZ2V0Q3R4LCBuZXdDaWQsIGV2ZW50IHx8IHBoeEV2ZW50LCBwdXNoT3B0cywgY2FsbGJhY2spXG4gICAgICB9IGVsc2UgaWYoZXZlbnRUeXBlID09PSBcInN1Ym1pdFwiKXtcbiAgICAgICAgbGV0IHtzdWJtaXR0ZXJ9ID0gYXJnc1xuICAgICAgICB0YXJnZXRWaWV3LnN1Ym1pdEZvcm0oc291cmNlRWwsIHRhcmdldEN0eCwgZXZlbnQgfHwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgcHVzaE9wdHMsIGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0Vmlldy5wdXNoRXZlbnQoZXZlbnRUeXBlLCBzb3VyY2VFbCwgdGFyZ2V0Q3R4LCBldmVudCB8fCBwaHhFdmVudCwgZGF0YSwgcHVzaE9wdHMsIGNhbGxiYWNrKVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgZXhlY19uYXZpZ2F0ZShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtocmVmLCByZXBsYWNlfSl7XG4gICAgdmlldy5saXZlU29ja2V0Lmhpc3RvcnlSZWRpcmVjdChlLCBocmVmLCByZXBsYWNlID8gXCJyZXBsYWNlXCIgOiBcInB1c2hcIiwgbnVsbCwgc291cmNlRWwpXG4gIH0sXG5cbiAgZXhlY19wYXRjaChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtocmVmLCByZXBsYWNlfSl7XG4gICAgdmlldy5saXZlU29ja2V0LnB1c2hIaXN0b3J5UGF0Y2goZSwgaHJlZiwgcmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJwdXNoXCIsIHNvdXJjZUVsKVxuICB9LFxuXG4gIGV4ZWNfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKXtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IEFSSUEuYXR0ZW1wdEZvY3VzKGVsKSlcbiAgfSxcblxuICBleGVjX2ZvY3VzX2ZpcnN0KGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCl7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBBUklBLmZvY3VzRmlyc3RJbnRlcmFjdGl2ZShlbCkgfHwgQVJJQS5mb2N1c0ZpcnN0KGVsKSlcbiAgfSxcblxuICBleGVjX3B1c2hfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKXtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IGZvY3VzU3RhY2sucHVzaChlbCB8fCBzb3VyY2VFbCkpXG4gIH0sXG5cbiAgZXhlY19wb3BfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKXtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZm9jdXNTdGFjay5wb3AoKVxuICAgICAgaWYoZWwpeyBlbC5mb2N1cygpIH1cbiAgICB9KVxuICB9LFxuXG4gIGV4ZWNfYWRkX2NsYXNzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge25hbWVzLCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZ30pe1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBuYW1lcywgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKVxuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2NsYXNzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge25hbWVzLCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZ30pe1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKVxuICB9LFxuXG4gIGV4ZWNfdG9nZ2xlX2NsYXNzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge3RvLCBuYW1lcywgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmd9KXtcbiAgICB0aGlzLnRvZ2dsZUNsYXNzZXMoZWwsIG5hbWVzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZylcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9hdHRyKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge2F0dHI6IFthdHRyLCB2YWwxLCB2YWwyXX0pe1xuICAgIHRoaXMudG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMilcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7dGltZSwgdHJhbnNpdGlvbiwgYmxvY2tpbmd9KXtcbiAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIFtdLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZylcbiAgfSxcblxuICBleGVjX3RvZ2dsZShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nfSl7XG4gICAgdGhpcy50b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZylcbiAgfSxcblxuICBleGVjX3Nob3coZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7ZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmd9KXtcbiAgICB0aGlzLnNob3coZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpXG4gIH0sXG5cbiAgZXhlY19oaWRlKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge2Rpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nfSl7XG4gICAgdGhpcy5oaWRlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKVxuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7YXR0cjogW2F0dHIsIHZhbF19KXtcbiAgICB0aGlzLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtbYXR0ciwgdmFsXV0sIFtdKVxuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7YXR0cn0pe1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSlcbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKXtcbiAgICBpZighdGhpcy5pc1Zpc2libGUoZWwpKXtcbiAgICAgIHRoaXMudG9nZ2xlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIG51bGwsIHRpbWUsIGJsb2NraW5nKVxuICAgIH1cbiAgfSxcblxuICBoaWRlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKXtcbiAgICBpZih0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgdGhpcy50b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgbnVsbCwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpXG4gICAgfVxuICB9LFxuXG4gIHRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nKXtcbiAgICB0aW1lID0gdGltZSB8fCBkZWZhdWx0X3RyYW5zaXRpb25fdGltZVxuICAgIGxldCBbaW5DbGFzc2VzLCBpblN0YXJ0Q2xhc3NlcywgaW5FbmRDbGFzc2VzXSA9IGlucyB8fCBbW10sIFtdLCBbXV1cbiAgICBsZXQgW291dENsYXNzZXMsIG91dFN0YXJ0Q2xhc3Nlcywgb3V0RW5kQ2xhc3Nlc10gPSBvdXRzIHx8IFtbXSwgW10sIFtdXVxuICAgIGlmKGluQ2xhc3Nlcy5sZW5ndGggPiAwIHx8IG91dENsYXNzZXMubGVuZ3RoID4gMCl7XG4gICAgICBpZih0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgICBsZXQgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgb3V0U3RhcnRDbGFzc2VzLCBpbkNsYXNzZXMuY29uY2F0KGluU3RhcnRDbGFzc2VzKS5jb25jYXQoaW5FbmRDbGFzc2VzKSlcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRDbGFzc2VzLCBbXSlcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIG91dEVuZENsYXNzZXMsIG91dFN0YXJ0Q2xhc3NlcykpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBsZXQgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSlcbiAgICAgICAgICBET00ucHV0U3RpY2t5KGVsLCBcInRvZ2dsZVwiLCBjdXJyZW50RWwgPT4gY3VycmVudEVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIilcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpoaWRlLWVuZFwiKSlcbiAgICAgICAgfVxuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpoaWRlLXN0YXJ0XCIpKVxuICAgICAgICBpZihibG9ja2luZyA9PT0gZmFsc2Upe1xuICAgICAgICAgIG9uU3RhcnQoKVxuICAgICAgICAgIHNldFRpbWVvdXQob25FbmQsIHRpbWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRW5kKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZihldmVudFR5cGUgPT09IFwicmVtb3ZlXCIpeyByZXR1cm4gfVxuICAgICAgICBsZXQgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5TdGFydENsYXNzZXMsIG91dENsYXNzZXMuY29uY2F0KG91dFN0YXJ0Q2xhc3NlcykuY29uY2F0KG91dEVuZENsYXNzZXMpKVxuICAgICAgICAgIGxldCBzdGlja3lEaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLmRlZmF1bHREaXNwbGF5KGVsKVxuICAgICAgICAgIERPTS5wdXRTdGlja3koZWwsIFwidG9nZ2xlXCIsIGN1cnJlbnRFbCA9PiBjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IHN0aWNreURpc3BsYXkpXG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5DbGFzc2VzLCBbXSlcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIGluRW5kQ2xhc3NlcywgaW5TdGFydENsYXNzZXMpKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9uRW5kID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgaW5DbGFzc2VzLmNvbmNhdChpbkVuZENsYXNzZXMpKVxuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OnNob3ctZW5kXCIpKVxuICAgICAgICB9XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OnNob3ctc3RhcnRcIikpXG4gICAgICAgIGlmKGJsb2NraW5nID09PSBmYWxzZSl7XG4gICAgICAgICAgb25TdGFydCgpXG4gICAgICAgICAgc2V0VGltZW91dChvbkVuZCwgdGltZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25FbmQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYodGhpcy5pc1Zpc2libGUoZWwpKXtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSlcbiAgICAgICAgICBET00ucHV0U3RpY2t5KGVsLCBcInRvZ2dsZVwiLCBjdXJyZW50RWwgPT4gY3VycmVudEVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIilcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpoaWRlLWVuZFwiKSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OnNob3ctc3RhcnRcIikpXG4gICAgICAgICAgbGV0IHN0aWNreURpc3BsYXkgPSBkaXNwbGF5IHx8IHRoaXMuZGVmYXVsdERpc3BsYXkoZWwpXG4gICAgICAgICAgRE9NLnB1dFN0aWNreShlbCwgXCJ0b2dnbGVcIiwgY3VycmVudEVsID0+IGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSlcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdG9nZ2xlQ2xhc3NlcyhlbCwgY2xhc3NlcywgdHJhbnNpdGlvbiwgdGltZSwgdmlldywgYmxvY2tpbmcpe1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgbGV0IFtwcmV2QWRkcywgcHJldlJlbW92ZXNdID0gRE9NLmdldFN0aWNreShlbCwgXCJjbGFzc2VzXCIsIFtbXSwgW11dKVxuICAgICAgbGV0IG5ld0FkZHMgPSBjbGFzc2VzLmZpbHRlcihuYW1lID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpXG4gICAgICBsZXQgbmV3UmVtb3ZlcyA9IGNsYXNzZXMuZmlsdGVyKG5hbWUgPT4gcHJldlJlbW92ZXMuaW5kZXhPZihuYW1lKSA8IDAgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKG5hbWUpKVxuICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIG5ld0FkZHMsIG5ld1JlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMil7XG4gICAgaWYoZWwuaGFzQXR0cmlidXRlKGF0dHIpKXtcbiAgICAgIGlmKHZhbDIgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgIC8vIHRvZ2dsZSBiZXR3ZWVuIHZhbDEgYW5kIHZhbDJcbiAgICAgICAgaWYoZWwuZ2V0QXR0cmlidXRlKGF0dHIpID09PSB2YWwxKXtcbiAgICAgICAgICB0aGlzLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtbYXR0ciwgdmFsMl1dLCBbXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtbYXR0ciwgdmFsMV1dLCBbXSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGF0dHJcbiAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtbYXR0ciwgdmFsMV1dLCBbXSlcbiAgICB9XG4gIH0sXG5cbiAgYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBhZGRzLCByZW1vdmVzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZyl7XG4gICAgdGltZSA9IHRpbWUgfHwgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWVcbiAgICBsZXQgW3RyYW5zaXRpb25SdW4sIHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZF0gPSB0cmFuc2l0aW9uIHx8IFtbXSwgW10sIFtdXVxuICAgIGlmKHRyYW5zaXRpb25SdW4ubGVuZ3RoID4gMCl7XG4gICAgICBsZXQgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIHRyYW5zaXRpb25TdGFydCwgW10uY29uY2F0KHRyYW5zaXRpb25SdW4pLmNvbmNhdCh0cmFuc2l0aW9uRW5kKSlcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIHRyYW5zaXRpb25SdW4sIFtdKVxuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIHRyYW5zaXRpb25FbmQsIHRyYW5zaXRpb25TdGFydCkpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBsZXQgb25Eb25lID0gKCkgPT4gdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMuY29uY2F0KHRyYW5zaXRpb25FbmQpLCByZW1vdmVzLmNvbmNhdCh0cmFuc2l0aW9uUnVuKS5jb25jYXQodHJhbnNpdGlvblN0YXJ0KSlcbiAgICAgIGlmKGJsb2NraW5nID09PSBmYWxzZSl7XG4gICAgICAgIG9uU3RhcnQoKVxuICAgICAgICBzZXRUaW1lb3V0KG9uRG9uZSwgdGltZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGxldCBbcHJldkFkZHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCBbW10sIFtdXSlcbiAgICAgIGxldCBrZWVwQWRkcyA9IGFkZHMuZmlsdGVyKG5hbWUgPT4gcHJldkFkZHMuaW5kZXhPZihuYW1lKSA8IDAgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSlcbiAgICAgIGxldCBrZWVwUmVtb3ZlcyA9IHJlbW92ZXMuZmlsdGVyKG5hbWUgPT4gcHJldlJlbW92ZXMuaW5kZXhPZihuYW1lKSA8IDAgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKG5hbWUpKVxuICAgICAgbGV0IG5ld0FkZHMgPSBwcmV2QWRkcy5maWx0ZXIobmFtZSA9PiByZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwKS5jb25jYXQoa2VlcEFkZHMpXG4gICAgICBsZXQgbmV3UmVtb3ZlcyA9IHByZXZSZW1vdmVzLmZpbHRlcihuYW1lID0+IGFkZHMuaW5kZXhPZihuYW1lKSA8IDApLmNvbmNhdChrZWVwUmVtb3ZlcylcblxuICAgICAgRE9NLnB1dFN0aWNreShlbCwgXCJjbGFzc2VzXCIsIGN1cnJlbnRFbCA9PiB7XG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1JlbW92ZXMpXG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QuYWRkKC4uLm5ld0FkZHMpXG4gICAgICAgIHJldHVybiBbbmV3QWRkcywgbmV3UmVtb3Zlc11cbiAgICAgIH0pXG4gICAgfSlcbiAgfSxcblxuICBzZXRPclJlbW92ZUF0dHJzKGVsLCBzZXRzLCByZW1vdmVzKXtcbiAgICBsZXQgW3ByZXZTZXRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImF0dHJzXCIsIFtbXSwgW11dKVxuXG4gICAgbGV0IGFsdGVyZWRBdHRycyA9IHNldHMubWFwKChbYXR0ciwgX3ZhbF0pID0+IGF0dHIpLmNvbmNhdChyZW1vdmVzKVxuICAgIGxldCBuZXdTZXRzID0gcHJldlNldHMuZmlsdGVyKChbYXR0ciwgX3ZhbF0pID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpLmNvbmNhdChzZXRzKVxuICAgIGxldCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXMuZmlsdGVyKChhdHRyKSA9PiAhYWx0ZXJlZEF0dHJzLmluY2x1ZGVzKGF0dHIpKS5jb25jYXQocmVtb3ZlcylcblxuICAgIERPTS5wdXRTdGlja3koZWwsIFwiYXR0cnNcIiwgY3VycmVudEVsID0+IHtcbiAgICAgIG5ld1JlbW92ZXMuZm9yRWFjaChhdHRyID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpXG4gICAgICBuZXdTZXRzLmZvckVhY2goKFthdHRyLCB2YWxdKSA9PiBjdXJyZW50RWwuc2V0QXR0cmlidXRlKGF0dHIsIHZhbCkpXG4gICAgICByZXR1cm4gW25ld1NldHMsIG5ld1JlbW92ZXNdXG4gICAgfSlcbiAgfSxcblxuICBoYXNBbGxDbGFzc2VzKGVsLCBjbGFzc2VzKXsgcmV0dXJuIGNsYXNzZXMuZXZlcnkobmFtZSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpIH0sXG5cbiAgaXNUb2dnbGVkT3V0KGVsLCBvdXRDbGFzc2VzKXtcbiAgICByZXR1cm4gIXRoaXMuaXNWaXNpYmxlKGVsKSB8fCB0aGlzLmhhc0FsbENsYXNzZXMoZWwsIG91dENsYXNzZXMpXG4gIH0sXG5cbiAgZmlsdGVyVG9FbHMobGl2ZVNvY2tldCwgc291cmNlRWwsIHt0b30pe1xuICAgIGxldCBkZWZhdWx0UXVlcnkgPSAoKSA9PiB7XG4gICAgICBpZih0eXBlb2YodG8pID09PSBcInN0cmluZ1wiKXtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodG8pXG4gICAgICB9IGVsc2UgaWYodG8uY2xvc2VzdCl7XG4gICAgICAgIGxldCB0b0VsID0gc291cmNlRWwuY2xvc2VzdCh0by5jbG9zZXN0KVxuICAgICAgICByZXR1cm4gdG9FbCA/IFt0b0VsXSA6IFtdXG4gICAgICB9IGVsc2UgaWYodG8uaW5uZXIpe1xuICAgICAgICByZXR1cm4gc291cmNlRWwucXVlcnlTZWxlY3RvckFsbCh0by5pbm5lcilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvID8gbGl2ZVNvY2tldC5qc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHRvLCBkZWZhdWx0UXVlcnkpIDogW3NvdXJjZUVsXVxuICB9LFxuXG4gIGRlZmF1bHREaXNwbGF5KGVsKXtcbiAgICByZXR1cm4ge3RyOiBcInRhYmxlLXJvd1wiLCB0ZDogXCJ0YWJsZS1jZWxsXCJ9W2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0gfHwgXCJibG9ja1wiXG4gIH0sXG5cbiAgdHJhbnNpdGlvbkNsYXNzZXModmFsKXtcbiAgICBpZighdmFsKXsgcmV0dXJuIG51bGwgfVxuXG4gICAgbGV0IFt0cmFucywgdFN0YXJ0LCB0RW5kXSA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWwuc3BsaXQoXCIgXCIpLCBbXSwgW11dXG4gICAgdHJhbnMgPSBBcnJheS5pc0FycmF5KHRyYW5zKSA/IHRyYW5zIDogdHJhbnMuc3BsaXQoXCIgXCIpXG4gICAgdFN0YXJ0ID0gQXJyYXkuaXNBcnJheSh0U3RhcnQpID8gdFN0YXJ0IDogdFN0YXJ0LnNwbGl0KFwiIFwiKVxuICAgIHRFbmQgPSBBcnJheS5pc0FycmF5KHRFbmQpID8gdEVuZCA6IHRFbmQuc3BsaXQoXCIgXCIpXG4gICAgcmV0dXJuIFt0cmFucywgdFN0YXJ0LCB0RW5kXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEpTXG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0hBU19TVUJNSVRURUQsXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfUFJJVkFURSxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9QRU5ESU5HX0FUVFJTLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1NUSUNLWSxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFRIUk9UVExFRCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEpTIGZyb20gXCIuL2pzXCJcblxuaW1wb3J0IHtcbiAgbG9nRXJyb3Jcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5sZXQgRE9NID0ge1xuICBieUlkKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCkgfSxcblxuICByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKXtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSlcbiAgICBpZihlbC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKXsgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIikgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spe1xuICAgIGlmKCFub2RlKXsgcmV0dXJuIFtdIH1cbiAgICBsZXQgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gYXJyYXkuZm9yRWFjaChjYWxsYmFjaykgOiBhcnJheVxuICB9LFxuXG4gIGNoaWxkTm9kZUxlbmd0aChodG1sKXtcbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIilcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnRcbiAgfSxcblxuICBpc1VwbG9hZElucHV0KGVsKXsgcmV0dXJuIGVsLnR5cGUgPT09IFwiZmlsZVwiICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikgIT09IG51bGwgfSxcblxuICBpc0F1dG9VcGxvYWQoaW5wdXRFbCl7IHJldHVybiBpbnB1dEVsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWF1dG8tdXBsb2FkXCIpIH0sXG5cbiAgZmluZFVwbG9hZElucHV0cyhub2RlKXtcbiAgICBjb25zdCBmb3JtSWQgPSBub2RlLmlkXG4gICAgY29uc3QgaW5wdXRzT3V0c2lkZUZvcm0gPSB0aGlzLmFsbChkb2N1bWVudCwgYGlucHV0W3R5cGU9XCJmaWxlXCJdWyR7UEhYX1VQTE9BRF9SRUZ9XVtmb3JtPVwiJHtmb3JtSWR9XCJdYClcbiAgICByZXR1cm4gdGhpcy5hbGwobm9kZSwgYGlucHV0W3R5cGU9XCJmaWxlXCJdWyR7UEhYX1VQTE9BRF9SRUZ9XWApLmNvbmNhdChpbnB1dHNPdXRzaWRlRm9ybSlcbiAgfSxcblxuICBmaW5kQ29tcG9uZW50Tm9kZUxpc3Qobm9kZSwgY2lkKXtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJXaXRoaW5TYW1lTGl2ZVZpZXcodGhpcy5hbGwobm9kZSwgYFske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCksIG5vZGUpXG4gIH0sXG5cbiAgaXNQaHhEZXN0cm95ZWQobm9kZSl7XG4gICAgcmV0dXJuIG5vZGUuaWQgJiYgRE9NLnByaXZhdGUobm9kZSwgXCJkZXN0cm95ZWRcIikgPyB0cnVlIDogZmFsc2VcbiAgfSxcblxuICB3YW50c05ld1RhYihlKXtcbiAgICBsZXQgd2FudHNOZXdUYWIgPSBlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgKGUuYnV0dG9uICYmIGUuYnV0dG9uID09PSAxKVxuICAgIGxldCBpc0Rvd25sb2FkID0gKGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZS50YXJnZXQuaGFzQXR0cmlidXRlKFwiZG93bmxvYWRcIikpXG4gICAgbGV0IGlzVGFyZ2V0QmxhbmsgPSBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0YXJnZXRcIikgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiX2JsYW5rXCJcbiAgICBsZXQgaXNUYXJnZXROYW1lZFRhYiA9IGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInRhcmdldFwiKSAmJiAhZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnN0YXJ0c1dpdGgoXCJfXCIpXG4gICAgcmV0dXJuIHdhbnRzTmV3VGFiIHx8IGlzVGFyZ2V0QmxhbmsgfHwgaXNEb3dubG9hZCB8fCBpc1RhcmdldE5hbWVkVGFiXG4gIH0sXG5cbiAgaXNVbmxvYWRhYmxlRm9ybVN1Ym1pdChlKXtcbiAgICAvLyBJZ25vcmUgZm9ybSBzdWJtaXNzaW9ucyBpbnRlbmRlZCB0byBjbG9zZSBhIG5hdGl2ZSA8ZGlhbG9nPiBlbGVtZW50XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2RpYWxvZyN1c2FnZV9ub3Rlc1xuICAgIGxldCBpc0RpYWxvZ1N1Ym1pdCA9IChlLnRhcmdldCAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJtZXRob2RcIikgPT09IFwiZGlhbG9nXCIpIHx8XG4gICAgICAoZS5zdWJtaXR0ZXIgJiYgZS5zdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybW1ldGhvZFwiKSA9PT0gXCJkaWFsb2dcIilcblxuICAgIGlmKGlzRGlhbG9nU3VibWl0KXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy53YW50c05ld1RhYihlKVxuICAgIH1cbiAgfSxcblxuICBpc05ld1BhZ2VDbGljayhlLCBjdXJyZW50TG9jYXRpb24pe1xuICAgIGxldCBocmVmID0gZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCA/IGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcImhyZWZcIikgOiBudWxsXG4gICAgbGV0IHVybFxuXG4gICAgaWYoZS5kZWZhdWx0UHJldmVudGVkIHx8IGhyZWYgPT09IG51bGwgfHwgdGhpcy53YW50c05ld1RhYihlKSl7IHJldHVybiBmYWxzZSB9XG4gICAgaWYoaHJlZi5zdGFydHNXaXRoKFwibWFpbHRvOlwiKSB8fCBocmVmLnN0YXJ0c1dpdGgoXCJ0ZWw6XCIpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZihlLnRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSl7IHJldHVybiBmYWxzZSB9XG5cbiAgICB0cnkge1xuICAgICAgdXJsID0gbmV3IFVSTChocmVmKVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXJsID0gbmV3IFVSTChocmVmLCBjdXJyZW50TG9jYXRpb24pXG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgLy8gYmFkIFVSTCwgZmFsbGJhY2sgdG8gbGV0IGJyb3dzZXIgdHJ5IGl0IGFzIGV4dGVybmFsXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYodXJsLmhvc3QgPT09IGN1cnJlbnRMb2NhdGlvbi5ob3N0ICYmIHVybC5wcm90b2NvbCA9PT0gY3VycmVudExvY2F0aW9uLnByb3RvY29sKXtcbiAgICAgIGlmKHVybC5wYXRobmFtZSA9PT0gY3VycmVudExvY2F0aW9uLnBhdGhuYW1lICYmIHVybC5zZWFyY2ggPT09IGN1cnJlbnRMb2NhdGlvbi5zZWFyY2gpe1xuICAgICAgICByZXR1cm4gdXJsLmhhc2ggPT09IFwiXCIgJiYgIXVybC5ocmVmLmVuZHNXaXRoKFwiI1wiKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsLnByb3RvY29sLnN0YXJ0c1dpdGgoXCJodHRwXCIpXG4gIH0sXG5cbiAgbWFya1BoeENoaWxkRGVzdHJveWVkKGVsKXtcbiAgICBpZih0aGlzLmlzUGh4Q2hpbGQoZWwpKXsgZWwuc2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OLCBcIlwiKSB9XG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBcImRlc3Ryb3llZFwiLCB0cnVlKVxuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpe1xuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcbiAgICByZXR1cm4gdGhpcy5maW5kUGh4Q2hpbGRyZW4odGVtcGxhdGUuY29udGVudCwgcGFyZW50SWQpXG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpe1xuICAgIHJldHVybiAoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkgfHwgZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtdXBkYXRlXCIpKSA9PT0gXCJpZ25vcmVcIlxuICB9LFxuXG4gIGlzUGh4VXBkYXRlKGVsLCBwaHhVcGRhdGUsIHVwZGF0ZVR5cGVzKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIHVwZGF0ZVR5cGVzLmluZGV4T2YoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkpID49IDBcbiAgfSxcblxuICBmaW5kUGh4U3RpY2t5KGVsKXsgcmV0dXJuIHRoaXMuYWxsKGVsLCBgWyR7UEhYX1NUSUNLWX1dYCkgfSxcblxuICBmaW5kUGh4Q2hpbGRyZW4oZWwsIHBhcmVudElkKXtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKVxuICB9LFxuXG4gIGZpbmRFeGlzdGluZ1BhcmVudENJRHMobm9kZSwgY2lkcyl7XG4gICAgLy8gd2Ugb25seSB3YW50IHRvIGZpbmQgcGFyZW50cyB0aGF0IGV4aXN0IG9uIHRoZSBwYWdlXG4gICAgLy8gaWYgYSBjaWQgaXMgbm90IG9uIHRoZSBwYWdlLCB0aGUgb25seSB3YXkgaXQgY2FuIGJlIGFkZGVkIGJhY2sgdG8gdGhlIHBhZ2VcbiAgICAvLyBpcyBpZiBhIHBhcmVudCBhZGRzIGl0IGJhY2ssIHRoZXJlZm9yZSBpZiBhIGNpZCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcGFnZSxcbiAgICAvLyB3ZSBzaG91bGQgbm90IHRyeSB0byByZW5kZXIgaXQgYnkgaXRzZWxmIChiZWNhdXNlIGl0IHdvdWxkIGJlIHJlbmRlcmVkIHR3aWNlLFxuICAgIC8vIG9uZSBieSB0aGUgcGFyZW50LCBhbmQgYSBzZWNvbmQgdGltZSBieSBpdHNlbGYpXG4gICAgbGV0IHBhcmVudENpZHMgPSBuZXcgU2V0KClcbiAgICBsZXQgY2hpbGRyZW5DaWRzID0gbmV3IFNldCgpXG5cbiAgICBjaWRzLmZvckVhY2goY2lkID0+IHtcbiAgICAgIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWApLCBub2RlKS5mb3JFYWNoKHBhcmVudCA9PiB7XG4gICAgICAgIHBhcmVudENpZHMuYWRkKGNpZClcbiAgICAgICAgdGhpcy5hbGwocGFyZW50LCBgWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgICAubWFwKGVsID0+IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSkpXG4gICAgICAgICAgLmZvckVhY2goY2hpbGRDSUQgPT4gY2hpbGRyZW5DaWRzLmFkZChjaGlsZENJRCkpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBjaGlsZHJlbkNpZHMuZm9yRWFjaChjaGlsZENpZCA9PiBwYXJlbnRDaWRzLmRlbGV0ZShjaGlsZENpZCkpXG5cbiAgICByZXR1cm4gcGFyZW50Q2lkc1xuICB9LFxuXG4gIGZpbHRlcldpdGhpblNhbWVMaXZlVmlldyhub2RlcywgcGFyZW50KXtcbiAgICBpZihwYXJlbnQucXVlcnlTZWxlY3RvcihQSFhfVklFV19TRUxFQ1RPUikpe1xuICAgICAgcmV0dXJuIG5vZGVzLmZpbHRlcihlbCA9PiB0aGlzLndpdGhpblNhbWVMaXZlVmlldyhlbCwgcGFyZW50KSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGVzXG4gICAgfVxuICB9LFxuXG4gIHdpdGhpblNhbWVMaXZlVmlldyhub2RlLCBwYXJlbnQpe1xuICAgIHdoaWxlKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpe1xuICAgICAgaWYobm9kZS5pc1NhbWVOb2RlKHBhcmVudCkpeyByZXR1cm4gdHJ1ZSB9XG4gICAgICBpZihub2RlLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGwpeyByZXR1cm4gZmFsc2UgfVxuICAgIH1cbiAgfSxcblxuICBwcml2YXRlKGVsLCBrZXkpeyByZXR1cm4gZWxbUEhYX1BSSVZBVEVdICYmIGVsW1BIWF9QUklWQVRFXVtrZXldIH0sXG5cbiAgZGVsZXRlUHJpdmF0ZShlbCwga2V5KXsgZWxbUEhYX1BSSVZBVEVdICYmIGRlbGV0ZSAoZWxbUEhYX1BSSVZBVEVdW2tleV0pIH0sXG5cbiAgcHV0UHJpdmF0ZShlbCwga2V5LCB2YWx1ZSl7XG4gICAgaWYoIWVsW1BIWF9QUklWQVRFXSl7IGVsW1BIWF9QUklWQVRFXSA9IHt9IH1cbiAgICBlbFtQSFhfUFJJVkFURV1ba2V5XSA9IHZhbHVlXG4gIH0sXG5cbiAgdXBkYXRlUHJpdmF0ZShlbCwga2V5LCBkZWZhdWx0VmFsLCB1cGRhdGVGdW5jKXtcbiAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnByaXZhdGUoZWwsIGtleSlcbiAgICBpZihleGlzdGluZyA9PT0gdW5kZWZpbmVkKXtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGRlZmF1bHRWYWwpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdXBkYXRlRnVuYyhleGlzdGluZykpXG4gICAgfVxuICB9LFxuXG4gIHN5bmNQZW5kaW5nQXR0cnMoZnJvbUVsLCB0b0VsKXtcbiAgICBpZighZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX1NSQykpeyByZXR1cm4gfVxuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgIGZyb21FbC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSAmJiB0b0VsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgUEhYX1BFTkRJTkdfQVRUUlMuZmlsdGVyKGF0dHIgPT4gZnJvbUVsLmhhc0F0dHJpYnV0ZShhdHRyKSkuZm9yRWFjaChhdHRyID0+IHtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKGF0dHIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoYXR0cikpXG4gICAgfSlcbiAgfSxcblxuICBjb3B5UHJpdmF0ZXModGFyZ2V0LCBzb3VyY2Upe1xuICAgIGlmKHNvdXJjZVtQSFhfUFJJVkFURV0pe1xuICAgICAgdGFyZ2V0W1BIWF9QUklWQVRFXSA9IHNvdXJjZVtQSFhfUFJJVkFURV1cbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKXtcbiAgICBsZXQgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKVxuICAgIGlmKHRpdGxlRWwpe1xuICAgICAgbGV0IHtwcmVmaXgsIHN1ZmZpeH0gPSB0aXRsZUVsLmRhdGFzZXRcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtzdHJ9JHtzdWZmaXggfHwgXCJcIn1gXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gc3RyXG4gICAgfVxuICB9LFxuXG4gIGRlYm91bmNlKGVsLCBldmVudCwgcGh4RGVib3VuY2UsIGRlZmF1bHREZWJvdW5jZSwgcGh4VGhyb3R0bGUsIGRlZmF1bHRUaHJvdHRsZSwgYXN5bmNGaWx0ZXIsIGNhbGxiYWNrKXtcbiAgICBsZXQgZGVib3VuY2UgPSBlbC5nZXRBdHRyaWJ1dGUocGh4RGVib3VuY2UpXG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKVxuXG4gICAgaWYoZGVib3VuY2UgPT09IFwiXCIpeyBkZWJvdW5jZSA9IGRlZmF1bHREZWJvdW5jZSB9XG4gICAgaWYodGhyb3R0bGUgPT09IFwiXCIpeyB0aHJvdHRsZSA9IGRlZmF1bHRUaHJvdHRsZSB9XG4gICAgbGV0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGVcbiAgICBzd2l0Y2godmFsdWUpe1xuICAgICAgY2FzZSBudWxsOiByZXR1cm4gY2FsbGJhY2soKVxuXG4gICAgICBjYXNlIFwiYmx1clwiOlxuICAgICAgICBpZih0aGlzLm9uY2UoZWwsIFwiZGVib3VuY2UtYmx1clwiKSl7XG4gICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaWYoYXN5bmNGaWx0ZXIoKSl7IGNhbGxiYWNrKCkgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxldCB0aW1lb3V0ID0gcGFyc2VJbnQodmFsdWUpXG4gICAgICAgIGxldCB0cmlnZ2VyID0gKCkgPT4gdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpXG4gICAgICAgIGxldCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKVxuICAgICAgICBpZihpc05hTih0aW1lb3V0KSl7IHJldHVybiBsb2dFcnJvcihgaW52YWxpZCB0aHJvdHRsZS9kZWJvdW5jZSB2YWx1ZTogJHt2YWx1ZX1gKSB9XG4gICAgICAgIGlmKHRocm90dGxlKXtcbiAgICAgICAgICBsZXQgbmV3S2V5RG93biA9IGZhbHNlXG4gICAgICAgICAgaWYoZXZlbnQudHlwZSA9PT0gXCJrZXlkb3duXCIpe1xuICAgICAgICAgICAgbGV0IHByZXZLZXkgPSB0aGlzLnByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZKVxuICAgICAgICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSwgZXZlbnQua2V5KVxuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKCFuZXdLZXlEb3duICYmIHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBpZihhc3luY0ZpbHRlcigpKXsgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpIH1cbiAgICAgICAgICAgIH0sIHRpbWVvdXQpXG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFRIUk9UVExFRCwgdClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZihhc3luY0ZpbHRlcigpKXsgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIsIGN1cnJlbnRDeWNsZSkgfVxuICAgICAgICAgIH0sIHRpbWVvdXQpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZm9ybSA9IGVsLmZvcm1cbiAgICAgICAgaWYoZm9ybSAmJiB0aGlzLm9uY2UoZm9ybSwgXCJiaW5kLWRlYm91bmNlXCIpKXtcbiAgICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgQXJyYXkuZnJvbSgobmV3IEZvcm1EYXRhKGZvcm0pKS5lbnRyaWVzKCksIChbbmFtZV0pID0+IHtcbiAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZm9ybS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cIiR7bmFtZX1cIl1gKVxuICAgICAgICAgICAgICB0aGlzLmluY0N5Y2xlKGlucHV0LCBERUJPVU5DRV9UUklHR0VSKVxuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFRIUk9UVExFRClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLm9uY2UoZWwsIFwiYmluZC1kZWJvdW5jZVwiKSl7XG4gICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSB0cmlnZ2VyIHRoZSBjYWxsYmFjayBoZXJlLFxuICAgICAgICAgICAgLy8gd2UgYWxzbyBjbGVhciB0aGUgdGhyb3R0bGUgdGltZW91dCB0byBwcmV2ZW50IHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgLy8gZnJvbSBiZWluZyBjYWxsZWQgYWdhaW4gYWZ0ZXIgdGhlIHRpbWVvdXQgZmlyZXNcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnByaXZhdGUoZWwsIFRIUk9UVExFRCkpXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHRyaWdnZXJDeWNsZShlbCwga2V5LCBjdXJyZW50Q3ljbGUpe1xuICAgIGxldCBbY3ljbGUsIHRyaWdnZXJdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpXG4gICAgaWYoIWN1cnJlbnRDeWNsZSl7IGN1cnJlbnRDeWNsZSA9IGN5Y2xlIH1cbiAgICBpZihjdXJyZW50Q3ljbGUgPT09IGN5Y2xlKXtcbiAgICAgIHRoaXMuaW5jQ3ljbGUoZWwsIGtleSlcbiAgICAgIHRyaWdnZXIoKVxuICAgIH1cbiAgfSxcblxuICBvbmNlKGVsLCBrZXkpe1xuICAgIGlmKHRoaXMucHJpdmF0ZShlbCwga2V5KSA9PT0gdHJ1ZSl7IHJldHVybiBmYWxzZSB9XG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHRydWUpXG4gICAgcmV0dXJuIHRydWVcbiAgfSxcblxuICBpbmNDeWNsZShlbCwga2V5LCB0cmlnZ2VyID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIGxldCBbY3VycmVudEN5Y2xlXSA9IHRoaXMucHJpdmF0ZShlbCwga2V5KSB8fCBbMCwgdHJpZ2dlcl1cbiAgICBjdXJyZW50Q3ljbGUrK1xuICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCBbY3VycmVudEN5Y2xlLCB0cmlnZ2VyXSlcbiAgICByZXR1cm4gY3VycmVudEN5Y2xlXG4gIH0sXG5cbiAgLy8gbWFpbnRhaW5zIG9yIGFkZHMgcHJpdmF0ZWx5IHVzZWQgaG9vayBpbmZvcm1hdGlvblxuICAvLyBmcm9tRWwgYW5kIHRvRWwgY2FuIGJlIHRoZSBzYW1lIGVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBuZXdseSBhZGRlZCBub2RlXG4gIC8vIGZyb21FbCBhbmQgdG9FbCBjYW4gYmUgYW55IEhUTUwgbm9kZSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYW4gZWxlbWVudCBub2RlXG4gIG1haW50YWluUHJpdmF0ZUhvb2tzKGZyb21FbCwgdG9FbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKXtcbiAgICAvLyBtYWludGFpbiB0aGUgaG9va3MgY3JlYXRlZCB3aXRoIGNyZWF0ZUhvb2tcbiAgICBpZihmcm9tRWwuaGFzQXR0cmlidXRlICYmIGZyb21FbC5oYXNBdHRyaWJ1dGUoXCJkYXRhLXBoeC1ob29rXCIpICYmICF0b0VsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIikpe1xuICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1ob29rXCIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1ob29rXCIpKVxuICAgIH1cbiAgICAvLyBhZGQgaG9va3MgdG8gZWxlbWVudHMgd2l0aCB2aWV3cG9ydCBhdHRyaWJ1dGVzXG4gICAgaWYodG9FbC5oYXNBdHRyaWJ1dGUgJiYgKHRvRWwuaGFzQXR0cmlidXRlKHBoeFZpZXdwb3J0VG9wKSB8fCB0b0VsLmhhc0F0dHJpYnV0ZShwaHhWaWV3cG9ydEJvdHRvbSkpKXtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiLCBcIlBob2VuaXguSW5maW5pdGVTY3JvbGxcIilcbiAgICB9XG4gIH0sXG5cbiAgcHV0Q3VzdG9tRWxIb29rKGVsLCBob29rKXtcbiAgICBpZihlbC5pc0Nvbm5lY3RlZCl7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1ob29rXCIsIFwiXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxuICAgICAgICBob29rIGF0dGFjaGVkIHRvIG5vbi1jb25uZWN0ZWQgRE9NIGVsZW1lbnRcbiAgICAgICAgZW5zdXJlIHlvdSBhcmUgY2FsbGluZyBjcmVhdGVIb29rIHdpdGhpbiB5b3VyIGNvbm5lY3RlZENhbGxiYWNrLiAke2VsLm91dGVySFRNTH1cbiAgICAgIGApXG4gICAgfVxuICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgXCJjdXN0b20tZWwtaG9va1wiLCBob29rKVxuICB9LFxuXG4gIGdldEN1c3RvbUVsSG9vayhlbCl7IHJldHVybiB0aGlzLnByaXZhdGUoZWwsIFwiY3VzdG9tLWVsLWhvb2tcIikgfSxcblxuICBpc1VzZWRJbnB1dChlbCl7XG4gICAgcmV0dXJuIChlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICh0aGlzLnByaXZhdGUoZWwsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGVsLCBQSFhfSEFTX1NVQk1JVFRFRCkpKVxuICB9LFxuXG4gIHJlc2V0Rm9ybShmb3JtKXtcbiAgICBBcnJheS5mcm9tKGZvcm0uZWxlbWVudHMpLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdGhpcy5kZWxldGVQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQpXG4gICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKVxuICAgIH0pXG4gIH0sXG5cbiAgaXNQaHhDaGlsZChub2RlKXtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRClcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKXtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoUEhYX1NUSUNLWSkgIT09IG51bGxcbiAgfSxcblxuICBpc0NoaWxkT2ZBbnkoZWwsIHBhcmVudHMpe1xuICAgIHJldHVybiAhIXBhcmVudHMuZmluZChwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKGVsKSlcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKXtcbiAgICByZXR1cm4gdGhpcy5pc1BoeENoaWxkKGVsKSA/IGVsIDogdGhpcy5hbGwoZWwsIGBbJHtQSFhfUEFSRU5UX0lEfV1gKVswXVxuICB9LFxuXG4gIGRpc3BhdGNoRXZlbnQodGFyZ2V0LCBuYW1lLCBvcHRzID0ge30pe1xuICAgIGxldCBkZWZhdWx0QnViYmxlID0gdHJ1ZVxuICAgIGxldCBpc1VwbG9hZFRhcmdldCA9IHRhcmdldC5ub2RlTmFtZSA9PT0gXCJJTlBVVFwiICYmIHRhcmdldC50eXBlID09PSBcImZpbGVcIlxuICAgIGlmKGlzVXBsb2FkVGFyZ2V0ICYmIG5hbWUgPT09IFwiY2xpY2tcIil7XG4gICAgICBkZWZhdWx0QnViYmxlID0gZmFsc2VcbiAgICB9XG4gICAgbGV0IGJ1YmJsZXMgPSBvcHRzLmJ1YmJsZXMgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRCdWJibGUgOiAhIW9wdHMuYnViYmxlc1xuICAgIGxldCBldmVudE9wdHMgPSB7YnViYmxlczogYnViYmxlcywgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiBvcHRzLmRldGFpbCB8fCB7fX1cbiAgICBsZXQgZXZlbnQgPSBuYW1lID09PSBcImNsaWNrXCIgPyBuZXcgTW91c2VFdmVudChcImNsaWNrXCIsIGV2ZW50T3B0cykgOiBuZXcgQ3VzdG9tRXZlbnQobmFtZSwgZXZlbnRPcHRzKVxuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKXtcbiAgICBpZih0eXBlb2YgKGh0bWwpID09PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgIHJldHVybiBub2RlLmNsb25lTm9kZSh0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2xvbmVkID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpXG4gICAgICBjbG9uZWQuaW5uZXJIVE1MID0gaHRtbFxuICAgICAgcmV0dXJuIGNsb25lZFxuICAgIH1cbiAgfSxcblxuICAvLyBtZXJnZSBhdHRyaWJ1dGVzIGZyb20gc291cmNlIHRvIHRhcmdldFxuICAvLyBpZiBhbiBlbGVtZW50IGlzIGlnbm9yZWQsIHdlIG9ubHkgbWVyZ2UgZGF0YSBhdHRyaWJ1dGVzXG4gIC8vIGluY2x1ZGluZyByZW1vdmluZyBkYXRhIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2VcbiAgbWVyZ2VBdHRycyh0YXJnZXQsIHNvdXJjZSwgb3B0cyA9IHt9KXtcbiAgICBsZXQgZXhjbHVkZSA9IG5ldyBTZXQob3B0cy5leGNsdWRlIHx8IFtdKVxuICAgIGxldCBpc0lnbm9yZWQgPSBvcHRzLmlzSWdub3JlZFxuICAgIGxldCBzb3VyY2VBdHRycyA9IHNvdXJjZS5hdHRyaWJ1dGVzXG4gICAgZm9yKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgbGV0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lXG4gICAgICBpZighZXhjbHVkZS5oYXMobmFtZSkpe1xuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgICAgICAgaWYodGFyZ2V0LmdldEF0dHJpYnV0ZShuYW1lKSAhPT0gc291cmNlVmFsdWUgJiYgKCFpc0lnbm9yZWQgfHwgKGlzSWdub3JlZCAmJiBuYW1lLnN0YXJ0c1dpdGgoXCJkYXRhLVwiKSkpKXtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZVZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSBleGNsdWRlIHRoZSB2YWx1ZSBmcm9tIGJlaW5nIG1lcmdlZCBvbiBmb2N1c2VkIGlucHV0cywgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gdXNlcidzIGlucHV0IHNob3VsZCBhbHdheXMgd2luLlxuICAgICAgICAvLyBXZSBjYW4gc3RpbGwgYXNzaWduIGl0IGFzIGxvbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBzYW1lLCB0aG91Z2guXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgYSBzaXR1YXRpb24gd2hlcmUgdGhlIHVwZGF0ZWQgaG9vayBpcyBub3QgYmVpbmcgdHJpZ2dlcmVkXG4gICAgICAgIC8vIHdoZW4gYW4gaW5wdXQgaXMgYmFjayBpbiBpdHMgXCJvcmlnaW5hbCBzdGF0ZVwiLCBiZWNhdXNlIHRoZSBhdHRyaWJ1dGVcbiAgICAgICAgLy8gd2FzIG5ldmVyIGNoYW5nZWQsIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzIxNjNcbiAgICAgICAgaWYobmFtZSA9PT0gXCJ2YWx1ZVwiICYmIHRhcmdldC52YWx1ZSA9PT0gc291cmNlLnZhbHVlKXtcbiAgICAgICAgICAvLyBhY3R1YWxseSBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byBzeW5jIGl0IHdpdGggdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlc1xuICAgIGZvcihsZXQgaSA9IHRhcmdldEF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgIGxldCBuYW1lID0gdGFyZ2V0QXR0cnNbaV0ubmFtZVxuICAgICAgaWYoaXNJZ25vcmVkKXtcbiAgICAgICAgaWYobmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiYgIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkgJiYgIVBIWF9QRU5ESU5HX0FUVFJTLmluY2x1ZGVzKG5hbWUpKXsgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZighc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSl7IHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUobmFtZSkgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXJnZUZvY3VzZWRJbnB1dCh0YXJnZXQsIHNvdXJjZSl7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpKXsgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHtleGNsdWRlOiBbXCJ2YWx1ZVwiXX0pIH1cblxuICAgIGlmKHNvdXJjZS5yZWFkT25seSl7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcInJlYWRvbmx5XCIpXG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKXtcbiAgICByZXR1cm4gZWwuc2V0U2VsZWN0aW9uUmFuZ2UgJiYgKGVsLnR5cGUgPT09IFwidGV4dFwiIHx8IGVsLnR5cGUgPT09IFwidGV4dGFyZWFcIilcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCl7XG4gICAgaWYoZm9jdXNlZCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KXsgZm9jdXNlZC5mb2N1cygpIH1cbiAgICBpZighRE9NLmlzVGV4dHVhbElucHV0KGZvY3VzZWQpKXsgcmV0dXJuIH1cblxuICAgIGxldCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpXG4gICAgaWYoIXdhc0ZvY3VzZWQpeyBmb2N1c2VkLmZvY3VzKCkgfVxuICAgIGlmKHRoaXMuaGFzU2VsZWN0aW9uUmFuZ2UoZm9jdXNlZCkpe1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKVxuICAgIH1cbiAgfSxcblxuICBpc0Zvcm1JbnB1dChlbCl7IHJldHVybiAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiIH0sXG5cbiAgc3luY0F0dHJzVG9Qcm9wcyhlbCl7XG4gICAgaWYoZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkpID49IDApe1xuICAgICAgZWwuY2hlY2tlZCA9IGVsLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIikgIT09IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgaXNUZXh0dWFsSW5wdXQoZWwpeyByZXR1cm4gRk9DVVNBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDAgfSxcblxuICBpc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCl7XG4gICAgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUocGh4VHJpZ2dlckV4dGVybmFsKSAhPT0gbnVsbFxuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSl7XG4gICAgaWYoRE9NLmlzUGh4VXBkYXRlKGNvbnRhaW5lciwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSl7XG4gICAgICBsZXQgdG9SZW1vdmUgPSBbXVxuICAgICAgY29udGFpbmVyLmNoaWxkTm9kZXMuZm9yRWFjaChjaGlsZE5vZGUgPT4ge1xuICAgICAgICBpZighY2hpbGROb2RlLmlkKXtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBsZXQgaXNFbXB0eVRleHROb2RlID0gY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PT0gXCJcIlxuICAgICAgICAgIGlmKCFpc0VtcHR5VGV4dE5vZGUgJiYgY2hpbGROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIm9ubHkgSFRNTCBlbGVtZW50IHRhZ3Mgd2l0aCBhbiBpZCBhcmUgYWxsb3dlZCBpbnNpZGUgY29udGFpbmVycyB3aXRoIHBoeC11cGRhdGUuXFxuXFxuXCIgK1xuICAgICAgICAgICAgICBgcmVtb3ZpbmcgaWxsZWdhbCBub2RlOiBcIiR7KGNoaWxkTm9kZS5vdXRlckhUTUwgfHwgY2hpbGROb2RlLm5vZGVWYWx1ZSkudHJpbSgpfVwiXFxuXFxuYClcbiAgICAgICAgICB9XG4gICAgICAgICAgdG9SZW1vdmUucHVzaChjaGlsZE5vZGUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB0b1JlbW92ZS5mb3JFYWNoKGNoaWxkTm9kZSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpXG4gICAgfVxuICB9LFxuXG4gIHJlcGxhY2VSb290Q29udGFpbmVyKGNvbnRhaW5lciwgdGFnTmFtZSwgYXR0cnMpe1xuICAgIGxldCByZXRhaW5lZEF0dHJzID0gbmV3IFNldChbXCJpZFwiLCBQSFhfU0VTU0lPTiwgUEhYX1NUQVRJQywgUEhYX01BSU4sIFBIWF9ST09UX0lEXSlcbiAgICBpZihjb250YWluZXIudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpe1xuICAgICAgQXJyYXkuZnJvbShjb250YWluZXIuYXR0cmlidXRlcylcbiAgICAgICAgLmZpbHRlcihhdHRyID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhhdHRyLm5hbWUudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgIC5mb3JFYWNoKGF0dHIgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKVxuXG4gICAgICBPYmplY3Qua2V5cyhhdHRycylcbiAgICAgICAgLmZpbHRlcihuYW1lID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaChhdHRyID0+IGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pKVxuXG4gICAgICByZXR1cm4gY29udGFpbmVyXG5cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGF0dHIgPT4gbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpXG4gICAgICByZXRhaW5lZEF0dHJzLmZvckVhY2goYXR0ciA9PiBuZXdDb250YWluZXIuc2V0QXR0cmlidXRlKGF0dHIsIGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoYXR0cikpKVxuICAgICAgbmV3Q29udGFpbmVyLmlubmVySFRNTCA9IGNvbnRhaW5lci5pbm5lckhUTUxcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpXG4gICAgICByZXR1cm4gbmV3Q29udGFpbmVyXG4gICAgfVxuICB9LFxuXG4gIGdldFN0aWNreShlbCwgbmFtZSwgZGVmYXVsdFZhbCl7XG4gICAgbGV0IG9wID0gKERPTS5wcml2YXRlKGVsLCBcInN0aWNreVwiKSB8fCBbXSkuZmluZCgoW2V4aXN0aW5nTmFtZSwgXSkgPT4gbmFtZSA9PT0gZXhpc3RpbmdOYW1lKVxuICAgIGlmKG9wKXtcbiAgICAgIGxldCBbX25hbWUsIF9vcCwgc3Rhc2hlZFJlc3VsdF0gPSBvcFxuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHR5cGVvZihkZWZhdWx0VmFsKSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbFxuICAgIH1cbiAgfSxcblxuICBkZWxldGVTdGlja3koZWwsIG5hbWUpe1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIG9wcyA9PiB7XG4gICAgICByZXR1cm4gb3BzLmZpbHRlcigoW2V4aXN0aW5nTmFtZSwgX10pID0+IGV4aXN0aW5nTmFtZSAhPT0gbmFtZSlcbiAgICB9KVxuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3Ape1xuICAgIGxldCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpXG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgb3BzID0+IHtcbiAgICAgIGxldCBleGlzdGluZ0luZGV4ID0gb3BzLmZpbmRJbmRleCgoW2V4aXN0aW5nTmFtZSwgXSkgPT4gbmFtZSA9PT0gZXhpc3RpbmdOYW1lKVxuICAgICAgaWYoZXhpc3RpbmdJbmRleCA+PSAwKXtcbiAgICAgICAgb3BzW2V4aXN0aW5nSW5kZXhdID0gW25hbWUsIG9wLCBzdGFzaGVkUmVzdWx0XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BzLnB1c2goW25hbWUsIG9wLCBzdGFzaGVkUmVzdWx0XSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHNcbiAgICB9KVxuICB9LFxuXG4gIGFwcGx5U3RpY2t5T3BlcmF0aW9ucyhlbCl7XG4gICAgbGV0IG9wcyA9IERPTS5wcml2YXRlKGVsLCBcInN0aWNreVwiKVxuICAgIGlmKCFvcHMpeyByZXR1cm4gfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERPTVxuIiwgImltcG9ydCB7XG4gIFBIWF9BQ1RJVkVfRU5UUllfUkVGUyxcbiAgUEhYX0xJVkVfRklMRV9VUERBVEVELFxuICBQSFhfUFJFRkxJR0hURURfUkVGU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBjaGFubmVsVXBsb2FkZXIsXG4gIGxvZ0Vycm9yXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkRW50cnkge1xuICBzdGF0aWMgaXNBY3RpdmUoZmlsZUVsLCBmaWxlKXtcbiAgICBsZXQgaXNOZXcgPSBmaWxlLl9waHhSZWYgPT09IHVuZGVmaW5lZFxuICAgIGxldCBhY3RpdmVSZWZzID0gZmlsZUVsLmdldEF0dHJpYnV0ZShQSFhfQUNUSVZFX0VOVFJZX1JFRlMpLnNwbGl0KFwiLFwiKVxuICAgIGxldCBpc0FjdGl2ZSA9IGFjdGl2ZVJlZnMuaW5kZXhPZihMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKSkgPj0gMFxuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSlcbiAgfVxuXG4gIHN0YXRpYyBpc1ByZWZsaWdodGVkKGZpbGVFbCwgZmlsZSl7XG4gICAgbGV0IHByZWZsaWdodGVkUmVmcyA9IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpLnNwbGl0KFwiLFwiKVxuICAgIGxldCBpc1ByZWZsaWdodGVkID0gcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDBcbiAgICByZXR1cm4gaXNQcmVmbGlnaHRlZCAmJiB0aGlzLmlzQWN0aXZlKGZpbGVFbCwgZmlsZSlcbiAgfVxuXG4gIHN0YXRpYyBpc1ByZWZsaWdodEluUHJvZ3Jlc3MoZmlsZSl7XG4gICAgcmV0dXJuIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPT09IHRydWVcbiAgfVxuXG4gIHN0YXRpYyBtYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhmaWxlKXtcbiAgICBmaWxlLl9wcmVmbGlnaHRJblByb2dyZXNzID0gdHJ1ZVxuICB9XG5cbiAgY29uc3RydWN0b3IoZmlsZUVsLCBmaWxlLCB2aWV3LCBhdXRvVXBsb2FkKXtcbiAgICB0aGlzLnJlZiA9IExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpXG4gICAgdGhpcy5maWxlRWwgPSBmaWxlRWxcbiAgICB0aGlzLmZpbGUgPSBmaWxlXG4gICAgdGhpcy52aWV3ID0gdmlld1xuICAgIHRoaXMubWV0YSA9IG51bGxcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlXG4gICAgdGhpcy5faXNEb25lID0gZmFsc2VcbiAgICB0aGlzLl9wcm9ncmVzcyA9IDBcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gLTFcbiAgICB0aGlzLl9vbkRvbmUgPSBmdW5jdGlvbigpeyB9XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcylcbiAgICB0aGlzLmZpbGVFbC5hZGRFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpXG4gICAgdGhpcy5hdXRvVXBsb2FkID0gYXV0b1VwbG9hZFxuICB9XG5cbiAgbWV0YWRhdGEoKXsgcmV0dXJuIHRoaXMubWV0YSB9XG5cbiAgcHJvZ3Jlc3MocHJvZ3Jlc3Mpe1xuICAgIHRoaXMuX3Byb2dyZXNzID0gTWF0aC5mbG9vcihwcm9ncmVzcylcbiAgICBpZih0aGlzLl9wcm9ncmVzcyA+IHRoaXMuX2xhc3RQcm9ncmVzc1NlbnQpe1xuICAgICAgaWYodGhpcy5fcHJvZ3Jlc3MgPj0gMTAwKXtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3MgPSAxMDBcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzU2VudCA9IDEwMFxuICAgICAgICB0aGlzLl9pc0RvbmUgPSB0cnVlXG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgMTAwLCAoKSA9PiB7XG4gICAgICAgICAgTGl2ZVVwbG9hZGVyLnVudHJhY2tGaWxlKHRoaXMuZmlsZUVsLCB0aGlzLmZpbGUpXG4gICAgICAgICAgdGhpcy5fb25Eb25lKClcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xhc3RQcm9ncmVzc1NlbnQgPSB0aGlzLl9wcm9ncmVzc1xuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIHRoaXMuX3Byb2dyZXNzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQ2FuY2VsbGVkKCl7IHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZCB9XG5cbiAgY2FuY2VsKCl7XG4gICAgdGhpcy5maWxlLl9wcmVmbGlnaHRJblByb2dyZXNzID0gZmFsc2VcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWVcbiAgICB0aGlzLl9pc0RvbmUgPSB0cnVlXG4gICAgdGhpcy5fb25Eb25lKClcbiAgfVxuXG4gIGlzRG9uZSgpeyByZXR1cm4gdGhpcy5faXNEb25lIH1cblxuICBlcnJvcihyZWFzb24gPSBcImZhaWxlZFwiKXtcbiAgICB0aGlzLmZpbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpXG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7ZXJyb3I6IHJlYXNvbn0pXG4gICAgaWYoIXRoaXMuaXNBdXRvVXBsb2FkKCkpeyBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbCkgfVxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCl7IHJldHVybiB0aGlzLmF1dG9VcGxvYWQgfVxuXG4gIC8vcHJpdmF0ZVxuXG4gIG9uRG9uZShjYWxsYmFjayl7XG4gICAgdGhpcy5fb25Eb25lID0gKCkgPT4ge1xuICAgICAgdGhpcy5maWxlRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKVxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuXG4gIG9uRWxVcGRhdGVkKCl7XG4gICAgbGV0IGFjdGl2ZVJlZnMgPSB0aGlzLmZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX0FDVElWRV9FTlRSWV9SRUZTKS5zcGxpdChcIixcIilcbiAgICBpZihhY3RpdmVSZWZzLmluZGV4T2YodGhpcy5yZWYpID09PSAtMSl7XG4gICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSlcbiAgICAgIHRoaXMuY2FuY2VsKClcbiAgICB9XG4gIH1cblxuICB0b1ByZWZsaWdodFBheWxvYWQoKXtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9tb2RpZmllZDogdGhpcy5maWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWU6IHRoaXMuZmlsZS5uYW1lLFxuICAgICAgcmVsYXRpdmVfcGF0aDogdGhpcy5maWxlLndlYmtpdFJlbGF0aXZlUGF0aCxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgbWV0YTogdHlwZW9mKHRoaXMuZmlsZS5tZXRhKSA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5maWxlLm1ldGEoKSA6IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIHVwbG9hZGVyKHVwbG9hZGVycyl7XG4gICAgaWYodGhpcy5tZXRhLnVwbG9hZGVyKXtcbiAgICAgIGxldCBjYWxsYmFjayA9IHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8IGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKVxuICAgICAgcmV0dXJuIHtuYW1lOiB0aGlzLm1ldGEudXBsb2FkZXIsIGNhbGxiYWNrOiBjYWxsYmFja31cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtuYW1lOiBcImNoYW5uZWxcIiwgY2FsbGJhY2s6IGNoYW5uZWxVcGxvYWRlcn1cbiAgICB9XG4gIH1cblxuICB6aXBQb3N0RmxpZ2h0KHJlc3Ape1xuICAgIHRoaXMubWV0YSA9IHJlc3AuZW50cmllc1t0aGlzLnJlZl1cbiAgICBpZighdGhpcy5tZXRhKXsgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7aW5wdXQ6IHRoaXMuZmlsZUVsLCByZXNwb25zZTogcmVzcH0pIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9ET05FX1JFRlMsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRlxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIlxuXG5sZXQgbGl2ZVVwbG9hZGVyRmlsZVJlZiA9IDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVVwbG9hZGVyIHtcbiAgc3RhdGljIGdlbkZpbGVSZWYoZmlsZSl7XG4gICAgbGV0IHJlZiA9IGZpbGUuX3BoeFJlZlxuICAgIGlmKHJlZiAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHJldHVybiByZWZcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuIGZpbGUuX3BoeFJlZlxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRFbnRyeURhdGFVUkwoaW5wdXRFbCwgcmVmLCBjYWxsYmFjayl7XG4gICAgbGV0IGZpbGUgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoZmlsZSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZilcbiAgICBjYWxsYmFjayhVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpKVxuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCl7XG4gICAgbGV0IGFjdGl2ZSA9IDBcbiAgICBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaWYoaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT0gaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpKXtcbiAgICAgICAgYWN0aXZlKytcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBhY3RpdmUgPiAwXG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKXtcbiAgICBsZXQgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpXG4gICAgbGV0IGZpbGVEYXRhID0ge31cbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgbGV0IGVudHJ5ID0ge3BhdGg6IGlucHV0RWwubmFtZX1cbiAgICAgIGxldCB1cGxvYWRSZWYgPSBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRilcbiAgICAgIGZpbGVEYXRhW3VwbG9hZFJlZl0gPSBmaWxlRGF0YVt1cGxvYWRSZWZdIHx8IFtdXG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSlcbiAgICAgIGVudHJ5Lmxhc3RfbW9kaWZpZWQgPSBmaWxlLmxhc3RNb2RpZmllZFxuICAgICAgZW50cnkubmFtZSA9IGZpbGUubmFtZSB8fCBlbnRyeS5yZWZcbiAgICAgIGVudHJ5LnJlbGF0aXZlX3BhdGggPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aFxuICAgICAgZW50cnkudHlwZSA9IGZpbGUudHlwZVxuICAgICAgZW50cnkuc2l6ZSA9IGZpbGUuc2l6ZVxuICAgICAgaWYodHlwZW9mKGZpbGUubWV0YSkgPT09IFwiZnVuY3Rpb25cIil7IGVudHJ5Lm1ldGEgPSBmaWxlLm1ldGEoKSB9XG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpXG4gICAgfSlcbiAgICByZXR1cm4gZmlsZURhdGFcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpe1xuICAgIGlucHV0RWwudmFsdWUgPSBudWxsXG4gICAgaW5wdXRFbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpXG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyB1bnRyYWNrRmlsZShpbnB1dEVsLCBmaWxlKXtcbiAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKGYgPT4gIU9iamVjdC5pcyhmLCBmaWxlKSkpXG4gIH1cblxuICBzdGF0aWMgdHJhY2tGaWxlcyhpbnB1dEVsLCBmaWxlcywgZGF0YVRyYW5zZmVyKXtcbiAgICBpZihpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKXtcbiAgICAgIGxldCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoZiA9PiBPYmplY3QuaXMoZiwgZmlsZSkpKVxuICAgICAgRE9NLnVwZGF0ZVByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSwgKGV4aXN0aW5nKSA9PiBleGlzdGluZy5jb25jYXQobmV3RmlsZXMpKVxuICAgICAgaW5wdXRFbC52YWx1ZSA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzZXQgaW5wdXRFbCBmaWxlcyB0byBhbGlnbiBvdXRwdXQgd2l0aCBwcm9ncmFtbWF0aWMgY2hhbmdlcyAoaS5lLiBkcmFnIGFuZCBkcm9wKVxuICAgICAgaWYoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKXsgaW5wdXRFbC5maWxlcyA9IGRhdGFUcmFuc2Zlci5maWxlcyB9XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlSW5wdXRzKGZvcm1FbCl7XG4gICAgbGV0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZmlsZUlucHV0cykuZmlsdGVyKGVsID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDApXG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZXMoaW5wdXQpe1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcihmID0+IFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSlcbiAgfVxuXG4gIHN0YXRpYyBpbnB1dHNBd2FpdGluZ1ByZWZsaWdodChmb3JtRWwpe1xuICAgIGxldCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihpbnB1dCA9PiB0aGlzLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXQpLmxlbmd0aCA+IDApXG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCl7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRmlsZXMoaW5wdXQpLmZpbHRlcihmID0+ICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodGVkKGlucHV0LCBmKSAmJiAhVXBsb2FkRW50cnkuaXNQcmVmbGlnaHRJblByb2dyZXNzKGYpKVxuICB9XG5cbiAgc3RhdGljIG1hcmtQcmVmbGlnaHRJblByb2dyZXNzKGVudHJpZXMpe1xuICAgIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiBVcGxvYWRFbnRyeS5tYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhlbnRyeS5maWxlKSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGlucHV0RWwsIHZpZXcsIG9uQ29tcGxldGUpe1xuICAgIHRoaXMuYXV0b1VwbG9hZCA9IERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbClcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5vbkNvbXBsZXRlID0gb25Db21wbGV0ZVxuICAgIHRoaXMuX2VudHJpZXMgPVxuICAgICAgQXJyYXkuZnJvbShMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKSB8fCBbXSlcbiAgICAgICAgLm1hcChmaWxlID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3LCB0aGlzLmF1dG9VcGxvYWQpKVxuXG4gICAgLy8gcHJldmVudCBzZW5kaW5nIGR1cGxpY2F0ZSBwcmVmbGlnaHQgcmVxdWVzdHNcbiAgICBMaXZlVXBsb2FkZXIubWFya1ByZWZsaWdodEluUHJvZ3Jlc3ModGhpcy5fZW50cmllcylcblxuICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPSB0aGlzLl9lbnRyaWVzLmxlbmd0aFxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCl7IHJldHVybiB0aGlzLmF1dG9VcGxvYWQgfVxuXG4gIGVudHJpZXMoKXsgcmV0dXJuIHRoaXMuX2VudHJpZXMgfVxuXG4gIGluaXRBZGFwdGVyVXBsb2FkKHJlc3AsIG9uRXJyb3IsIGxpdmVTb2NrZXQpe1xuICAgIHRoaXMuX2VudHJpZXMgPVxuICAgICAgdGhpcy5fZW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgICBpZihlbnRyeS5pc0NhbmNlbGxlZCgpKXtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS1cbiAgICAgICAgICBpZih0aGlzLm51bUVudHJpZXNJblByb2dyZXNzID09PSAwKXsgdGhpcy5vbkNvbXBsZXRlKCkgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudHJ5LnppcFBvc3RGbGlnaHQocmVzcClcbiAgICAgICAgICBlbnRyeS5vbkRvbmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcy0tXG4gICAgICAgICAgICBpZih0aGlzLm51bUVudHJpZXNJblByb2dyZXNzID09PSAwKXsgdGhpcy5vbkNvbXBsZXRlKCkgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgICB9KVxuXG4gICAgbGV0IGdyb3VwZWRFbnRyaWVzID0gdGhpcy5fZW50cmllcy5yZWR1Y2UoKGFjYywgZW50cnkpID0+IHtcbiAgICAgIGlmKCFlbnRyeS5tZXRhKXsgcmV0dXJuIGFjYyB9XG4gICAgICBsZXQge25hbWUsIGNhbGxiYWNrfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKVxuICAgICAgYWNjW25hbWVdID0gYWNjW25hbWVdIHx8IHtjYWxsYmFjazogY2FsbGJhY2ssIGVudHJpZXM6IFtdfVxuICAgICAgYWNjW25hbWVdLmVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgIHJldHVybiBhY2NcbiAgICB9LCB7fSlcblxuICAgIGZvcihsZXQgbmFtZSBpbiBncm91cGVkRW50cmllcyl7XG4gICAgICBsZXQge2NhbGxiYWNrLCBlbnRyaWVzfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdXG4gICAgICBjYWxsYmFjayhlbnRyaWVzLCBvbkVycm9yLCByZXNwLCBsaXZlU29ja2V0KVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9BQ1RJVkVfRU5UUllfUkVGUyxcbiAgUEhYX0xJVkVfRklMRV9VUERBVEVELFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUZcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcbmltcG9ydCBBUklBIGZyb20gXCIuL2FyaWFcIlxuXG5sZXQgSG9va3MgPSB7XG4gIExpdmVGaWxlVXBsb2FkOiB7XG4gICAgYWN0aXZlUmVmcygpeyByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0FDVElWRV9FTlRSWV9SRUZTKSB9LFxuXG4gICAgcHJlZmxpZ2h0ZWRSZWZzKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfUFJFRkxJR0hURURfUkVGUykgfSxcblxuICAgIG1vdW50ZWQoKXsgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IHRoaXMucHJlZmxpZ2h0ZWRSZWZzKCkgfSxcblxuICAgIHVwZGF0ZWQoKXtcbiAgICAgIGxldCBuZXdQcmVmbGlnaHRzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKVxuICAgICAgaWYodGhpcy5wcmVmbGlnaHRlZFdhcyAhPT0gbmV3UHJlZmxpZ2h0cyl7XG4gICAgICAgIHRoaXMucHJlZmxpZ2h0ZWRXYXMgPSBuZXdQcmVmbGlnaHRzXG4gICAgICAgIGlmKG5ld1ByZWZsaWdodHMgPT09IFwiXCIpe1xuICAgICAgICAgIHRoaXMuX192aWV3KCkuY2FuY2VsU3VibWl0KHRoaXMuZWwuZm9ybSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmFjdGl2ZVJlZnMoKSA9PT0gXCJcIil7IHRoaXMuZWwudmFsdWUgPSBudWxsIH1cbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoUEhYX0xJVkVfRklMRV9VUERBVEVEKSlcbiAgICB9XG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCl7XG4gICAgICB0aGlzLnJlZiA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZW50cnktcmVmXCIpXG4gICAgICB0aGlzLmlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikpXG4gICAgICBMaXZlVXBsb2FkZXIuZ2V0RW50cnlEYXRhVVJMKHRoaXMuaW5wdXRFbCwgdGhpcy5yZWYsIHVybCA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsXG4gICAgICAgIHRoaXMuZWwuc3JjID0gdXJsXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveWVkKCl7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMudXJsKVxuICAgIH1cbiAgfSxcbiAgRm9jdXNXcmFwOiB7XG4gICAgbW91bnRlZCgpe1xuICAgICAgdGhpcy5mb2N1c1N0YXJ0ID0gdGhpcy5lbC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgdGhpcy5mb2N1c0VuZCA9IHRoaXMuZWwubGFzdEVsZW1lbnRDaGlsZFxuICAgICAgdGhpcy5mb2N1c1N0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoKSA9PiBBUklBLmZvY3VzTGFzdCh0aGlzLmVsKSlcbiAgICAgIHRoaXMuZm9jdXNFbmQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsICgpID0+IEFSSUEuZm9jdXNGaXJzdCh0aGlzLmVsKSlcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpzaG93LWVuZFwiLCAoKSA9PiB0aGlzLmVsLmZvY3VzKCkpXG4gICAgICBpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsKS5kaXNwbGF5ICE9PSBcIm5vbmVcIil7XG4gICAgICAgIEFSSUEuZm9jdXNGaXJzdCh0aGlzLmVsKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5sZXQgZmluZFNjcm9sbENvbnRhaW5lciA9IChlbCkgPT4ge1xuICAvLyB0aGUgc2Nyb2xsIGV2ZW50IHdvbid0IGJlIGZpcmVkIG9uIHRoZSBodG1sL2JvZHkgZWxlbWVudCBldmVuIGlmIG92ZXJmbG93IGlzIHNldFxuICAvLyB0aGVyZWZvcmUgd2UgcmV0dXJuIG51bGwgdG8gaW5zdGVhZCBsaXN0ZW4gZm9yIHNjcm9sbCBldmVudHMgb24gZG9jdW1lbnRcbiAgaWYgKFtcIkhUTUxcIiwgXCJCT0RZXCJdLmluZGV4T2YoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSkgPj0gMCkgcmV0dXJuIG51bGxcbiAgaWYoW1wic2Nyb2xsXCIsIFwiYXV0b1wiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWwpLm92ZXJmbG93WSkgPj0gMCkgcmV0dXJuIGVsXG4gIHJldHVybiBmaW5kU2Nyb2xsQ29udGFpbmVyKGVsLnBhcmVudEVsZW1lbnQpXG59XG5cbmxldCBzY3JvbGxUb3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmKHNjcm9sbENvbnRhaW5lcil7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3BcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcFxuICB9XG59XG5cbmxldCBib3R0b20gPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmKHNjcm9sbENvbnRhaW5lcil7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b21cbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyLCB0aGUgd2hvbGUgcGFnZSBzY3JvbGxzLFxuICAgIC8vIHRoZXJlZm9yZSB0aGUgYm90dG9tIGNvb3JkaW5hdGUgaXMgdGhlIHZpZXdwb3J0IGhlaWdodFxuICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICB9XG59XG5cbmxldCB0b3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmKHNjcm9sbENvbnRhaW5lcil7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSB0b3AgY29vcmRpbmF0ZSBpcyAwXG4gICAgcmV0dXJuIDBcbiAgfVxufVxuXG5sZXQgaXNBdFZpZXdwb3J0VG9wID0gKGVsLCBzY3JvbGxDb250YWluZXIpID0+IHtcbiAgbGV0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICByZXR1cm4gTWF0aC5jZWlsKHJlY3QudG9wKSA+PSB0b3Aoc2Nyb2xsQ29udGFpbmVyKSAmJiBNYXRoLmNlaWwocmVjdC5sZWZ0KSA+PSAwICYmIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG59XG5cbmxldCBpc0F0Vmlld3BvcnRCb3R0b20gPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBsZXQgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gIHJldHVybiBNYXRoLmNlaWwocmVjdC5ib3R0b20pID49IHRvcChzY3JvbGxDb250YWluZXIpICYmIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiYgTWF0aC5mbG9vcihyZWN0LmJvdHRvbSkgPD0gYm90dG9tKHNjcm9sbENvbnRhaW5lcilcbn1cblxubGV0IGlzV2l0aGluVmlld3BvcnQgPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBsZXQgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gIHJldHVybiBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiYgTWF0aC5mbG9vcihyZWN0LnRvcCkgPD0gYm90dG9tKHNjcm9sbENvbnRhaW5lcilcbn1cblxuSG9va3MuSW5maW5pdGVTY3JvbGwgPSB7XG4gIG1vdW50ZWQoKXtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGZpbmRTY3JvbGxDb250YWluZXIodGhpcy5lbClcbiAgICBsZXQgc2Nyb2xsQmVmb3JlID0gc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsQ29udGFpbmVyKVxuICAgIGxldCB0b3BPdmVycmFuID0gZmFsc2VcbiAgICBsZXQgdGhyb3R0bGVJbnRlcnZhbCA9IDUwMFxuICAgIGxldCBwZW5kaW5nT3AgPSBudWxsXG5cbiAgICBsZXQgb25Ub3BPdmVycnVuID0gdGhpcy50aHJvdHRsZSh0aHJvdHRsZUludGVydmFsLCAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgIHBlbmRpbmdPcCA9ICgpID0+IHRydWVcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5leGVjSlNIb29rUHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge2lkOiBmaXJzdENoaWxkLmlkLCBfb3ZlcnJhbjogdHJ1ZX0sICgpID0+IHtcbiAgICAgICAgcGVuZGluZ09wID0gbnVsbFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgbGV0IG9uRmlyc3RDaGlsZEF0VG9wID0gdGhpcy50aHJvdHRsZSh0aHJvdHRsZUludGVydmFsLCAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgIHBlbmRpbmdPcCA9ICgpID0+IGZpcnN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiBcInN0YXJ0XCJ9KVxuICAgICAgdGhpcy5saXZlU29ja2V0LmV4ZWNKU0hvb2tQdXNoKHRoaXMuZWwsIHRvcEV2ZW50LCB7aWQ6IGZpcnN0Q2hpbGQuaWR9LCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdPcCA9IG51bGxcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIERPTSBpcyBwYXRjaGVkIGJ5IHdhaXRpbmcgZm9yIHRoZSBuZXh0IHRpY2tcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgaWYoIWlzV2l0aGluVmlld3BvcnQoZmlyc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKXtcbiAgICAgICAgICAgIGZpcnN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiBcInN0YXJ0XCJ9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGxldCBvbkxhc3RDaGlsZEF0Qm90dG9tID0gdGhpcy50aHJvdHRsZSh0aHJvdHRsZUludGVydmFsLCAoYm90dG9tRXZlbnQsIGxhc3RDaGlsZCkgPT4ge1xuICAgICAgcGVuZGluZ09wID0gKCkgPT4gbGFzdENoaWxkLnNjcm9sbEludG9WaWV3KHtibG9jazogXCJlbmRcIn0pXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTSG9va1B1c2godGhpcy5lbCwgYm90dG9tRXZlbnQsIHtpZDogbGFzdENoaWxkLmlkfSwgKCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSBudWxsXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgcGF0Y2hlZCBieSB3YWl0aW5nIGZvciB0aGUgbmV4dCB0aWNrXG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGlmKCFpc1dpdGhpblZpZXdwb3J0KGxhc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKXtcbiAgICAgICAgICAgIGxhc3RDaGlsZC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6IFwiZW5kXCJ9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMub25TY3JvbGwgPSAoX2UpID0+IHtcbiAgICAgIGxldCBzY3JvbGxOb3cgPSBzY3JvbGxUb3AodGhpcy5zY3JvbGxDb250YWluZXIpXG5cbiAgICAgIGlmKHBlbmRpbmdPcCl7XG4gICAgICAgIHNjcm9sbEJlZm9yZSA9IHNjcm9sbE5vd1xuICAgICAgICByZXR1cm4gcGVuZGluZ09wKClcbiAgICAgIH1cbiAgICAgIGxldCByZWN0ID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgbGV0IHRvcEV2ZW50ID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUodGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC10b3BcIikpXG4gICAgICBsZXQgYm90dG9tRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZSh0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhcInZpZXdwb3J0LWJvdHRvbVwiKSlcbiAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLmVsLmxhc3RFbGVtZW50Q2hpbGRcbiAgICAgIGxldCBmaXJzdENoaWxkID0gdGhpcy5lbC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgbGV0IGlzU2Nyb2xsaW5nVXAgPSBzY3JvbGxOb3cgPCBzY3JvbGxCZWZvcmVcbiAgICAgIGxldCBpc1Njcm9sbGluZ0Rvd24gPSBzY3JvbGxOb3cgPiBzY3JvbGxCZWZvcmVcblxuICAgICAgLy8gZWwgb3ZlcnJhbiB3aGlsZSBzY3JvbGxpbmcgdXBcbiAgICAgIGlmKGlzU2Nyb2xsaW5nVXAgJiYgdG9wRXZlbnQgJiYgIXRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPj0gMCl7XG4gICAgICAgIHRvcE92ZXJyYW4gPSB0cnVlXG4gICAgICAgIG9uVG9wT3ZlcnJ1bih0b3BFdmVudCwgZmlyc3RDaGlsZClcbiAgICAgIH0gZWxzZSBpZihpc1Njcm9sbGluZ0Rvd24gJiYgdG9wT3ZlcnJhbiAmJiByZWN0LnRvcCA8PSAwKXtcbiAgICAgICAgdG9wT3ZlcnJhbiA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmKHRvcEV2ZW50ICYmIGlzU2Nyb2xsaW5nVXAgJiYgaXNBdFZpZXdwb3J0VG9wKGZpcnN0Q2hpbGQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyKSl7XG4gICAgICAgIG9uRmlyc3RDaGlsZEF0VG9wKHRvcEV2ZW50LCBmaXJzdENoaWxkKVxuICAgICAgfSBlbHNlIGlmKGJvdHRvbUV2ZW50ICYmIGlzU2Nyb2xsaW5nRG93biAmJiBpc0F0Vmlld3BvcnRCb3R0b20obGFzdENoaWxkLCB0aGlzLnNjcm9sbENvbnRhaW5lcikpe1xuICAgICAgICBvbkxhc3RDaGlsZEF0Qm90dG9tKGJvdHRvbUV2ZW50LCBsYXN0Q2hpbGQpXG4gICAgICB9XG4gICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3dcbiAgICB9XG5cbiAgICBpZih0aGlzLnNjcm9sbENvbnRhaW5lcil7XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpXG4gICAgfVxuICB9LFxuICBcbiAgZGVzdHJveWVkKCl7XG4gICAgaWYodGhpcy5zY3JvbGxDb250YWluZXIpe1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKVxuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKVxuICAgIH1cbiAgfSxcblxuICB0aHJvdHRsZShpbnRlcnZhbCwgY2FsbGJhY2spe1xuICAgIGxldCBsYXN0Q2FsbEF0ID0gMFxuICAgIGxldCB0aW1lclxuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgbGV0IHJlbWFpbmluZ1RpbWUgPSBpbnRlcnZhbCAtIChub3cgLSBsYXN0Q2FsbEF0KVxuXG4gICAgICBpZihyZW1haW5pbmdUaW1lIDw9IDAgfHwgcmVtYWluaW5nVGltZSA+IGludGVydmFsKXtcbiAgICAgICAgaWYodGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgICAgdGltZXIgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgbGFzdENhbGxBdCA9IG5vd1xuICAgICAgICBjYWxsYmFjayguLi5hcmdzKVxuICAgICAgfSBlbHNlIGlmKCF0aW1lcil7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdENhbGxBdCA9IERhdGUubm93KClcbiAgICAgICAgICB0aW1lciA9IG51bGxcbiAgICAgICAgICBjYWxsYmFjayguLi5hcmdzKVxuICAgICAgICB9LCByZW1haW5pbmdUaW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgSG9va3NcbiIsICJpbXBvcnQge1xuICBQSFhfUkVGX0xPQURJTkcsXG4gIFBIWF9SRUZfTE9DSyxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9FVkVOVF9DTEFTU0VTLFxuICBQSFhfRElTQUJMRUQsXG4gIFBIWF9SRUFET05MWSxcbiAgUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlbWVudFJlZiB7XG4gIGNvbnN0cnVjdG9yKGVsKXtcbiAgICB0aGlzLmVsID0gZWxcbiAgICB0aGlzLmxvYWRpbmdSZWYgPSBlbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKSA/IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcpLCAxMCkgOiBudWxsXG4gICAgdGhpcy5sb2NrUmVmID0gZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9DSykgPyBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKSwgMTApIDogbnVsbFxuICB9XG5cbiAgLy8gcHVibGljXG5cbiAgbWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5pc1dpdGhpbihyZWYpKXsgcmV0dXJuIH1cblxuICAgIC8vIHVuZG8gbG9ja3MgYW5kIGFwcGx5IGNsb25lc1xuICAgIHRoaXMudW5kb0xvY2tzKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKVxuXG4gICAgLy8gdW5kbyBsb2FkaW5nIHN0YXRlc1xuICAgIHRoaXMudW5kb0xvYWRpbmcocmVmLCBwaHhFdmVudClcblxuICAgIC8vIGNsZWFuIHVwIGlmIGZ1bGx5IHJlc29sdmVkXG4gICAgaWYodGhpcy5pc0Z1bGx5UmVzb2x2ZWRCeShyZWYpKXsgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpIH1cbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBpc1dpdGhpbihyZWYpe1xuICAgIHJldHVybiAhKCh0aGlzLmxvYWRpbmdSZWYgIT09IG51bGwgJiYgdGhpcy5sb2FkaW5nUmVmID4gcmVmKSAmJiAodGhpcy5sb2NrUmVmICE9PSBudWxsICYmIHRoaXMubG9ja1JlZiA+IHJlZikpXG4gIH1cblxuICAvLyBDaGVjayBmb3IgY2xvbmVkIFBIWF9SRUZfTE9DSyBlbGVtZW50IHRoYXQgaGFzIGJlZW4gbW9ycGhlZCBiZWhpbmRcbiAgLy8gdGhlIHNjZW5lcyB3aGlsZSB0aGlzIGVsZW1lbnQgd2FzIGxvY2tlZCBpbiB0aGUgRE9NLlxuICAvLyBXaGVuIHdlIGFwcGx5IHRoZSBjbG9uZWQgdHJlZSB0byB0aGUgYWN0aXZlIERPTSBlbGVtZW50LCB3ZSBtdXN0XG4gIC8vXG4gIC8vICAgMS4gZXhlY3V0ZSBwZW5kaW5nIG1vdW50ZWQgaG9va3MgZm9yIG5vZGVzIG5vdyBpbiB0aGUgRE9NXG4gIC8vICAgMi4gdW5kbyBhbnkgcmVmIGluc2lkZSB0aGUgY2xvbmVkIHRyZWUgdGhhdCBoYXMgc2luY2UgYmVlbiBhY2snZFxuICB1bmRvTG9ja3MocmVmLCBwaHhFdmVudCwgZWFjaENsb25lQ2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmlzTG9ja1VuZG9uZUJ5KHJlZikpeyByZXR1cm4gfVxuXG4gICAgbGV0IGNsb25lZFRyZWUgPSBET00ucHJpdmF0ZSh0aGlzLmVsLCBQSFhfUkVGX0xPQ0spXG4gICAgaWYoY2xvbmVkVHJlZSl7XG4gICAgICBlYWNoQ2xvbmVDYWxsYmFjayhjbG9uZWRUcmVlKVxuICAgICAgRE9NLmRlbGV0ZVByaXZhdGUodGhpcy5lbCwgUEhYX1JFRl9MT0NLKVxuICAgIH1cbiAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spXG5cbiAgICBsZXQgb3B0cyA9IHtkZXRhaWw6IHtyZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50fSwgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogZmFsc2V9XG4gICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChgcGh4OnVuZG8tbG9jazoke3RoaXMubG9ja1JlZn1gLCBvcHRzKSlcbiAgfVxuXG4gIHVuZG9Mb2FkaW5nKHJlZiwgcGh4RXZlbnQpe1xuICAgIGlmKCF0aGlzLmlzTG9hZGluZ1VuZG9uZUJ5KHJlZikpe1xuICAgICAgaWYodGhpcy5jYW5VbmRvTG9hZGluZyhyZWYpICYmIHRoaXMuZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIpKXtcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKFwicGh4LWNoYW5nZS1sb2FkaW5nXCIpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZih0aGlzLmNhblVuZG9Mb2FkaW5nKHJlZikpe1xuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKVxuICAgICAgbGV0IGRpc2FibGVkVmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKVxuICAgICAgbGV0IHJlYWRPbmx5VmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKVxuICAgICAgLy8gcmVzdG9yZSBpbnB1dHNcbiAgICAgIGlmKHJlYWRPbmx5VmFsICE9PSBudWxsKXtcbiAgICAgICAgdGhpcy5lbC5yZWFkT25seSA9IHJlYWRPbmx5VmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZVxuICAgICAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVBRE9OTFkpXG4gICAgICB9XG4gICAgICBpZihkaXNhYmxlZFZhbCAhPT0gbnVsbCl7XG4gICAgICAgIHRoaXMuZWwuZGlzYWJsZWQgPSBkaXNhYmxlZFZhbCA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKVxuICAgICAgfVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgbGV0IGRpc2FibGVSZXN0b3JlID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKVxuICAgICAgaWYoZGlzYWJsZVJlc3RvcmUgIT09IG51bGwpe1xuICAgICAgICB0aGlzLmVsLmlubmVyVGV4dCA9IGRpc2FibGVSZXN0b3JlXG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSlcbiAgICAgIH1cblxuICAgICAgbGV0IG9wdHMgPSB7ZGV0YWlsOiB7cmVmOiByZWYsIGV2ZW50OiBwaHhFdmVudH0sIGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IGZhbHNlfVxuICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChgcGh4OnVuZG8tbG9hZGluZzoke3RoaXMubG9hZGluZ1JlZn1gLCBvcHRzKSlcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICBpZihuYW1lICE9PSBcInBoeC1zdWJtaXQtbG9hZGluZ1wiIHx8IHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSl7XG4gICAgICAgIERPTS5yZW1vdmVDbGFzcyh0aGlzLmVsLCBuYW1lKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBpc0xvYWRpbmdVbmRvbmVCeShyZWYpeyByZXR1cm4gdGhpcy5sb2FkaW5nUmVmID09PSBudWxsID8gZmFsc2UgOiB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmIH1cbiAgaXNMb2NrVW5kb25lQnkocmVmKXsgcmV0dXJuIHRoaXMubG9ja1JlZiA9PT0gbnVsbCA/IGZhbHNlIDogdGhpcy5sb2NrUmVmIDw9IHJlZiB9XG5cbiAgaXNGdWxseVJlc29sdmVkQnkocmVmKXtcbiAgICByZXR1cm4gKHRoaXMubG9hZGluZ1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmKSAmJiAodGhpcy5sb2NrUmVmID09PSBudWxsIHx8IHRoaXMubG9ja1JlZiA8PSByZWYpXG4gIH1cblxuICAvLyBvbmx5IHJlbW92ZSB0aGUgcGh4LXN1Ym1pdC1sb2FkaW5nIGNsYXNzIGlmIHdlIGFyZSBub3QgbG9ja2VkXG4gIGNhblVuZG9Mb2FkaW5nKHJlZil7IHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgfHwgdGhpcy5sb2NrUmVmIDw9IHJlZiB9XG59XG4iLCAiaW1wb3J0IHtcbiAgbWF5YmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERPTVBvc3RNb3JwaFJlc3RvcmVyIHtcbiAgY29uc3RydWN0b3IoY29udGFpbmVyQmVmb3JlLCBjb250YWluZXJBZnRlciwgdXBkYXRlVHlwZSl7XG4gICAgbGV0IGlkc0JlZm9yZSA9IG5ldyBTZXQoKVxuICAgIGxldCBpZHNBZnRlciA9IG5ldyBTZXQoWy4uLmNvbnRhaW5lckFmdGVyLmNoaWxkcmVuXS5tYXAoY2hpbGQgPT4gY2hpbGQuaWQpKVxuXG4gICAgbGV0IGVsZW1lbnRzVG9Nb2RpZnkgPSBbXVxuXG4gICAgQXJyYXkuZnJvbShjb250YWluZXJCZWZvcmUuY2hpbGRyZW4pLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYoY2hpbGQuaWQpeyAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKVxuICAgICAgICBpZihpZHNBZnRlci5oYXMoY2hpbGQuaWQpKXtcbiAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50SWQgPSBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWRcbiAgICAgICAgICBlbGVtZW50c1RvTW9kaWZ5LnB1c2goe2VsZW1lbnRJZDogY2hpbGQuaWQsIHByZXZpb3VzRWxlbWVudElkOiBwcmV2aW91c0VsZW1lbnRJZH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5jb250YWluZXJJZCA9IGNvbnRhaW5lckFmdGVyLmlkXG4gICAgdGhpcy51cGRhdGVUeXBlID0gdXBkYXRlVHlwZVxuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnlcbiAgICB0aGlzLmVsZW1lbnRJZHNUb0FkZCA9IFsuLi5pZHNBZnRlcl0uZmlsdGVyKGlkID0+ICFpZHNCZWZvcmUuaGFzKGlkKSlcbiAgfVxuXG4gIC8vIFdlIGRvIHRoZSBmb2xsb3dpbmcgdG8gb3B0aW1pemUgYXBwZW5kL3ByZXBlbmQgb3BlcmF0aW9uczpcbiAgLy8gICAxKSBUcmFjayBpZHMgb2YgbW9kaWZpZWQgZWxlbWVudHMgJiBvZiBuZXcgZWxlbWVudHNcbiAgLy8gICAyKSBBbGwgdGhlIG1vZGlmaWVkIGVsZW1lbnRzIGFyZSBwdXQgYmFjayBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgRE9NIHRyZWVcbiAgLy8gICAgICBieSBzdG9yaW5nIHRoZSBpZCBvZiB0aGVpciBwcmV2aW91cyBzaWJsaW5nXG4gIC8vICAgMykgTmV3IGVsZW1lbnRzIGFyZSBnb2luZyB0byBiZSBwdXQgaW4gdGhlIHJpZ2h0IHBsYWNlIGJ5IG1vcnBoZG9tIGR1cmluZyBhcHBlbmQuXG4gIC8vICAgICAgRm9yIHByZXBlbmQsIHdlIG1vdmUgdGhlbSB0byB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIGNvbnRhaW5lclxuICBwZXJmb3JtKCl7XG4gICAgbGV0IGNvbnRhaW5lciA9IERPTS5ieUlkKHRoaXMuY29udGFpbmVySWQpXG4gICAgdGhpcy5lbGVtZW50c1RvTW9kaWZ5LmZvckVhY2goZWxlbWVudFRvTW9kaWZ5ID0+IHtcbiAgICAgIGlmKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCl7XG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksIHByZXZpb3VzRWxlbSA9PiB7XG4gICAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudFRvTW9kaWZ5LmVsZW1lbnRJZCksIGVsZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZy5pZCA9PSBwcmV2aW91c0VsZW0uaWRcbiAgICAgICAgICAgIGlmKCFpc0luUmlnaHRQbGFjZSl7XG4gICAgICAgICAgICAgIHByZXZpb3VzRWxlbS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmVuZFwiLCBlbGVtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBjb250YWluZXJcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudFRvTW9kaWZ5LmVsZW1lbnRJZCksIGVsZW0gPT4ge1xuICAgICAgICAgIGxldCBpc0luUmlnaHRQbGFjZSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyA9PSBudWxsXG4gICAgICAgICAgaWYoIWlzSW5SaWdodFBsYWNlKXtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGVsZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZih0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpe1xuICAgICAgdGhpcy5lbGVtZW50SWRzVG9BZGQucmV2ZXJzZSgpLmZvckVhY2goZWxlbUlkID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgZWxlbSA9PiBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlbGVtKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCAidmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuZnVuY3Rpb24gbW9ycGhBdHRycyhmcm9tTm9kZSwgdG9Ob2RlKSB7XG4gICAgdmFyIHRvTm9kZUF0dHJzID0gdG9Ob2RlLmF0dHJpYnV0ZXM7XG4gICAgdmFyIGF0dHI7XG4gICAgdmFyIGF0dHJOYW1lO1xuICAgIHZhciBhdHRyTmFtZXNwYWNlVVJJO1xuICAgIHZhciBhdHRyVmFsdWU7XG4gICAgdmFyIGZyb21WYWx1ZTtcblxuICAgIC8vIGRvY3VtZW50LWZyYWdtZW50cyBkb250IGhhdmUgYXR0cmlidXRlcyBzbyBsZXRzIG5vdCBkbyBhbnl0aGluZ1xuICAgIGlmICh0b05vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgZnJvbU5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudFxuICAgIGZvciAodmFyIGkgPSB0b05vZGVBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhdHRyID0gdG9Ob2RlQXR0cnNbaV07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHIudmFsdWU7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyLnByZWZpeCA9PT0gJ3htbG5zJyl7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lOyAvLyBJdCdzIG5vdCBhbGxvd2VkIHRvIHNldCBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgWE1MTlMgbmFtZXNwYWNlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgYHhtbG5zYCBwcmVmaXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGV4dHJhIGF0dHJpYnV0ZXMgZm91bmQgb24gdGhlIG9yaWdpbmFsIERPTSBlbGVtZW50IHRoYXRcbiAgICAvLyB3ZXJlbid0IGZvdW5kIG9uIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAgICB2YXIgZnJvbU5vZGVBdHRycyA9IGZyb21Ob2RlLmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBkID0gZnJvbU5vZGVBdHRycy5sZW5ndGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICBhdHRyID0gZnJvbU5vZGVBdHRyc1tkXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcblxuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlKGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciByYW5nZTsgLy8gQ3JlYXRlIGEgcmFuZ2Ugb2JqZWN0IGZvciBlZmZpY2VudGx5IHJlbmRlcmluZyBzdHJpbmdzIHRvIGVsZW1lbnRzLlxudmFyIE5TX1hIVE1MID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuXG52YXIgZG9jID0gdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IGRvY3VtZW50O1xudmFyIEhBU19URU1QTEFURV9TVVBQT1JUID0gISFkb2MgJiYgJ2NvbnRlbnQnIGluIGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xudmFyIEhBU19SQU5HRV9TVVBQT1JUID0gISFkb2MgJiYgZG9jLmNyZWF0ZVJhbmdlICYmICdjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQnIGluIGRvYy5jcmVhdGVSYW5nZSgpO1xuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKSB7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgICByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKGRvYy5ib2R5KTtcbiAgICB9XG5cbiAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RyKTtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgnYm9keScpO1xuICAgIGZyYWdtZW50LmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFib3V0IHRoZSBzYW1lXG4gKiB2YXIgaHRtbCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoc3RyLCAndGV4dC9odG1sJyk7XG4gKiByZXR1cm4gaHRtbC5ib2R5LmZpcnN0Q2hpbGQ7XG4gKlxuICogQG1ldGhvZCB0b0VsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gdG9FbGVtZW50KHN0cikge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgaWYgKEhBU19URU1QTEFURV9TVVBQT1JUKSB7XG4gICAgICAvLyBhdm9pZCByZXN0cmljdGlvbnMgb24gY29udGVudCBmb3IgdGhpbmdzIGxpa2UgYDx0cj48dGg+SGk8L3RoPjwvdHI+YCB3aGljaFxuICAgICAgLy8gY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGRvZXNuJ3Qgc3VwcG9ydFxuICAgICAgLy8gPHRlbXBsYXRlPiBzdXBwb3J0IG5vdCBhdmFpbGFibGUgaW4gSUVcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpO1xuICAgIH0gZWxzZSBpZiAoSEFTX1JBTkdFX1NVUFBPUlQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHR3byBub2RlJ3MgbmFtZXMgYXJlIHRoZSBzYW1lLlxuICpcbiAqIE5PVEU6IFdlIGRvbid0IGJvdGhlciBjaGVja2luZyBgbmFtZXNwYWNlVVJJYCBiZWNhdXNlIHlvdSB3aWxsIG5ldmVyIGZpbmQgdHdvIEhUTUwgZWxlbWVudHMgd2l0aCB0aGUgc2FtZVxuICogICAgICAgbm9kZU5hbWUgYW5kIGRpZmZlcmVudCBuYW1lc3BhY2UgVVJJcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYiBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTmFtZXMoZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGZyb21Ob2RlTmFtZSA9IGZyb21FbC5ub2RlTmFtZTtcbiAgICB2YXIgdG9Ob2RlTmFtZSA9IHRvRWwubm9kZU5hbWU7XG4gICAgdmFyIGZyb21Db2RlU3RhcnQsIHRvQ29kZVN0YXJ0O1xuXG4gICAgaWYgKGZyb21Ob2RlTmFtZSA9PT0gdG9Ob2RlTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmcm9tQ29kZVN0YXJ0ID0gZnJvbU5vZGVOYW1lLmNoYXJDb2RlQXQoMCk7XG4gICAgdG9Db2RlU3RhcnQgPSB0b05vZGVOYW1lLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSB2aXJ0dWFsIERPTSBub2RlIG9yIFNWRyBub2RlIHRoZW4gd2UgbWF5XG4gICAgLy8gbmVlZCB0byBub3JtYWxpemUgdGhlIHRhZyBuYW1lIGJlZm9yZSBjb21wYXJpbmcuIE5vcm1hbCBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlXG4gICAgLy8gaW4gdGhlIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiXG4gICAgLy8gYXJlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlXG4gICAgaWYgKGZyb21Db2RlU3RhcnQgPD0gOTAgJiYgdG9Db2RlU3RhcnQgPj0gOTcpIHsgLy8gZnJvbSBpcyB1cHBlciBhbmQgdG8gaXMgbG93ZXJcbiAgICAgICAgcmV0dXJuIGZyb21Ob2RlTmFtZSA9PT0gdG9Ob2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSBpZiAodG9Db2RlU3RhcnQgPD0gOTAgJiYgZnJvbUNvZGVTdGFydCA+PSA5NykgeyAvLyB0byBpcyB1cHBlciBhbmQgZnJvbSBpcyBsb3dlclxuICAgICAgICByZXR1cm4gdG9Ob2RlTmFtZSA9PT0gZnJvbU5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZWxlbWVudCwgb3B0aW9uYWxseSB3aXRoIGEga25vd24gbmFtZXNwYWNlIFVSSS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZWxlbWVudCBuYW1lLCBlLmcuICdkaXYnIG9yICdzdmcnXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZVVSSV0gdGhlIGVsZW1lbnQncyBuYW1lc3BhY2UgVVJJLCBpLmUuIHRoZSB2YWx1ZSBvZlxuICogaXRzIGB4bWxuc2AgYXR0cmlidXRlIG9yIGl0cyBpbmZlcnJlZCBuYW1lc3BhY2UuXG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWUsIG5hbWVzcGFjZVVSSSkge1xuICAgIHJldHVybiAhbmFtZXNwYWNlVVJJIHx8IG5hbWVzcGFjZVVSSSA9PT0gTlNfWEhUTUwgP1xuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudChuYW1lKSA6XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGNoaWxkcmVuIG9mIG9uZSBET00gZWxlbWVudCB0byBhbm90aGVyIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIG1vdmVDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgdmFyIG5leHRDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB0b0VsLmFwcGVuZENoaWxkKGN1ckNoaWxkKTtcbiAgICAgICAgY3VyQ2hpbGQgPSBuZXh0Q2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiB0b0VsO1xufVxuXG5mdW5jdGlvbiBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgbmFtZSkge1xuICAgIGlmIChmcm9tRWxbbmFtZV0gIT09IHRvRWxbbmFtZV0pIHtcbiAgICAgICAgZnJvbUVsW25hbWVdID0gdG9FbFtuYW1lXTtcbiAgICAgICAgaWYgKGZyb21FbFtuYW1lXSkge1xuICAgICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgc3BlY2lhbEVsSGFuZGxlcnMgPSB7XG4gICAgT1BUSU9OOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBmcm9tRWwucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROYW1lID0gcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdPUFRHUk9VUCcpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJlbnROYW1lID09PSAnU0VMRUNUJyAmJiAhcGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUVsLmhhc0F0dHJpYnV0ZSgnc2VsZWN0ZWQnKSAmJiAhdG9FbC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBNUyBFZGdlIGJ1ZyB3aGVyZSB0aGUgJ3NlbGVjdGVkJyBhdHRyaWJ1dGUgY2FuIG9ubHkgYmVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZCBpZiBzZXQgdG8gYSBub24tZW1wdHkgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEyMDg3Njc5L1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHJlc2V0IHNlbGVjdCBlbGVtZW50J3Mgc2VsZWN0ZWRJbmRleCB0byAtMSwgb3RoZXJ3aXNlIHNldHRpbmdcbiAgICAgICAgICAgICAgICAvLyBmcm9tRWwuc2VsZWN0ZWQgdXNpbmcgdGhlIHN5bmNCb29sZWFuQXR0clByb3AgYmVsb3cgaGFzIG5vIGVmZmVjdC5cbiAgICAgICAgICAgICAgICAvLyBUaGUgY29ycmVjdCBzZWxlY3RlZEluZGV4IHdpbGwgYmUgc2V0IGluIHRoZSBTRUxFQ1Qgc3BlY2lhbCBoYW5kbGVyIGJlbG93LlxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnc2VsZWN0ZWQnKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGlzIHNwZWNpYWwgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgc2luY2UgaXQgc2V0c1xuICAgICAqIHRoZSBpbml0aWFsIHZhbHVlLiBDaGFuZ2luZyB0aGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSB3aXRob3V0IGNoYW5naW5nIHRoZVxuICAgICAqIFwidmFsdWVcIiBwcm9wZXJ0eSB3aWxsIGhhdmUgbm8gZWZmZWN0IHNpbmNlIGl0IGlzIG9ubHkgdXNlZCB0byB0aGUgc2V0IHRoZVxuICAgICAqIGluaXRpYWwgdmFsdWUuICBTaW1pbGFyIGZvciB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlLCBhbmQgXCJkaXNhYmxlZFwiLlxuICAgICAqL1xuICAgIElOUFVUOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdjaGVja2VkJyk7XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnZGlzYWJsZWQnKTtcblxuICAgICAgICBpZiAoZnJvbUVsLnZhbHVlICE9PSB0b0VsLnZhbHVlKSB7XG4gICAgICAgICAgICBmcm9tRWwudmFsdWUgPSB0b0VsLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0b0VsLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSkge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBURVhUQVJFQTogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBmcm9tRWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmaXJzdENoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICAgICAgICAvLyBOZWVkZWQgZm9yIElFLiBBcHBhcmVudGx5IElFIHNldHMgdGhlIHBsYWNlaG9sZGVyIGFzIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSB2YWx1ZSBhbmQgdmlzZSB2ZXJzYS4gVGhpcyBpZ25vcmVzIGFuIGVtcHR5IHVwZGF0ZS5cbiAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IGZpcnN0Q2hpbGQubm9kZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgfHwgKCFuZXdWYWx1ZSAmJiBvbGRWYWx1ZSA9PSBmcm9tRWwucGxhY2Vob2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBTRUxFQ1Q6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IC0xO1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBsb29wIHRocm91Z2ggY2hpbGRyZW4gb2YgZnJvbUVsLCBub3QgdG9FbCBzaW5jZSBub2RlcyBjYW4gYmUgbW92ZWRcbiAgICAgICAgICAgIC8vIGZyb20gdG9FbCB0byBmcm9tRWwgZGlyZWN0bHkgd2hlbiBtb3JwaGluZy5cbiAgICAgICAgICAgIC8vIEF0IHRoZSB0aW1lIHRoaXMgc3BlY2lhbCBoYW5kbGVyIGlzIGludm9rZWQsIGFsbCBjaGlsZHJlbiBoYXZlIGFscmVhZHkgYmVlbiBtb3JwaGVkXG4gICAgICAgICAgICAvLyBhbmQgYXBwZW5kZWQgdG8gLyByZW1vdmVkIGZyb20gZnJvbUVsLCBzbyB1c2luZyBmcm9tRWwgaGVyZSBpcyBzYWZlIGFuZCBjb3JyZWN0LlxuICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB2YXIgb3B0Z3JvdXA7XG4gICAgICAgICAgICB2YXIgbm9kZU5hbWU7XG4gICAgICAgICAgICB3aGlsZShjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gY3VyQ2hpbGQubm9kZU5hbWUgJiYgY3VyQ2hpbGQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdPUFRHUk9VUCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBjdXJDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICB0b05vZGUgPSB0b05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIHNraXBGcm9tQ2hpbGRyZW4gPSBvcHRpb25zLnNraXBGcm9tQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgYWRkQ2hpbGQgPSBvcHRpb25zLmFkZENoaWxkIHx8IGZ1bmN0aW9uKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsgfTtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG5cbiAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXllZFJlbW92YWxMaXN0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChza2lwS2V5ZWROb2RlcyAmJiAoa2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCkpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcga2V5ZWQgbm9kZXMgdGhlbiB3ZSBhZGQgdGhlIGtleVxuICAgICAgICAgICAgLy8gdG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIGhhbmRsZWQgYXQgdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCwgc2tpcEtleWVkTm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICpcbiAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBwYXJlbnROb2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gLy8gVHJlZVdhbGtlciBpbXBsZW1lbnRhdGlvbiBpcyBubyBmYXN0ZXIsIGJ1dCBrZWVwaW5nIHRoaXMgYXJvdW5kIGluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gICAgICAgICByb290LFxuICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgIC8vXG4gICAgLy8gICAgIHZhciBlbDtcbiAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAvLyAgICAgdmFyIGVsO1xuICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB1bm1hdGNoZWRGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBba2V5XTtcbiAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICBpZiAodW5tYXRjaGVkRnJvbUVsICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyQ2hpbGQsIHVubWF0Y2hlZEZyb21FbCkpIHtcbiAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgbW9ycGhFbCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgLy8gZnJvbU5vZGVzTG9va3VwXG4gICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1ckNoaWxkID0gbmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKChjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCkpKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAvLyBET00gc28gY2xlYXIgaXQgb3V0IG9mIHRoZSBzYXZlZCBlbGVtZW50cyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIHZhciBiZWZvcmVVcGRhdGVSZXN1bHQgPSBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpO1xuICAgICAgICBpZiAoYmVmb3JlVXBkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVVcGRhdGVSZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGZyb21FbCA9IGJlZm9yZVVwZGF0ZVJlc3VsdDtcbiAgICAgICAgICAvLyByZWluZGV4IHRoZSBuZXcgZnJvbUVsIGluIGNhc2UgaXQncyBub3QgaW4gdGhlIHNhbWVcbiAgICAgICAgICAvLyB0cmVlIGFzIHRoZSBvcmlnaW5hbCBmcm9tRWxcbiAgICAgICAgICAvLyAoUGhvZW5peCBMaXZlVmlldyBzb21ldGltZXMgcmV0dXJucyBhIGNsb25lZCB0cmVlLFxuICAgICAgICAgIC8vICBidXQga2V5ZWQgbG9va3VwcyB3b3VsZCBzdGlsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgdHJlZSlcbiAgICAgICAgICBpbmRleFRyZWUoZnJvbUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgIHZhciBza2lwRnJvbSA9IHNraXBGcm9tQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIHZhciBjdXJUb05vZGVDaGlsZCA9IHRvRWwuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICB2YXIgY3VyVG9Ob2RlS2V5O1xuICAgICAgdmFyIGN1ckZyb21Ob2RlS2V5O1xuXG4gICAgICB2YXIgZnJvbU5leHRTaWJsaW5nO1xuICAgICAgdmFyIHRvTmV4dFNpYmxpbmc7XG4gICAgICB2YXIgbWF0Y2hpbmdGcm9tRWw7XG5cbiAgICAgIC8vIHdhbGsgdGhlIGNoaWxkcmVuXG4gICAgICBvdXRlcjogd2hpbGUgKGN1clRvTm9kZUNoaWxkKSB7XG4gICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgLy8gd2FsayB0aGUgZnJvbU5vZGUgY2hpbGRyZW4gYWxsIHRoZSB3YXkgdGhyb3VnaFxuICAgICAgICB3aGlsZSAoIXNraXBGcm9tICYmIGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgaWYgKGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUgJiYgY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZShjdXJGcm9tTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgIHZhciBjdXJGcm9tTm9kZVR5cGUgPSBjdXJGcm9tTm9kZUNoaWxkLm5vZGVUeXBlO1xuXG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IGN1clRvTm9kZUNoaWxkLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTmV4dFNpYmxpbmcgPT09IG1hdGNoaW5nRnJvbUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaW5zdGVhZCBkaXNjYXJkIHRoZSBjdXJyZW50IG5vZGUgYW5kIHdhaXQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcga2V5ZWQgZWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgcmVwbGFjZUNoaWxkIGJlY2F1c2Ugd2Ugd2FudCB0byBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tRWwuaW5zZXJ0QmVmb3JlKG1hdGNoaW5nRnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBpc0NvbXBhdGlibGUgIT09IGZhbHNlICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgYm90aCB0aGUgXCJ0b1wiIGNoaWxkIGFuZCB0aGUgXCJmcm9tXCIgY2hpbGQgc2luY2Ugd2UgZm91bmQgYSBtYXRjaFxuICAgICAgICAgICAgLy8gTm90aGluZyBlbHNlIHRvIGRvIGFzIHdlIGFscmVhZHkgcmVjdXJzaXZlbHkgY2FsbGVkIG1vcnBoQ2hpbGRyZW4gYWJvdmVcbiAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgLy8gbWF0Y2ggaW4gdGhlIG9yaWdpbmFsIERPTS4gSG93ZXZlciwgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBmcm9tIG5vZGUgaXMgbm90IGtleWVkXG4gICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAvLyBob21lIGluIHRoZSBmaW5hbCBET00gdHJlZS4gQWZ0ZXIgZXZlcnl0aGluZyBpcyBkb25lIHdlIHdpbGwgcmVtb3ZlIGFueSBrZXllZCBub2Rlc1xuICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgIC8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIHdlIGRpZCBub3QgZmluZCBhIGNhbmRpZGF0ZSBtYXRjaCBmb3JcbiAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgIC8vIHRvIHRoZSBlbmRcbiAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICBpZighc2tpcEZyb20peyBhZGRDaGlsZChmcm9tRWwsIG1hdGNoaW5nRnJvbUVsKTsgfVxuICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZENoaWxkKGZyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgIH1cbiAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICB2YXIgbW9ycGhlZE5vZGVUeXBlID0gbW9ycGhlZE5vZGUubm9kZVR5cGU7XG4gICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHb2luZyBmcm9tIGFuIGVsZW1lbnQgbm9kZSB0byBhIHRleHQgbm9kZVxuICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IG1vcnBoZWROb2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7IC8vIFRleHQgb3IgY29tbWVudCBub2RlXG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAobW9ycGhlZE5vZGUubm9kZVZhbHVlICE9PSB0b05vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICBtb3JwaGVkTm9kZSA9IHRvTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49a2V5ZWRSZW1vdmFsTGlzdC5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICBtb3JwaGVkTm9kZSA9IG1vcnBoZWROb2RlLmFjdHVhbGl6ZShmcm9tTm9kZS5vd25lckRvY3VtZW50IHx8IGRvYyk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBoYWQgdG8gc3dhcCBvdXQgdGhlIGZyb20gbm9kZSB3aXRoIGEgbmV3IG5vZGUgYmVjYXVzZSB0aGUgb2xkXG4gICAgICAvLyBub2RlIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgbm9kZSB0aGVuIHdlIG5lZWQgdG9cbiAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgLy8gcG9zc2libGUgaWYgdGhlIG9yaWdpbmFsIERPTSBub2RlIHdhcyBwYXJ0IG9mIGEgRE9NIHRyZWUgd2hpY2hcbiAgICAgIC8vIHdlIGtub3cgaXMgdGhlIGNhc2UgaWYgaXQgaGFzIGEgcGFyZW50IG5vZGUuXG4gICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9NQUdJQ19JRCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfU1RSRUFNLFxuICBQSFhfU1RSRUFNX1JFRixcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgZGV0ZWN0RHVwbGljYXRlSWRzLFxuICBpc0NpZFxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBET01Qb3N0TW9ycGhSZXN0b3JlciBmcm9tIFwiLi9kb21fcG9zdF9tb3JwaF9yZXN0b3JlclwiXG5pbXBvcnQgbW9ycGhkb20gZnJvbSBcIm1vcnBoZG9tXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NUGF0Y2gge1xuICBzdGF0aWMgcGF0Y2hXaXRoQ2xvbmVkVHJlZShjb250YWluZXIsIGNsb25lZFRyZWUsIGxpdmVTb2NrZXQpe1xuICAgIGxldCBhY3RpdmVFbGVtZW50ID0gbGl2ZVNvY2tldC5nZXRBY3RpdmVFbGVtZW50KClcbiAgICBsZXQgcGh4VXBkYXRlID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9VUERBVEUpXG5cbiAgICBtb3JwaGRvbShjb250YWluZXIsIGNsb25lZFRyZWUsIHtcbiAgICAgIGNoaWxkcmVuT25seTogZmFsc2UsXG4gICAgICBvbkJlZm9yZUVsVXBkYXRlZDogKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgICBET00uc3luY1BlbmRpbmdBdHRycyhmcm9tRWwsIHRvRWwpXG4gICAgICAgIC8vIHdlIGNhbm5vdCBtb3JwaCBsb2NrZWQgY2hpbGRyZW5cbiAgICAgICAgaWYoIWNvbnRhaW5lci5pc1NhbWVOb2RlKGZyb21FbCkgJiYgZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgaWYoRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICBpZihhY3RpdmVFbGVtZW50ICYmIGFjdGl2ZUVsZW1lbnQuaXNTYW1lTm9kZShmcm9tRWwpICYmIERPTS5pc0Zvcm1JbnB1dChmcm9tRWwpKXtcbiAgICAgICAgICBET00ubWVyZ2VGb2N1c2VkSW5wdXQoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHN0cmVhbXMsIHRhcmdldENJRCl7XG4gICAgdGhpcy52aWV3ID0gdmlld1xuICAgIHRoaXMubGl2ZVNvY2tldCA9IHZpZXcubGl2ZVNvY2tldFxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyXG4gICAgdGhpcy5pZCA9IGlkXG4gICAgdGhpcy5yb290SUQgPSB2aWV3LnJvb3QuaWRcbiAgICB0aGlzLmh0bWwgPSBodG1sXG4gICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtc1xuICAgIHRoaXMuc3RyZWFtSW5zZXJ0cyA9IHt9XG4gICAgdGhpcy5zdHJlYW1Db21wb25lbnRSZXN0b3JlID0ge31cbiAgICB0aGlzLnRhcmdldENJRCA9IHRhcmdldENJRFxuICAgIHRoaXMuY2lkUGF0Y2ggPSBpc0NpZCh0aGlzLnRhcmdldENJRClcbiAgICB0aGlzLnBlbmRpbmdSZW1vdmVzID0gW11cbiAgICB0aGlzLnBoeFJlbW92ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFwicmVtb3ZlXCIpXG4gICAgdGhpcy50YXJnZXRDb250YWluZXIgPSB0aGlzLmlzQ0lEUGF0Y2goKSA/IHRoaXMudGFyZ2V0Q0lEQ29udGFpbmVyKGh0bWwpIDogY29udGFpbmVyXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7XG4gICAgICBiZWZvcmVhZGRlZDogW10sIGJlZm9yZXVwZGF0ZWQ6IFtdLCBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLCBhZnRlcnVwZGF0ZWQ6IFtdLCBhZnRlcmRpc2NhcmRlZDogW10sIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXVxuICAgIH1cbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjayl7IHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjaykgfVxuICBhZnRlcihraW5kLCBjYWxsYmFjayl7IHRoaXMuY2FsbGJhY2tzW2BhZnRlciR7a2luZH1gXS5wdXNoKGNhbGxiYWNrKSB9XG5cbiAgdHJhY2tCZWZvcmUoa2luZCwgLi4uYXJncyl7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKC4uLmFyZ3MpKVxuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKXtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0uZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayguLi5hcmdzKSlcbiAgfVxuXG4gIG1hcmtQcnVuYWJsZUNvbnRlbnRGb3JSZW1vdmFsKCl7XG4gICAgbGV0IHBoeFVwZGF0ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9VUERBVEUpXG4gICAgRE9NLmFsbCh0aGlzLmNvbnRhaW5lciwgYFske3BoeFVwZGF0ZX09YXBwZW5kXSA+ICosIFske3BoeFVwZGF0ZX09cHJlcGVuZF0gPiAqYCwgZWwgPT4ge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9QUlVORSwgXCJcIilcbiAgICB9KVxuICB9XG5cbiAgcGVyZm9ybShpc0pvaW5QYXRjaCl7XG4gICAgbGV0IHt2aWV3LCBsaXZlU29ja2V0LCBodG1sLCBjb250YWluZXIsIHRhcmdldENvbnRhaW5lcn0gPSB0aGlzXG4gICAgaWYodGhpcy5pc0NJRFBhdGNoKCkgJiYgIXRhcmdldENvbnRhaW5lcil7IHJldHVybiB9XG5cbiAgICBsZXQgZm9jdXNlZCA9IGxpdmVTb2NrZXQuZ2V0QWN0aXZlRWxlbWVudCgpXG4gICAgbGV0IHtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kfSA9IGZvY3VzZWQgJiYgRE9NLmhhc1NlbGVjdGlvblJhbmdlKGZvY3VzZWQpID8gZm9jdXNlZCA6IHt9XG4gICAgbGV0IHBoeFVwZGF0ZSA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKVxuICAgIGxldCBwaHhWaWV3cG9ydFRvcCA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfVklFV1BPUlRfVE9QKVxuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKVxuICAgIGxldCBwaHhUcmlnZ2VyRXh0ZXJuYWwgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1RSSUdHRVJfQUNUSU9OKVxuICAgIGxldCBhZGRlZCA9IFtdXG4gICAgbGV0IHVwZGF0ZXMgPSBbXVxuICAgIGxldCBhcHBlbmRQcmVwZW5kVXBkYXRlcyA9IFtdXG5cbiAgICBsZXQgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gbnVsbFxuXG4gICAgZnVuY3Rpb24gbW9ycGgodGFyZ2V0Q29udGFpbmVyLCBzb3VyY2UsIHdpdGhDaGlsZHJlbj1mYWxzZSl7XG4gICAgICBsZXQgbW9ycGhDYWxsYmFja3MgPSB7XG4gICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyB3aXRoIGNoaWxkcmVuT25seSwgYXMgdGhlIHBhdGNoIEhUTUwgZm9yIGEgTFZcbiAgICAgICAgLy8gZG9lcyBub3QgaW5jbHVkZSB0aGUgTFYgYXR0cnMgKGRhdGEtcGh4LXNlc3Npb24sIGV0Yy4pXG4gICAgICAgIC8vIHdoZW4gd2UgYXJlIHBhdGNoaW5nIGEgbGl2ZSBjb21wb25lbnQsIHdlIGRvIHdhbnQgdG8gcGF0Y2ggdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsO1xuICAgICAgICAvLyBhbm90aGVyIGNhc2UgaXMgdGhlIHJlY3Vyc2l2ZSBwYXRjaCBvZiBhIHN0cmVhbSBpdGVtIHRoYXQgd2FzIGtlcHQgb24gcmVzZXQgKC0+IG9uQmVmb3JlTm9kZUFkZGVkKVxuICAgICAgICBjaGlsZHJlbk9ubHk6IHRhcmdldENvbnRhaW5lci5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkgPT09IG51bGwgJiYgIXdpdGhDaGlsZHJlbixcbiAgICAgICAgZ2V0Tm9kZUtleTogKG5vZGUpID0+IHtcbiAgICAgICAgICBpZihET00uaXNQaHhEZXN0cm95ZWQobm9kZSkpeyByZXR1cm4gbnVsbCB9XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGpvaW4gcGF0Y2gsIHRoZW4gYnkgZGVmaW5pdGlvbiB0aGVyZSB3YXMgbm8gUEhYX01BR0lDX0lELlxuICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGVsZW1lbnRzIG1vcnBoZG9tIGRpc2NhcmRzLlxuICAgICAgICAgIGlmKGlzSm9pblBhdGNoKXsgcmV0dXJuIG5vZGUuaWQgfVxuICAgICAgICAgIHJldHVybiBub2RlLmlkIHx8IChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShQSFhfTUFHSUNfSUQpKVxuICAgICAgICB9LFxuICAgICAgICAvLyBza2lwIGluZGV4aW5nIGZyb20gY2hpbGRyZW4gd2hlbiBjb250YWluZXIgaXMgc3RyZWFtXG4gICAgICAgIHNraXBGcm9tQ2hpbGRyZW46IChmcm9tKSA9PiB7IHJldHVybiBmcm9tLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpID09PSBQSFhfU1RSRUFNIH0sXG4gICAgICAgIC8vIHRlbGwgbW9ycGhkb20gaG93IHRvIGFkZCBhIGNoaWxkXG4gICAgICAgIGFkZENoaWxkOiAocGFyZW50LCBjaGlsZCkgPT4ge1xuICAgICAgICAgIGxldCB7cmVmLCBzdHJlYW1BdH0gPSB0aGlzLmdldFN0cmVhbUluc2VydChjaGlsZClcbiAgICAgICAgICBpZihyZWYgPT09IHVuZGVmaW5lZCl7IHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RyZWFtUmVmKGNoaWxkLCByZWYpXG5cbiAgICAgICAgICAvLyBzdHJlYW1pbmdcbiAgICAgICAgICBpZihzdHJlYW1BdCA9PT0gMCl7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBjaGlsZClcbiAgICAgICAgICB9IGVsc2UgaWYoc3RyZWFtQXQgPT09IC0xKXtcbiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSBwYXJlbnQubGFzdEVsZW1lbnRDaGlsZFxuICAgICAgICAgICAgaWYobGFzdENoaWxkICYmICFsYXN0Q2hpbGQuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSl7XG4gICAgICAgICAgICAgIGxldCBub25TdHJlYW1DaGlsZCA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5maW5kKGMgPT4gIWMuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSlcbiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9uU3RyZWFtQ2hpbGQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmKHN0cmVhbUF0ID4gMCl7XG4gICAgICAgICAgICBsZXQgc2libGluZyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKVtzdHJlYW1BdF1cbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHNpYmxpbmcpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkJlZm9yZU5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKGVsLCBlbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKVxuICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBlbClcblxuICAgICAgICAgIGxldCBtb3JwaGVkRWwgPSBlbFxuICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJlYW0gaXRlbSB0aGF0IHdhcyBrZXB0IG9uIHJlc2V0LCByZWN1cnNpdmVseSBtb3JwaCBpdFxuICAgICAgICAgIGlmKHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF0pe1xuICAgICAgICAgICAgbW9ycGhlZEVsID0gdGhpcy5zdHJlYW1Db21wb25lbnRSZXN0b3JlW2VsLmlkXVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF1cbiAgICAgICAgICAgIG1vcnBoLmNhbGwodGhpcywgbW9ycGhlZEVsLCBlbCwgdHJ1ZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbW9ycGhlZEVsXG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICBpZihlbC5nZXRBdHRyaWJ1dGUpeyB0aGlzLm1heWJlUmVPcmRlclN0cmVhbShlbCwgdHJ1ZSkgfVxuXG4gICAgICAgICAgLy8gaGFjayB0byBmaXggU2FmYXJpIGhhbmRsaW5nIG9mIGltZyBzcmNzZXQgYW5kIHZpZGVvIHRhZ3NcbiAgICAgICAgICBpZihlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KXtcbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldFxuICAgICAgICAgIH0gZWxzZSBpZihlbCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgJiYgZWwuYXV0b3BsYXkpe1xuICAgICAgICAgICAgZWwucGxheSgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpe1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBuZXN0ZWQgdmlldyBoYW5kbGluZ1xuICAgICAgICAgIGlmKChET00uaXNQaHhDaGlsZChlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbCkpIHx8IERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJwaHhDaGlsZEFkZGVkXCIsIGVsKVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZGRlZC5wdXNoKGVsKVxuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVEaXNjYXJkZWQ6IChlbCkgPT4gdGhpcy5vbk5vZGVEaXNjYXJkZWQoZWwpLFxuICAgICAgICBvbkJlZm9yZU5vZGVEaXNjYXJkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIGlmKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BSVU5FKSAhPT0gbnVsbCl7IHJldHVybiB0cnVlIH1cbiAgICAgICAgICBpZihlbC5wYXJlbnRFbGVtZW50ICE9PSBudWxsICYmIGVsLmlkICYmXG4gICAgICAgICAgICBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50RWxlbWVudCwgcGh4VXBkYXRlLCBbUEhYX1NUUkVBTSwgXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodGhpcy5tYXliZVBlbmRpbmdSZW1vdmUoZWwpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICBpZih0aGlzLnNraXBDSURTaWJsaW5nKGVsKSl7IHJldHVybiBmYWxzZSB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSl7XG4gICAgICAgICAgICBleHRlcm5hbEZvcm1UcmlnZ2VyZWQgPSBlbFxuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpXG4gICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZWwsIGZhbHNlKVxuICAgICAgICB9LFxuICAgICAgICBvbkJlZm9yZUVsVXBkYXRlZDogKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgICAgIC8vIGlmIHdlIGFyZSBwYXRjaGluZyB0aGUgcm9vdCB0YXJnZXQgY29udGFpbmVyIGFuZCB0aGUgaWQgaGFzIGNoYW5nZWQsIHRyZWF0IGl0IGFzIGEgbmV3IG5vZGVcbiAgICAgICAgICAvLyBieSByZXBsYWNpbmcgdGhlIGZyb21FbCB3aXRoIHRoZSB0b0VsLCB3aGljaCBlbnN1cmVzIGhvb2tzIGFyZSB0b3JuIGRvd24gYW5kIHJlLWNyZWF0ZWRcbiAgICAgICAgICBpZihmcm9tRWwuaWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUodGFyZ2V0Q29udGFpbmVyKSAmJiBmcm9tRWwuaWQgIT09IHRvRWwuaWQpe1xuICAgICAgICAgICAgbW9ycGhDYWxsYmFja3Mub25Ob2RlRGlzY2FyZGVkKGZyb21FbClcbiAgICAgICAgICAgIGZyb21FbC5yZXBsYWNlV2l0aCh0b0VsKVxuICAgICAgICAgICAgcmV0dXJuIG1vcnBoQ2FsbGJhY2tzLm9uTm9kZUFkZGVkKHRvRWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIERPTS5zeW5jUGVuZGluZ0F0dHJzKGZyb21FbCwgdG9FbClcbiAgICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoZnJvbUVsLCB0b0VsLCBwaHhWaWV3cG9ydFRvcCwgcGh4Vmlld3BvcnRCb3R0b20pXG4gICAgICAgICAgRE9NLmNsZWFuQ2hpbGROb2Rlcyh0b0VsLCBwaHhVcGRhdGUpXG4gICAgICAgICAgaWYodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSl7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbGl2ZSBjb21wb25lbnQgdXNlZCBpbiBhIHN0cmVhbSwgd2UgbWF5IG5lZWQgdG8gcmVvcmRlciBpdFxuICAgICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZnJvbUVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKERPTS5pc1BoeFN0aWNreShmcm9tRWwpKXtcbiAgICAgICAgICAgIFtQSFhfU0VTU0lPTiwgUEhYX1NUQVRJQywgUEhYX1JPT1RfSURdXG4gICAgICAgICAgICAgIC5tYXAoYXR0ciA9PiBbYXR0ciwgZnJvbUVsLmdldEF0dHJpYnV0ZShhdHRyKSwgdG9FbC5nZXRBdHRyaWJ1dGUoYXR0cildKVxuICAgICAgICAgICAgICAuZm9yRWFjaCgoW2F0dHIsIGZyb21WYWwsIHRvVmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKHRvVmFsICYmIGZyb21WYWwgIT09IHRvVmFsKXsgZnJvbUVsLnNldEF0dHJpYnV0ZShhdHRyLCB0b1ZhbCkgfVxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkgfHwgKGZyb21FbC5mb3JtICYmIGZyb21FbC5mb3JtLmlzU2FtZU5vZGUoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKSkpe1xuICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7aXNJZ25vcmVkOiBET00uaXNJZ25vcmVkKGZyb21FbCwgcGh4VXBkYXRlKX0pXG4gICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKVxuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZnJvbUVsLnR5cGUgPT09IFwibnVtYmVyXCIgJiYgKGZyb21FbC52YWxpZGl0eSAmJiBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXQpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgIFBIWF9SRUZfU1JDLCBpdCBpcyBsb2FkaW5nIG9yIGxvY2tlZCBhbmQgYXdhaXRpbmcgYW4gYWNrLlxuICAgICAgICAgIC8vIElmIGl0J3MgbG9ja2VkLCB3ZSBjbG9uZSB0aGUgZnJvbUVsIHRyZWUgYW5kIGluc3RydWN0IG1vcnBoZG9tIHRvIHVzZVxuICAgICAgICAgIC8vIHRoZSBjbG9uZWQgdHJlZSBhcyB0aGUgc291cmNlIG9mIHRoZSBtb3JwaCBmb3IgdGhpcyBicmFuY2ggZnJvbSBoZXJlIG9uIG91dC5cbiAgICAgICAgICAvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgdHJlZSBpbiB0aGUgZWxlbWVudCdzIHByaXZhdGUgZGF0YSwgYW5kXG4gICAgICAgICAgLy8gb24gYWNrICh2aWV3LnVuZG9SZWZzKSwgd2UgbW9ycGggdGhlIGNsb25lZCB0cmVlIHdpdGggdGhlIHRydWUgZnJvbUVsIGluIHRoZSBET00gdG9cbiAgICAgICAgICAvLyBhcHBseSBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHdoaWxlIHRoZSBlbGVtZW50IHdhcyBsb2NrZWQuXG4gICAgICAgICAgbGV0IGlzRm9jdXNlZEZvcm1FbCA9IGZvY3VzZWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUoZm9jdXNlZCkgJiYgRE9NLmlzRm9ybUlucHV0KGZyb21FbClcbiAgICAgICAgICBsZXQgZm9jdXNlZFNlbGVjdENoYW5nZWQgPSBpc0ZvY3VzZWRGb3JtRWwgJiYgdGhpcy5pc0NoYW5nZWRTZWxlY3QoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgIGlmKGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKXtcbiAgICAgICAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGZyb21FbCkpe1xuICAgICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHtpc0lnbm9yZWQ6IHRydWV9KVxuICAgICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbClcbiAgICAgICAgICAgIGxldCBpc0xvY2tlZCA9IGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKVxuICAgICAgICAgICAgbGV0IGNsb25lID0gaXNMb2NrZWQgPyBET00ucHJpdmF0ZShmcm9tRWwsIFBIWF9SRUZfTE9DSykgfHwgZnJvbUVsLmNsb25lTm9kZSh0cnVlKSA6IG51bGxcbiAgICAgICAgICAgIGlmKGNsb25lKXtcbiAgICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGX0xPQ0ssIGNsb25lKVxuICAgICAgICAgICAgICBpZighaXNGb2N1c2VkRm9ybUVsKXtcbiAgICAgICAgICAgICAgICBmcm9tRWwgPSBjbG9uZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZihET00uaXNQaHhDaGlsZCh0b0VsKSl7XG4gICAgICAgICAgICBsZXQgcHJldlNlc3Npb24gPSBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKVxuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7ZXhjbHVkZTogW1BIWF9TVEFUSUNdfSlcbiAgICAgICAgICAgIGlmKHByZXZTZXNzaW9uICE9PSBcIlwiKXsgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgcHJldlNlc3Npb24pIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKVxuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpbnB1dCBoYW5kbGluZ1xuICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXModG9FbCwgZnJvbUVsKVxuXG4gICAgICAgICAgLy8gc2tpcCBwYXRjaGluZyBmb2N1c2VkIGlucHV0cyB1bmxlc3MgZm9jdXMgaXMgYSBzZWxlY3QgdGhhdCBoYXMgY2hhbmdlZCBvcHRpb25zXG4gICAgICAgICAgaWYoaXNGb2N1c2VkRm9ybUVsICYmIGZyb21FbC50eXBlICE9PSBcImhpZGRlblwiICYmICFmb2N1c2VkU2VsZWN0Q2hhbmdlZCl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00ubWVyZ2VGb2N1c2VkSW5wdXQoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgRE9NLnN5bmNBdHRyc1RvUHJvcHMoZnJvbUVsKVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZm9jdXNlZCBzZWxlY3QgaWYgaXQgY2hhbmdlZCBzbyBuYXRpdmUgVUkgaXMgdXBkYXRlZCAoaWUgc2FmYXJpIHdvbid0IHVwZGF0ZSB2aXNpYmxlIG9wdGlvbnMpXG4gICAgICAgICAgICBpZihmb2N1c2VkU2VsZWN0Q2hhbmdlZCl7IGZyb21FbC5ibHVyKCkgfVxuICAgICAgICAgICAgaWYoRE9NLmlzUGh4VXBkYXRlKHRvRWwsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiXSkpe1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKG5ldyBET01Qb3N0TW9ycGhSZXN0b3Jlcihmcm9tRWwsIHRvRWwsIHRvRWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyh0b0VsKVxuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyh0b0VsKVxuICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgcmV0dXJuIGZyb21FbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbW9ycGhkb20odGFyZ2V0Q29udGFpbmVyLCBzb3VyY2UsIG1vcnBoQ2FsbGJhY2tzKVxuICAgIH1cblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpXG4gICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgY29udGFpbmVyLCBjb250YWluZXIpXG5cbiAgICBsaXZlU29ja2V0LnRpbWUoXCJtb3JwaGRvbVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0cmVhbXMuZm9yRWFjaCgoW3JlZiwgaW5zZXJ0cywgZGVsZXRlSWRzLCByZXNldF0pID0+IHtcbiAgICAgICAgaW5zZXJ0cy5mb3JFYWNoKChba2V5LCBzdHJlYW1BdCwgbGltaXRdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdHJlYW1JbnNlcnRzW2tleV0gPSB7cmVmLCBzdHJlYW1BdCwgbGltaXQsIHJlc2V0fVxuICAgICAgICB9KVxuICAgICAgICBpZihyZXNldCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICBET00uYWxsKGNvbnRhaW5lciwgYFske1BIWF9TVFJFQU1fUkVGfT1cIiR7cmVmfVwiXWAsIGNoaWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlSWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgIGxldCBjaGlsZCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke2lkfVwiXWApXG4gICAgICAgICAgaWYoY2hpbGQpeyB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCkgfVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgLy8gY2xlYXIgc3RyZWFtIGl0ZW1zIGZyb20gdGhlIGRlYWQgcmVuZGVyIGlmIHRoZXkgYXJlIG5vdCBpbnNlcnRlZCBhZ2FpblxuICAgICAgaWYoaXNKb2luUGF0Y2gpe1xuICAgICAgICBET00uYWxsKHRoaXMuY29udGFpbmVyLCBgWyR7cGh4VXBkYXRlfT0ke1BIWF9TVFJFQU19XWAsIGVsID0+IHtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gb25seSByZW1vdmUgZWxlbWVudHMgb3duZWQgYnkgdGhlIGN1cnJlbnQgdmlld1xuICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzA0N1xuICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5vd25lcihlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgIGlmKHZpZXcgPT09IHRoaXMudmlldyl7XG4gICAgICAgICAgICAgIEFycmF5LmZyb20oZWwuY2hpbGRyZW4pLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIG1vcnBoLmNhbGwodGhpcywgdGFyZ2V0Q29udGFpbmVyLCBodG1sKVxuICAgIH0pXG5cbiAgICBpZihsaXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpe1xuICAgICAgZGV0ZWN0RHVwbGljYXRlSWRzKClcbiAgICAgIC8vIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBpbnB1dHMgbmFtZWQgXCJpZFwiXG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFtuYW1lPWlkXVwiKSkuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgaWYobm9kZS5mb3JtKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRGV0ZWN0ZWQgYW4gaW5wdXQgd2l0aCBuYW1lPVxcXCJpZFxcXCIgaW5zaWRlIGEgZm9ybSEgVGhpcyB3aWxsIGNhdXNlIHByb2JsZW1zIHdoZW4gcGF0Y2hpbmcgdGhlIERPTS5cXG5cIiwgbm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZihhcHBlbmRQcmVwZW5kVXBkYXRlcy5sZW5ndGggPiAwKXtcbiAgICAgIGxpdmVTb2NrZXQudGltZShcInBvc3QtbW9ycGggYXBwZW5kL3ByZXBlbmQgcmVzdG9yYXRpb25cIiwgKCkgPT4ge1xuICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5mb3JFYWNoKHVwZGF0ZSA9PiB1cGRhdGUucGVyZm9ybSgpKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT4gRE9NLnJlc3RvcmVGb2N1cyhmb2N1c2VkLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSlcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpXG4gICAgYWRkZWQuZm9yRWFjaChlbCA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpXG4gICAgdXBkYXRlcy5mb3JFYWNoKGVsID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKVxuXG4gICAgdGhpcy50cmFuc2l0aW9uUGVuZGluZ1JlbW92ZXMoKVxuXG4gICAgaWYoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKXtcbiAgICAgIGxpdmVTb2NrZXQudW5sb2FkKClcbiAgICAgIC8vIHVzZSBwcm90b3R5cGUncyBzdWJtaXQgaW4gY2FzZSB0aGVyZSdzIGEgZm9ybSBjb250cm9sIHdpdGggbmFtZSBvciBpZCBvZiBcInN1Ym1pdFwiXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEZvcm1FbGVtZW50L3N1Ym1pdFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkuc3VibWl0LmNhbGwoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgb25Ob2RlRGlzY2FyZGVkKGVsKXtcbiAgICAvLyBuZXN0ZWQgdmlldyBoYW5kbGluZ1xuICAgIGlmKERPTS5pc1BoeENoaWxkKGVsKSB8fCBET00uaXNQaHhTdGlja3koZWwpKXsgdGhpcy5saXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChlbCkgfVxuICAgIHRoaXMudHJhY2tBZnRlcihcImRpc2NhcmRlZFwiLCBlbClcbiAgfVxuXG4gIG1heWJlUGVuZGluZ1JlbW92ZShub2RlKXtcbiAgICBpZihub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSh0aGlzLnBoeFJlbW92ZSkgIT09IG51bGwpe1xuICAgICAgdGhpcy5wZW5kaW5nUmVtb3Zlcy5wdXNoKG5vZGUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpe1xuICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG5vZGUgaWYgaXQgaXMgYWN0dWFsbHkgcmUtYWRkZWQgaW4gdGhlIHNhbWUgcGF0Y2hcbiAgICAvLyB3ZSBkbyBOT1Qgd2FudCB0byBleGVjdXRlIHBoeC1yZW1vdmUsIHdlIGRvIE5PVCB3YW50IHRvIGNhbGwgb25Ob2RlRGlzY2FyZGVkXG4gICAgaWYodGhpcy5zdHJlYW1JbnNlcnRzW2NoaWxkLmlkXSl7XG4gICAgICB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbY2hpbGQuaWRdID0gY2hpbGRcbiAgICAgIGNoaWxkLnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9ubHkgcmVtb3ZlIHRoZSBlbGVtZW50IG5vdyBpZiBpdCBoYXMgbm8gcGh4LXJlbW92ZSBiaW5kaW5nXG4gICAgICBpZighdGhpcy5tYXliZVBlbmRpbmdSZW1vdmUoY2hpbGQpKXtcbiAgICAgICAgY2hpbGQucmVtb3ZlKClcbiAgICAgICAgdGhpcy5vbk5vZGVEaXNjYXJkZWQoY2hpbGQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RyZWFtSW5zZXJ0KGVsKXtcbiAgICBsZXQgaW5zZXJ0ID0gZWwuaWQgPyB0aGlzLnN0cmVhbUluc2VydHNbZWwuaWRdIDoge31cbiAgICByZXR1cm4gaW5zZXJ0IHx8IHt9XG4gIH1cblxuICBzZXRTdHJlYW1SZWYoZWwsIHJlZil7XG4gICAgRE9NLnB1dFN0aWNreShlbCwgUEhYX1NUUkVBTV9SRUYsIGVsID0+IGVsLnNldEF0dHJpYnV0ZShQSFhfU1RSRUFNX1JFRiwgcmVmKSlcbiAgfVxuXG4gIG1heWJlUmVPcmRlclN0cmVhbShlbCwgaXNOZXcpe1xuICAgIGxldCB7cmVmLCBzdHJlYW1BdCwgcmVzZXR9ID0gdGhpcy5nZXRTdHJlYW1JbnNlcnQoZWwpXG4gICAgaWYoc3RyZWFtQXQgPT09IHVuZGVmaW5lZCl7IHJldHVybiB9XG5cbiAgICAvLyB3ZSBuZWVkIHRvIHNldCB0aGUgUEhYX1NUUkVBTV9SRUYgaGVyZSBhcyB3ZWxsIGFzIGFkZENoaWxkIGlzIGludm9rZWQgb25seSBmb3IgcGFyZW50c1xuICAgIHRoaXMuc2V0U3RyZWFtUmVmKGVsLCByZWYpXG5cbiAgICBpZighcmVzZXQgJiYgIWlzTmV3KXtcbiAgICAgIC8vIHdlIG9ubHkgcmVvcmRlciBpZiB0aGUgZWxlbWVudCBpcyBuZXcgb3IgaXQncyBhIHN0cmVhbSByZXNldFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaGFzIGEgcGFyZW50IGVsZW1lbnQ7XG4gICAgLy8gaXQgZG9lc24ndCBpZiB3ZSBhcmUgY3VycmVudGx5IHJlY3Vyc2l2ZWx5IG1vcnBoaW5nIChyZXN0b3JpbmcgYSBzYXZlZCBzdHJlYW0gY2hpbGQpXG4gICAgLy8gYmVjYXVzZSB0aGUgZWxlbWVudCBpcyBub3QgeWV0IGFkZGVkIHRvIHRoZSByZWFsIGRvbTtcbiAgICAvLyByZW9yZGVyaW5nIGRvZXMgbm90IG1ha2Ugc2Vuc2UgaW4gdGhhdCBjYXNlIGFueXdheVxuICAgIGlmKCFlbC5wYXJlbnRFbGVtZW50KXsgcmV0dXJuIH1cblxuICAgIGlmKHN0cmVhbUF0ID09PSAwKXtcbiAgICAgIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsLCBlbC5wYXJlbnRFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKVxuICAgIH0gZWxzZSBpZihzdHJlYW1BdCA+IDApe1xuICAgICAgbGV0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKVxuICAgICAgbGV0IG9sZEluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbClcbiAgICAgIGlmKHN0cmVhbUF0ID49IGNoaWxkcmVuLmxlbmd0aCAtIDEpe1xuICAgICAgICBlbC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHNpYmxpbmcgPSBjaGlsZHJlbltzdHJlYW1BdF1cbiAgICAgICAgaWYob2xkSW5kZXggPiBzdHJlYW1BdCl7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5tYXliZUxpbWl0U3RyZWFtKGVsKVxuICB9XG5cbiAgbWF5YmVMaW1pdFN0cmVhbShlbCl7XG4gICAgbGV0IHtsaW1pdH0gPSB0aGlzLmdldFN0cmVhbUluc2VydChlbClcbiAgICBsZXQgY2hpbGRyZW4gPSBsaW1pdCAhPT0gbnVsbCAmJiBBcnJheS5mcm9tKGVsLnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pXG4gICAgaWYobGltaXQgJiYgbGltaXQgPCAwICYmIGNoaWxkcmVuLmxlbmd0aCA+IGxpbWl0ICogLTEpe1xuICAgICAgY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ubGVuZ3RoICsgbGltaXQpLmZvckVhY2goY2hpbGQgPT4gdGhpcy5yZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpKVxuICAgIH0gZWxzZSBpZihsaW1pdCAmJiBsaW1pdCA+PSAwICYmIGNoaWxkcmVuLmxlbmd0aCA+IGxpbWl0KXtcbiAgICAgIGNoaWxkcmVuLnNsaWNlKGxpbWl0KS5mb3JFYWNoKGNoaWxkID0+IHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKSlcbiAgICB9XG4gIH1cblxuICB0cmFuc2l0aW9uUGVuZGluZ1JlbW92ZXMoKXtcbiAgICBsZXQge3BlbmRpbmdSZW1vdmVzLCBsaXZlU29ja2V0fSA9IHRoaXNcbiAgICBpZihwZW5kaW5nUmVtb3Zlcy5sZW5ndGggPiAwKXtcbiAgICAgIGxpdmVTb2NrZXQudHJhbnNpdGlvblJlbW92ZXMocGVuZGluZ1JlbW92ZXMsIGZhbHNlLCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgIGxldCBjaGlsZCA9IERPTS5maXJzdFBoeENoaWxkKGVsKVxuICAgICAgICAgIGlmKGNoaWxkKXsgbGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoY2hpbGQpIH1cbiAgICAgICAgICBlbC5yZW1vdmUoKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJ0cmFuc2l0aW9uc0Rpc2NhcmRlZFwiLCBwZW5kaW5nUmVtb3ZlcylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCl7XG4gICAgaWYoIShmcm9tRWwgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkgfHwgZnJvbUVsLm11bHRpcGxlKXsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZihmcm9tRWwub3B0aW9ucy5sZW5ndGggIT09IHRvRWwub3B0aW9ucy5sZW5ndGgpeyByZXR1cm4gdHJ1ZSB9XG5cbiAgICAvLyBrZWVwIHRoZSBjdXJyZW50IHZhbHVlXG4gICAgdG9FbC52YWx1ZSA9IGZyb21FbC52YWx1ZVxuXG4gICAgLy8gaW4gZ2VuZXJhbCB3ZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCB3aXRoIHVzaW5nIGlzRXF1YWxOb2RlIGFzIGl0IGRvZXMgbm90IGEgcmVsaWFibGVcbiAgICAvLyBET00gdHJlZSBlcXVhbGl0eSBjaGVjaywgYnV0IGZvciBzZWxlY3Rpb24gYXR0cmlidXRlcyBhbmQgb3B0aW9ucyBpdCB3b3JrcyBmaW5lXG4gICAgcmV0dXJuICFmcm9tRWwuaXNFcXVhbE5vZGUodG9FbClcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKXsgcmV0dXJuIHRoaXMuY2lkUGF0Y2ggfVxuXG4gIHNraXBDSURTaWJsaW5nKGVsKXtcbiAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGVsLmhhc0F0dHJpYnV0ZShQSFhfU0tJUClcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKXtcbiAgICBpZighdGhpcy5pc0NJRFBhdGNoKCkpeyByZXR1cm4gfVxuICAgIGxldCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmNvbnRhaW5lciwgdGhpcy50YXJnZXRDSUQpXG4gICAgaWYocmVzdC5sZW5ndGggPT09IDAgJiYgRE9NLmNoaWxkTm9kZUxlbmd0aChodG1sKSA9PT0gMSl7XG4gICAgICByZXR1cm4gZmlyc3RcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGVcbiAgICB9XG4gIH1cblxuICBpbmRleE9mKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gQXJyYXkuZnJvbShwYXJlbnQuY2hpbGRyZW4pLmluZGV4T2YoY2hpbGQpIH1cbn1cbiIsICJpbXBvcnQge1xuICBDT01QT05FTlRTLFxuICBEWU5BTUlDUyxcbiAgVEVNUExBVEVTLFxuICBFVkVOVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9TS0lQLFxuICBQSFhfTUFHSUNfSUQsXG4gIFJFUExZLFxuICBTVEFUSUMsXG4gIFRJVExFLFxuICBTVFJFQU0sXG4gIFJPT1QsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBsb2dFcnJvcixcbiAgaXNDaWQsXG59IGZyb20gXCIuL3V0aWxzXCJcblxuY29uc3QgVk9JRF9UQUdTID0gbmV3IFNldChbXG4gIFwiYXJlYVwiLFxuICBcImJhc2VcIixcbiAgXCJiclwiLFxuICBcImNvbFwiLFxuICBcImNvbW1hbmRcIixcbiAgXCJlbWJlZFwiLFxuICBcImhyXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJrZXlnZW5cIixcbiAgXCJsaW5rXCIsXG4gIFwibWV0YVwiLFxuICBcInBhcmFtXCIsXG4gIFwic291cmNlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ3YnJcIlxuXSlcbmNvbnN0IHF1b3RlQ2hhcnMgPSBuZXcgU2V0KFtcIidcIiwgJ1wiJ10pXG5cbmV4cG9ydCBsZXQgbW9kaWZ5Um9vdCA9IChodG1sLCBhdHRycywgY2xlYXJJbm5lckhUTUwpID0+IHtcbiAgbGV0IGkgPSAwXG4gIGxldCBpbnNpZGVDb21tZW50ID0gZmFsc2VcbiAgbGV0IGJlZm9yZVRhZywgYWZ0ZXJUYWcsIHRhZywgdGFnTmFtZUVuZHNBdCwgaWQsIG5ld0hUTUxcblxuICBsZXQgbG9va2FoZWFkID0gaHRtbC5tYXRjaCgvXihcXHMqKD86PCEtLS4qPy0tPlxccyopKik8KFteXFxzXFwvPl0rKS8pXG4gIGlmKGxvb2thaGVhZCA9PT0gbnVsbCkgeyB0aHJvdyBuZXcgRXJyb3IoYG1hbGZvcm1lZCBodG1sICR7aHRtbH1gKSB9XG5cbiAgaSA9IGxvb2thaGVhZFswXS5sZW5ndGhcbiAgYmVmb3JlVGFnID0gbG9va2FoZWFkWzFdXG4gIHRhZyA9IGxvb2thaGVhZFsyXVxuICB0YWdOYW1lRW5kc0F0ID0gaVxuXG4gIC8vIFNjYW4gdGhlIG9wZW5pbmcgdGFnIGZvciBpZCwgaWYgdGhlcmUgaXMgYW55XG4gIGZvcihpOyBpIDwgaHRtbC5sZW5ndGg7IGkrKyl7XG4gICAgaWYoaHRtbC5jaGFyQXQoaSkgPT09IFwiPlwiICl7IGJyZWFrIH1cbiAgICBpZihodG1sLmNoYXJBdChpKSA9PT0gXCI9XCIpe1xuICAgICAgbGV0IGlzSWQgPSBodG1sLnNsaWNlKGkgLSAzLCBpKSA9PT0gXCIgaWRcIlxuICAgICAgaSsrO1xuICAgICAgbGV0IGNoYXIgPSBodG1sLmNoYXJBdChpKVxuICAgICAgaWYgKHF1b3RlQ2hhcnMuaGFzKGNoYXIpKSB7XG4gICAgICAgIGxldCBhdHRyU3RhcnRzQXQgPSBpXG4gICAgICAgIGkrK1xuICAgICAgICBmb3IoaTsgaSA8IGh0bWwubGVuZ3RoOyBpKyspe1xuICAgICAgICAgIGlmKGh0bWwuY2hhckF0KGkpID09PSBjaGFyKXsgYnJlYWsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0lkKSB7XG4gICAgICAgICAgaWQgPSBodG1sLnNsaWNlKGF0dHJTdGFydHNBdCArIDEsIGkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBjbG9zZUF0ID0gaHRtbC5sZW5ndGggLSAxXG4gIGluc2lkZUNvbW1lbnQgPSBmYWxzZVxuICB3aGlsZShjbG9zZUF0ID49IGJlZm9yZVRhZy5sZW5ndGggKyB0YWcubGVuZ3RoKXtcbiAgICBsZXQgY2hhciA9IGh0bWwuY2hhckF0KGNsb3NlQXQpXG4gICAgaWYoaW5zaWRlQ29tbWVudCl7XG4gICAgICBpZihjaGFyID09PSBcIi1cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAzLCBjbG9zZUF0KSA9PT0gXCI8IS1cIil7XG4gICAgICAgIGluc2lkZUNvbW1lbnQgPSBmYWxzZVxuICAgICAgICBjbG9zZUF0IC09IDRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb3NlQXQgLT0gMVxuICAgICAgfVxuICAgIH0gZWxzZSBpZihjaGFyID09PSBcIj5cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAyLCBjbG9zZUF0KSA9PT0gXCItLVwiKXtcbiAgICAgIGluc2lkZUNvbW1lbnQgPSB0cnVlXG4gICAgICBjbG9zZUF0IC09IDNcbiAgICB9IGVsc2UgaWYoY2hhciA9PT0gXCI+XCIpe1xuICAgICAgYnJlYWtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VBdCAtPSAxXG4gICAgfVxuICB9XG4gIGFmdGVyVGFnID0gaHRtbC5zbGljZShjbG9zZUF0ICsgMSwgaHRtbC5sZW5ndGgpXG5cbiAgbGV0IGF0dHJzU3RyID1cbiAgICBPYmplY3Qua2V5cyhhdHRycylcbiAgICAubWFwKGF0dHIgPT4gYXR0cnNbYXR0cl0gPT09IHRydWUgPyBhdHRyIDogYCR7YXR0cn09XCIke2F0dHJzW2F0dHJdfVwiYClcbiAgICAuam9pbihcIiBcIilcblxuICBpZihjbGVhcklubmVySFRNTCl7XG4gICAgLy8gS2VlcCB0aGUgaWQgaWYgYW55XG4gICAgbGV0IGlkQXR0clN0ciA9IGlkID8gYCBpZD1cIiR7aWR9XCJgIDogXCJcIjtcbiAgICBpZihWT0lEX1RBR1MuaGFzKHRhZykpe1xuICAgICAgbmV3SFRNTCA9IGA8JHt0YWd9JHtpZEF0dHJTdHJ9JHthdHRyc1N0ciA9PT0gXCJcIiA/IFwiXCIgOiBcIiBcIn0ke2F0dHJzU3RyfS8+YFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdIVE1MID0gYDwke3RhZ30ke2lkQXR0clN0cn0ke2F0dHJzU3RyID09PSBcIlwiID8gXCJcIiA6IFwiIFwifSR7YXR0cnNTdHJ9PjwvJHt0YWd9PmBcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlc3QgPSBodG1sLnNsaWNlKHRhZ05hbWVFbmRzQXQsIGNsb3NlQXQgKyAxKVxuICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0ke3Jlc3R9YFxuICB9XG5cbiAgcmV0dXJuIFtuZXdIVE1MLCBiZWZvcmVUYWcsIGFmdGVyVGFnXVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpe1xuICAgIGxldCB7W1JFUExZXTogcmVwbHksIFtFVkVOVFNdOiBldmVudHMsIFtUSVRMRV06IHRpdGxlfSA9IGRpZmZcbiAgICBkZWxldGUgZGlmZltSRVBMWV1cbiAgICBkZWxldGUgZGlmZltFVkVOVFNdXG4gICAgZGVsZXRlIGRpZmZbVElUTEVdXG4gICAgcmV0dXJuIHtkaWZmLCB0aXRsZSwgcmVwbHk6IHJlcGx5IHx8IG51bGwsIGV2ZW50czogZXZlbnRzIHx8IFtdfVxuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCl7XG4gICAgdGhpcy52aWV3SWQgPSB2aWV3SWRcbiAgICB0aGlzLnJlbmRlcmVkID0ge31cbiAgICB0aGlzLm1hZ2ljSWQgPSAwXG4gICAgdGhpcy5tZXJnZURpZmYocmVuZGVyZWQpXG4gIH1cblxuICBwYXJlbnRWaWV3SWQoKXsgcmV0dXJuIHRoaXMudmlld0lkIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcyl7XG4gICAgbGV0IFtzdHIsIHN0cmVhbXNdID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyh0aGlzLnJlbmRlcmVkLCB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLCBvbmx5Q2lkcywgdHJ1ZSwge30pXG4gICAgcmV0dXJuIFtzdHIsIHN0cmVhbXNdXG4gIH1cblxuICByZWN1cnNpdmVUb1N0cmluZyhyZW5kZXJlZCwgY29tcG9uZW50cyA9IHJlbmRlcmVkW0NPTVBPTkVOVFNdLCBvbmx5Q2lkcywgY2hhbmdlVHJhY2tpbmcsIHJvb3RBdHRycyl7XG4gICAgb25seUNpZHMgPSBvbmx5Q2lkcyA/IG5ldyBTZXQob25seUNpZHMpIDogbnVsbFxuICAgIGxldCBvdXRwdXQgPSB7YnVmZmVyOiBcIlwiLCBjb21wb25lbnRzOiBjb21wb25lbnRzLCBvbmx5Q2lkczogb25seUNpZHMsIHN0cmVhbXM6IG5ldyBTZXQoKX1cbiAgICB0aGlzLnRvT3V0cHV0QnVmZmVyKHJlbmRlcmVkLCBudWxsLCBvdXRwdXQsIGNoYW5nZVRyYWNraW5nLCByb290QXR0cnMpXG4gICAgcmV0dXJuIFtvdXRwdXQuYnVmZmVyLCBvdXRwdXQuc3RyZWFtc11cbiAgfVxuXG4gIGNvbXBvbmVudENJRHMoZGlmZil7IHJldHVybiBPYmplY3Qua2V5cyhkaWZmW0NPTVBPTkVOVFNdIHx8IHt9KS5tYXAoaSA9PiBwYXJzZUludChpKSkgfVxuXG4gIGlzQ29tcG9uZW50T25seURpZmYoZGlmZil7XG4gICAgaWYoIWRpZmZbQ09NUE9ORU5UU10peyByZXR1cm4gZmFsc2UgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDFcbiAgfVxuXG4gIGdldENvbXBvbmVudChkaWZmLCBjaWQpeyByZXR1cm4gZGlmZltDT01QT05FTlRTXVtjaWRdIH1cblxuICByZXNldFJlbmRlcihjaWQpe1xuICAgIC8vIHdlIGFyZSByYWNpbmcgYSBjb21wb25lbnQgZGVzdHJveSwgaXQgY291bGQgbm90IGV4aXN0LCBzb1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQgcmVzZXQgb24gdW5kZWZpbmVkXG4gICAgaWYodGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKXtcbiAgICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXS5yZXNldCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBtZXJnZURpZmYoZGlmZil7XG4gICAgbGV0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdXG4gICAgbGV0IGNhY2hlID0ge31cbiAgICBkZWxldGUgZGlmZltDT01QT05FTlRTXVxuICAgIHRoaXMucmVuZGVyZWQgPSB0aGlzLm11dGFibGVNZXJnZSh0aGlzLnJlbmRlcmVkLCBkaWZmKVxuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9XG5cbiAgICBpZihuZXdjKXtcbiAgICAgIGxldCBvbGRjID0gdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVxuXG4gICAgICBmb3IobGV0IGNpZCBpbiBuZXdjKXtcbiAgICAgICAgbmV3Y1tjaWRdID0gdGhpcy5jYWNoZWRGaW5kQ29tcG9uZW50KGNpZCwgbmV3Y1tjaWRdLCBvbGRjLCBuZXdjLCBjYWNoZSlcbiAgICAgIH1cblxuICAgICAgZm9yKGxldCBjaWQgaW4gbmV3Yyl7IG9sZGNbY2lkXSA9IG5ld2NbY2lkXSB9XG4gICAgICBkaWZmW0NPTVBPTkVOVFNdID0gbmV3Y1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpe1xuICAgIGlmKGNhY2hlW2NpZF0pe1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5kaWZmLCBzdGF0LCBzY2lkID0gY2RpZmZbU1RBVElDXVxuXG4gICAgICBpZihpc0NpZChzY2lkKSl7XG4gICAgICAgIGxldCB0ZGlmZlxuXG4gICAgICAgIGlmKHNjaWQgPiAwKXtcbiAgICAgICAgICB0ZGlmZiA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChzY2lkLCBuZXdjW3NjaWRdLCBvbGRjLCBuZXdjLCBjYWNoZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZGlmZiA9IG9sZGNbLXNjaWRdXG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXVxuICAgICAgICBuZGlmZiA9IHRoaXMuY2xvbmVNZXJnZSh0ZGlmZiwgY2RpZmYsIHRydWUpXG4gICAgICAgIG5kaWZmW1NUQVRJQ10gPSBzdGF0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9IGNkaWZmW1NUQVRJQ10gIT09IHVuZGVmaW5lZCB8fCBvbGRjW2NpZF0gPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgY2RpZmYgOiB0aGlzLmNsb25lTWVyZ2Uob2xkY1tjaWRdLCBjZGlmZiwgZmFsc2UpXG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZlxuICAgICAgcmV0dXJuIG5kaWZmXG4gICAgfVxuICB9XG5cbiAgbXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKXtcbiAgICBpZihzb3VyY2VbU1RBVElDXSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHJldHVybiBzb3VyY2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSlcbiAgICAgIHJldHVybiB0YXJnZXRcbiAgICB9XG4gIH1cblxuICBkb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSl7XG4gICAgZm9yKGxldCBrZXkgaW4gc291cmNlKXtcbiAgICAgIGxldCB2YWwgPSBzb3VyY2Vba2V5XVxuICAgICAgbGV0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldXG4gICAgICBsZXQgaXNPYmpWYWwgPSBpc09iamVjdCh2YWwpXG4gICAgICBpZihpc09ialZhbCAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICB0aGlzLmRvTXV0YWJsZU1lcmdlKHRhcmdldFZhbCwgdmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYodGFyZ2V0W1JPT1RdKXtcbiAgICAgIHRhcmdldC5uZXdSZW5kZXIgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gTWVyZ2VzIGNpZCB0cmVlcyB0b2dldGhlciwgY29weWluZyBzdGF0aWNzIGZyb20gc291cmNlIHRyZWUuXG4gIC8vXG4gIC8vIFRoZSBgcHJ1bmVNYWdpY0lkYCBpcyBwYXNzZWQgdG8gY29udHJvbCBwcnVuaW5nIHRoZSBtYWdpY0lkIG9mIHRoZVxuICAvLyB0YXJnZXQuIFdlIG11c3QgYWx3YXlzIHBydW5lIHRoZSBtYWdpY0lkIHdoZW4gd2UgYXJlIHNoYXJpbmcgc3RhdGljc1xuICAvLyBmcm9tIGFub3RoZXIgY29tcG9uZW50LiBJZiBub3QgcHJ1bmluZywgd2UgcmVwbGljYXRlIHRoZSBsb2dpYyBmcm9tXG4gIC8vIG11dGFibGVNZXJnZSwgd2hlcmUgd2Ugc2V0IG5ld1JlbmRlciB0byB0cnVlIGlmIHRoZXJlIGlzIGEgcm9vdFxuICAvLyAoZWZmZWN0aXZlbHkgZm9yY2luZyB0aGUgbmV3IHZlcnNpb24gdG8gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBza2lwcGVkKVxuICAvL1xuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlLCBwcnVuZU1hZ2ljSWQpe1xuICAgIGxldCBtZXJnZWQgPSB7Li4udGFyZ2V0LCAuLi5zb3VyY2V9XG4gICAgZm9yKGxldCBrZXkgaW4gbWVyZ2VkKXtcbiAgICAgIGxldCB2YWwgPSBzb3VyY2Vba2V5XVxuICAgICAgbGV0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldXG4gICAgICBpZihpc09iamVjdCh2YWwpICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSl7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsLCBwcnVuZU1hZ2ljSWQpXG4gICAgICB9IGVsc2UgaWYodmFsID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSl7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwge30sIHBydW5lTWFnaWNJZClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYocHJ1bmVNYWdpY0lkKXtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubWFnaWNJZFxuICAgICAgZGVsZXRlIG1lcmdlZC5uZXdSZW5kZXJcbiAgICB9IGVsc2UgaWYodGFyZ2V0W1JPT1RdKXtcbiAgICAgIG1lcmdlZC5uZXdSZW5kZXIgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRcbiAgfVxuXG4gIGNvbXBvbmVudFRvU3RyaW5nKGNpZCl7XG4gICAgbGV0IFtzdHIsIHN0cmVhbXNdID0gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyh0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLCBjaWQsIG51bGwpXG4gICAgbGV0IFtzdHJpcHBlZEhUTUwsIF9iZWZvcmUsIF9hZnRlcl0gPSBtb2RpZnlSb290KHN0ciwge30pXG4gICAgcmV0dXJuIFtzdHJpcHBlZEhUTUwsIHN0cmVhbXNdXG4gIH1cblxuICBwcnVuZUNJRHMoY2lkcyl7XG4gICAgY2lkcy5mb3JFYWNoKGNpZCA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKVxuICB9XG5cbiAgLy8gcHJpdmF0ZVxuXG4gIGdldCgpeyByZXR1cm4gdGhpcy5yZW5kZXJlZCB9XG5cbiAgaXNOZXdGaW5nZXJwcmludChkaWZmID0ge30peyByZXR1cm4gISFkaWZmW1NUQVRJQ10gfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcyl7XG4gICAgaWYodHlwZW9mIChwYXJ0KSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFydFxuICAgIH1cbiAgfVxuXG4gIG5leHRNYWdpY0lEKCl7XG4gICAgdGhpcy5tYWdpY0lkKytcbiAgICByZXR1cm4gYG0ke3RoaXMubWFnaWNJZH0tJHt0aGlzLnBhcmVudFZpZXdJZCgpfWBcbiAgfVxuXG4gIC8vIENvbnZlcnRzIHJlbmRlcmVkIHRyZWUgdG8gb3V0cHV0IGJ1ZmZlci5cbiAgLy9cbiAgLy8gY2hhbmdlVHJhY2tpbmcgY29udHJvbHMgaWYgd2UgY2FuIGFwcGx5IHRoZSBQSFhfU0tJUCBvcHRpbWl6YXRpb24uXG4gIC8vIEl0IGlzIGRpc2FibGVkIGZvciBjb21wcmVoZW5zaW9ucyBzaW5jZSB3ZSBtdXN0IHJlLXJlbmRlciB0aGUgZW50aXJlIGNvbGxlY3Rpb25cbiAgLy8gYW5kIG5vIGluZGl2aWR1YWwgZWxlbWVudCBpcyB0cmFja2VkIGluc2lkZSB0aGUgY29tcHJlaGVuc2lvbi5cbiAgdG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywgcm9vdEF0dHJzID0ge30pe1xuICAgIGlmKHJlbmRlcmVkW0RZTkFNSUNTXSl7IHJldHVybiB0aGlzLmNvbXByZWhlbnNpb25Ub0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpIH1cbiAgICBsZXQge1tTVEFUSUNdOiBzdGF0aWNzfSA9IHJlbmRlcmVkXG4gICAgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMoc3RhdGljcywgdGVtcGxhdGVzKVxuICAgIGxldCBpc1Jvb3QgPSByZW5kZXJlZFtST09UXVxuICAgIGxldCBwcmV2QnVmZmVyID0gb3V0cHV0LmJ1ZmZlclxuICAgIGlmKGlzUm9vdCl7IG91dHB1dC5idWZmZXIgPSBcIlwiIH1cblxuICAgIC8vIHRoaXMgY29uZGl0aW9uIGlzIGNhbGxlZCB3aGVuIGZpcnN0IHJlbmRlcmluZyBhbiBvcHRpbWl6YWJsZSBmdW5jdGlvbiBjb21wb25lbnQuXG4gICAgLy8gTEMgaGF2ZSB0aGVpciBtYWdpY0lkIHByZXZpb3VzbHkgc2V0XG4gICAgaWYoY2hhbmdlVHJhY2tpbmcgJiYgaXNSb290ICYmICFyZW5kZXJlZC5tYWdpY0lkKXtcbiAgICAgIHJlbmRlcmVkLm5ld1JlbmRlciA9IHRydWVcbiAgICAgIHJlbmRlcmVkLm1hZ2ljSWQgPSB0aGlzLm5leHRNYWdpY0lEKClcbiAgICB9XG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF1cbiAgICBmb3IobGV0IGkgPSAxOyBpIDwgc3RhdGljcy5sZW5ndGg7IGkrKyl7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZylcbiAgICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1tpXVxuICAgIH1cblxuICAgIC8vIEFwcGxpZXMgdGhlIHJvb3QgdGFnIFwic2tpcFwiIG9wdGltaXphdGlvbiBpZiBzdXBwb3J0ZWQsIHdoaWNoIGNsZWFyc1xuICAgIC8vIHRoZSByb290IHRhZyBhdHRyaWJ1dGVzIGFuZCBpbm5lckhUTUwsIGFuZCBvbmx5IG1haW50YWlucyB0aGUgbWFnaWNJZC5cbiAgICAvLyBXZSBjYW4gb25seSBza2lwIHdoZW4gY2hhbmdlVHJhY2tpbmcgaXMgc3VwcG9ydGVkIChvdXRzaWRlIG9mIGEgY29tcHJlaGVuc2lvbiksXG4gICAgLy8gYW5kIHdoZW4gdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgZXhwZXJpZW5jZWQgYW4gdW5yZW5kZXJlZCBtZXJnZSAobmV3UmVuZGVyIHRydWUpLlxuICAgIGlmKGlzUm9vdCl7XG4gICAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgICBsZXQgYXR0cnNcbiAgICAgIC8vIFdoZW4gYSBMQyBpcyByZS1hZGRlZCB0byB0aGUgcGFnZSwgd2UgbmVlZCB0byByZS1yZW5kZXIgdGhlIGVudGlyZSBMQyB0cmVlLFxuICAgICAgLy8gdGhlcmVmb3JlIGNoYW5nZVRyYWNraW5nIGlzIGZhbHNlOyBob3dldmVyLCB3ZSBuZWVkIHRvIGtlZXAgYWxsIHRoZSBtYWdpY0lkc1xuICAgICAgLy8gZnJvbSBhbnkgZnVuY3Rpb24gY29tcG9uZW50IHNvIHRoZSBuZXh0IHRpbWUgdGhlIExDIGlzIHVwZGF0ZWQsIHdlIGNhbiBhcHBseVxuICAgICAgLy8gdGhlIHNraXAgb3B0aW1pemF0aW9uXG4gICAgICBpZihjaGFuZ2VUcmFja2luZyB8fCByZW5kZXJlZC5tYWdpY0lkKXtcbiAgICAgICAgc2tpcCA9IGNoYW5nZVRyYWNraW5nICYmICFyZW5kZXJlZC5uZXdSZW5kZXJcbiAgICAgICAgYXR0cnMgPSB7W1BIWF9NQUdJQ19JRF06IHJlbmRlcmVkLm1hZ2ljSWQsIC4uLnJvb3RBdHRyc31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0dHJzID0gcm9vdEF0dHJzXG4gICAgICB9XG4gICAgICBpZihza2lwKXsgYXR0cnNbUEhYX1NLSVBdID0gdHJ1ZSB9XG4gICAgICBsZXQgW25ld1Jvb3QsIGNvbW1lbnRCZWZvcmUsIGNvbW1lbnRBZnRlcl0gPSBtb2RpZnlSb290KG91dHB1dC5idWZmZXIsIGF0dHJzLCBza2lwKVxuICAgICAgcmVuZGVyZWQubmV3UmVuZGVyID0gZmFsc2VcbiAgICAgIG91dHB1dC5idWZmZXIgPSBwcmV2QnVmZmVyICsgY29tbWVudEJlZm9yZSArIG5ld1Jvb3QgKyBjb21tZW50QWZ0ZXJcbiAgICB9XG4gIH1cblxuICBjb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0KXtcbiAgICBsZXQge1tEWU5BTUlDU106IGR5bmFtaWNzLCBbU1RBVElDXTogc3RhdGljcywgW1NUUkVBTV06IHN0cmVhbX0gPSByZW5kZXJlZFxuICAgIGxldCBbX3JlZiwgX2luc2VydHMsIGRlbGV0ZUlkcywgcmVzZXRdID0gc3RyZWFtIHx8IFtudWxsLCB7fSwgW10sIG51bGxdXG4gICAgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMoc3RhdGljcywgdGVtcGxhdGVzKVxuICAgIGxldCBjb21wVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU11cbiAgICBmb3IobGV0IGQgPSAwOyBkIDwgZHluYW1pY3MubGVuZ3RoOyBkKyspe1xuICAgICAgbGV0IGR5bmFtaWMgPSBkeW5hbWljc1tkXVxuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdXG4gICAgICBmb3IobGV0IGkgPSAxOyBpIDwgc3RhdGljcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIC8vIEluc2lkZSBhIGNvbXByZWhlbnNpb24sIHdlIGRvbid0IHRyYWNrIGhvdyBkeW5hbWljcyBjaGFuZ2VcbiAgICAgICAgLy8gb3ZlciB0aW1lIChhbmQgZmVhdHVyZXMgbGlrZSBzdHJlYW1zIHdvdWxkIG1ha2UgdGhhdCBpbXBvc3NpYmxlXG4gICAgICAgIC8vIHVubGVzcyB3ZSBtb3ZlIHRoZSBzdHJlYW0gZGlmZmluZyBhd2F5IGZyb20gbW9ycGhkb20pLFxuICAgICAgICAvLyBzbyB3ZSBjYW4ndCBwZXJmb3JtIHJvb3QgY2hhbmdlIHRyYWNraW5nLlxuICAgICAgICBsZXQgY2hhbmdlVHJhY2tpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihkeW5hbWljW2kgLSAxXSwgY29tcFRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZylcbiAgICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzW2ldXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoc3RyZWFtICE9PSB1bmRlZmluZWQgJiYgKHJlbmRlcmVkW0RZTkFNSUNTXS5sZW5ndGggPiAwIHx8IGRlbGV0ZUlkcy5sZW5ndGggPiAwIHx8IHJlc2V0KSl7XG4gICAgICBkZWxldGUgcmVuZGVyZWRbU1RSRUFNXVxuICAgICAgcmVuZGVyZWRbRFlOQU1JQ1NdID0gW11cbiAgICAgIG91dHB1dC5zdHJlYW1zLmFkZChzdHJlYW0pXG4gICAgfVxuICB9XG5cbiAgZHluYW1pY1RvQnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcpe1xuICAgIGlmKHR5cGVvZiAocmVuZGVyZWQpID09PSBcIm51bWJlclwiKXtcbiAgICAgIGxldCBbc3RyLCBzdHJlYW1zXSA9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcob3V0cHV0LmNvbXBvbmVudHMsIHJlbmRlcmVkLCBvdXRwdXQub25seUNpZHMpXG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0clxuICAgICAgb3V0cHV0LnN0cmVhbXMgPSBuZXcgU2V0KFsuLi5vdXRwdXQuc3RyZWFtcywgLi4uc3RyZWFtc10pXG4gICAgfSBlbHNlIGlmKGlzT2JqZWN0KHJlbmRlcmVkKSl7XG4gICAgICB0aGlzLnRvT3V0cHV0QnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcsIHt9KVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHJlbmRlcmVkXG4gICAgfVxuICB9XG5cbiAgcmVjdXJzaXZlQ0lEVG9TdHJpbmcoY29tcG9uZW50cywgY2lkLCBvbmx5Q2lkcyl7XG4gICAgbGV0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY2lkXSB8fCBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvciBDSUQgJHtjaWR9YCwgY29tcG9uZW50cylcbiAgICBsZXQgYXR0cnMgPSB7W1BIWF9DT01QT05FTlRdOiBjaWR9XG4gICAgbGV0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZClcbiAgICAvLyBUd28gb3B0aW1pemF0aW9uIHBhdGhzIGFwcGx5IGhlcmU6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBvbmx5Q2lkcyBvcHRpbWl6YXRpb24gd29ya3MgYnkgdGhlIHNlcnZlciBkaWZmIHRlbGxpbmcgdXMgb25seSBzcGVjaWZpY1xuICAgIC8vICAgICBjaWQncyBoYXZlIGNoYW5nZWQuIFRoaXMgYWxsb3dzIHVzIHRvIHNraXAgcmVuZGVyaW5nIGFueSBjb21wb25lbnQgdGhhdCBoYXNuJ3QgY2hhbmdlZCxcbiAgICAvLyAgICAgd2hpY2ggdWx0aW1hdGVseSBzZXRzIFBIWF9TS0lQIHJvb3QgYXR0cmlidXRlIGFuZCBhdm9pZHMgcmVuZGVyaW5nIHRoZSBpbm5lckhUTUwuXG4gICAgLy9cbiAgICAvLyAgIDIuIFRoZSByb290IFBIWF9TS0lQIG9wdGltaXphdGlvbiBnZW5lcmFsaXplcyB0byBhbGwgSEVFeCBmdW5jdGlvbiBjb21wb25lbnRzLCBhbmRcbiAgICAvLyAgICAgd29ya3MgaW4gdGhlIHNhbWUgUEhYX1NLSVAgYXR0cmlidXRlIGZhc2hpb24gYXMgMSwgYnV0IHRoZSBuZXdSZW5kZXIgdHJhY2tpbmcgaXMgZG9uZVxuICAgIC8vICAgICBhdCB0aGUgZ2VuZXJhbCBkaWZmIG1lcmdlIGxldmVsLiBJZiB3ZSBtZXJnZSBhIGRpZmYgd2l0aCBuZXcgZHluYW1pY3MsIHdlIG5lY2Vzc2FyaWx5IGhhdmVcbiAgICAvLyAgICAgZXhwZXJpZW5jZWQgYSBjaGFuZ2Ugd2hpY2ggbXVzdCBiZSBhIG5ld1JlbmRlciwgYW5kIHRodXMgd2UgY2FuJ3Qgc2tpcCB0aGUgcmVuZGVyLlxuICAgIC8vXG4gICAgLy8gQm90aCBvcHRpbWl6YXRpb24gZmxvd3MgYXBwbHkgaGVyZS4gbmV3UmVuZGVyIGlzIHNldCBiYXNlZCBvbiB0aGUgb25seUNpZHMgb3B0aW1pemF0aW9uLCBhbmRcbiAgICAvLyB3ZSB0cmFjayBhIGRldGVybWluaXN0aWMgbWFnaWNJZCBiYXNlZCBvbiB0aGUgY2lkLlxuICAgIC8vXG4gICAgLy8gY2hhbmdlVHJhY2tpbmcgaXMgYWJvdXQgdGhlIGVudGlyZSB0cmVlXG4gICAgLy8gbmV3UmVuZGVyIGlzIGFib3V0IHRoZSBjdXJyZW50IHJvb3QgaW4gdGhlIHRyZWVcbiAgICAvL1xuICAgIC8vIEJ5IGRlZmF1bHQgY2hhbmdlVHJhY2tpbmcgaXMgZW5hYmxlZCwgYnV0IHdlIHNwZWNpYWwgY2FzZSB0aGUgZmxvdyB3aGVyZSB0aGUgY2xpZW50IGlzIHBydW5pbmdcbiAgICAvLyBjaWRzIGFuZCB0aGUgc2VydmVyIGFkZHMgdGhlIGNvbXBvbmVudCBiYWNrLiBJbiBzdWNoIGNhc2VzLCB3ZSBleHBsaWNpdGx5IGRpc2FibGUgY2hhbmdlVHJhY2tpbmdcbiAgICAvLyB3aXRoIHJlc2V0UmVuZGVyIGZvciB0aGlzIGNpZCwgdGhlbiByZS1lbmFibGUgaXQgYWZ0ZXIgdGhlIHJlY3Vyc2l2ZSBjYWxsIHRvIHNraXAgdGhlIG9wdGltaXphdGlvblxuICAgIC8vIGZvciB0aGUgZW50aXJlIGNvbXBvbmVudCB0cmVlLlxuICAgIGNvbXBvbmVudC5uZXdSZW5kZXIgPSAhc2tpcFxuICAgIGNvbXBvbmVudC5tYWdpY0lkID0gYGMke2NpZH0tJHt0aGlzLnBhcmVudFZpZXdJZCgpfWBcbiAgICAvLyBlbmFibGUgY2hhbmdlIHRyYWNraW5nIGFzIGxvbmcgYXMgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYmVlbiByZXNldFxuICAgIGxldCBjaGFuZ2VUcmFja2luZyA9ICFjb21wb25lbnQucmVzZXRcbiAgICBsZXQgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhjb21wb25lbnQsIGNvbXBvbmVudHMsIG9ubHlDaWRzLCBjaGFuZ2VUcmFja2luZywgYXR0cnMpXG4gICAgLy8gZGlzYWJsZSByZXNldCBhZnRlciB3ZSd2ZSByZW5kZXJlZFxuICAgIGRlbGV0ZSBjb21wb25lbnQucmVzZXRcblxuICAgIHJldHVybiBbaHRtbCwgc3RyZWFtc11cbiAgfVxufVxuIiwgImltcG9ydCBKUyBmcm9tIFwiLi9qc1wiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5cbmNvbnN0IEhPT0tfSUQgPSBcImhvb2tJZFwiXG5cbmxldCB2aWV3SG9va0lEID0gMVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld0hvb2sge1xuICBzdGF0aWMgbWFrZUlEKCl7IHJldHVybiB2aWV3SG9va0lEKysgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsKXsgcmV0dXJuIERPTS5wcml2YXRlKGVsLCBIT09LX0lEKSB9XG5cbiAgY29uc3RydWN0b3IodmlldywgZWwsIGNhbGxiYWNrcyl7XG4gICAgdGhpcy5lbCA9IGVsXG4gICAgdGhpcy5fX2F0dGFjaFZpZXcodmlldylcbiAgICB0aGlzLl9fY2FsbGJhY2tzID0gY2FsbGJhY2tzXG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IGZhbHNlXG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgSE9PS19JRCwgdGhpcy5jb25zdHJ1Y3Rvci5tYWtlSUQoKSlcbiAgICBmb3IobGV0IGtleSBpbiB0aGlzLl9fY2FsbGJhY2tzKXsgdGhpc1trZXldID0gdGhpcy5fX2NhbGxiYWNrc1trZXldIH1cbiAgfVxuXG4gIF9fYXR0YWNoVmlldyh2aWV3KXtcbiAgICBpZih2aWV3KXtcbiAgICAgIHRoaXMuX192aWV3ID0gKCkgPT4gdmlld1xuICAgICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX192aWV3ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGhvb2sgbm90IHlldCBhdHRhY2hlZCB0byBhIGxpdmUgdmlldzogJHt0aGlzLmVsLm91dGVySFRNTH1gKVxuICAgICAgfVxuICAgICAgdGhpcy5saXZlU29ja2V0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9fbW91bnRlZCgpeyB0aGlzLm1vdW50ZWQgJiYgdGhpcy5tb3VudGVkKCkgfVxuICBfX3VwZGF0ZWQoKXsgdGhpcy51cGRhdGVkICYmIHRoaXMudXBkYXRlZCgpIH1cbiAgX19iZWZvcmVVcGRhdGUoKXsgdGhpcy5iZWZvcmVVcGRhdGUgJiYgdGhpcy5iZWZvcmVVcGRhdGUoKSB9XG4gIF9fZGVzdHJveWVkKCl7IHRoaXMuZGVzdHJveWVkICYmIHRoaXMuZGVzdHJveWVkKCkgfVxuICBfX3JlY29ubmVjdGVkKCl7XG4gICAgaWYodGhpcy5fX2lzRGlzY29ubmVjdGVkKXtcbiAgICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IGZhbHNlXG4gICAgICB0aGlzLnJlY29ubmVjdGVkICYmIHRoaXMucmVjb25uZWN0ZWQoKVxuICAgIH1cbiAgfVxuICBfX2Rpc2Nvbm5lY3RlZCgpe1xuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IHRydWVcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZCAmJiB0aGlzLmRpc2Nvbm5lY3RlZCgpXG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhlIGhvb2sgdG8gSlMgY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Vmlld0hvb2t9IGhvb2sgLSBUaGUgVmlld0hvb2sgaW5zdGFuY2UgdG8gYmluZC5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBtYW5pcHVsYXRlIHRoZSBET00gYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdC5cbiAgICovXG4gIGpzKCl7XG4gICAgbGV0IGhvb2sgPSB0aGlzXG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBFeGVjdXRlcyBlbmNvZGVkIEphdmFTY3JpcHQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGhvb2sgZWxlbWVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZEpTIC0gVGhlIGVuY29kZWQgSmF2YVNjcmlwdCBzdHJpbmcgdG8gZXhlY3V0ZS5cbiAgICAgICAqL1xuICAgICAgZXhlYyhlbmNvZGVkSlMpe1xuICAgICAgICBob29rLl9fdmlldygpLmxpdmVTb2NrZXQuZXhlY0pTKGhvb2suZWwsIGVuY29kZWRKUywgXCJob29rXCIpXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNob3dzIGFuIGVsZW1lbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgLSBUaGUgZWxlbWVudCB0byBzaG93LlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmRpc3BsYXldIC0gVGhlIENTUyBkaXNwbGF5IHZhbHVlIHRvIHNldC4gRGVmYXVsdHMgXCJibG9ja1wiLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRyYW5zaXRpb25dIC0gVGhlIENTUyB0cmFuc2l0aW9uIGNsYXNzZXMgdG8gc2V0IHdoZW4gc2hvd2luZy5cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lXSAtIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgMjAwLlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5ibG9ja2luZ10gLSBUaGUgYm9vbGVhbiBmbGFnIHRvIGJsb2NrIHRoZSBVSSBkdXJpbmcgdGhlIHRyYW5zaXRpb24uXG4gICAgICAgKiAgRGVmYXVsdHMgYHRydWVgLlxuICAgICAgICovXG4gICAgICBzaG93KGVsLCBvcHRzID0ge30pe1xuICAgICAgICBsZXQgb3duZXIgPSBob29rLl9fdmlldygpLmxpdmVTb2NrZXQub3duZXIoZWwpXG4gICAgICAgIEpTLnNob3coXCJob29rXCIsIG93bmVyLCBlbCwgb3B0cy5kaXNwbGF5LCBvcHRzLnRyYW5zaXRpb24sIG9wdHMudGltZSwgb3B0cy5ibG9ja2luZylcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogSGlkZXMgYW4gZWxlbWVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBlbGVtZW50IHRvIGhpZGUuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudHJhbnNpdGlvbl0gLSBUaGUgQ1NTIHRyYW5zaXRpb24gY2xhc3NlcyB0byBzZXQgd2hlbiBoaWRpbmcuXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZV0gLSBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIDIwMC5cbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuYmxvY2tpbmddIC0gVGhlIGJvb2xlYW4gZmxhZyB0byBibG9jayB0aGUgVUkgZHVyaW5nIHRoZSB0cmFuc2l0aW9uLlxuICAgICAgICogICBEZWZhdWx0cyBgdHJ1ZWAuXG4gICAgICAgKi9cbiAgICAgIGhpZGUoZWwsIG9wdHMgPSB7fSl7XG4gICAgICAgIGxldCBvd25lciA9IGhvb2suX192aWV3KCkubGl2ZVNvY2tldC5vd25lcihlbClcbiAgICAgICAgSlMuaGlkZShcImhvb2tcIiwgb3duZXIsIGVsLCBudWxsLCBvcHRzLnRyYW5zaXRpb24sIG9wdHMudGltZSwgb3B0cy5ibG9ja2luZylcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlcyB0aGUgdmlzaWJpbGl0eSBvZiBhbiBlbGVtZW50LlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIGVsZW1lbnQgdG8gdG9nZ2xlLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmRpc3BsYXldIC0gVGhlIENTUyBkaXNwbGF5IHZhbHVlIHRvIHNldC4gRGVmYXVsdHMgXCJibG9ja1wiLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmluXSAtIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIGZvciBzaG93aW5nLlxuICAgICAgICogICBBY2NlcHRzIGVpdGhlciB0aGUgc3RyaW5nIG9mIGNsYXNzZXMgdG8gYXBwbHkgd2hlbiB0b2dnbGluZyBpbiwgb3JcbiAgICAgICAqICAgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHRyYW5zaXRpb24gY2xhc3MsIHRoZSBjbGFzcyB0byBhcHBseVxuICAgICAgICogICB0byBzdGFydCB0aGUgdHJhbnNpdGlvbiwgYW5kIHRoZSBlbmRpbmcgdHJhbnNpdGlvbiBjbGFzcywgc3VjaCBhczpcbiAgICAgICAqXG4gICAgICAgKiAgICAgICBbXCJlYXNlLW91dCBkdXJhdGlvbi0zMDBcIiwgXCJvcGFjaXR5LTBcIiwgXCJvcGFjaXR5LTEwMFwiXVxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRdIC0gVGhlIENTUyB0cmFuc2l0aW9uIGNsYXNzZXMgZm9yIGhpZGluZy5cbiAgICAgICAqICAgQWNjZXB0cyBlaXRoZXIgc3RyaW5nIG9mIGNsYXNzZXMgdG8gYXBwbHkgd2hlbiB0b2dnbGluZyBvdXQsIG9yXG4gICAgICAgKiAgIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICAgICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAgICAgKlxuICAgICAgICogICAgICAgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZV0gLSBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5ibG9ja2luZ10gLSBUaGUgYm9vbGVhbiBmbGFnIHRvIGJsb2NrIHRoZSBVSSBkdXJpbmcgdGhlIHRyYW5zaXRpb24uXG4gICAgICAgKiAgIERlZmF1bHRzIGB0cnVlYC5cbiAgICAgICAqL1xuICAgICAgdG9nZ2xlKGVsLCBvcHRzID0ge30pe1xuICAgICAgICBsZXQgb3duZXIgPSBob29rLl9fdmlldygpLmxpdmVTb2NrZXQub3duZXIoZWwpXG4gICAgICAgIG9wdHMuaW4gPSBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLmluKVxuICAgICAgICBvcHRzLm91dCA9IEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMub3V0KVxuICAgICAgICBKUy50b2dnbGUoXCJob29rXCIsIG93bmVyLCBlbCwgb3B0cy5kaXNwbGF5LCBvcHRzLmluLCBvcHRzLm91dCwgb3B0cy50aW1lLCBvcHRzLmJsb2NraW5nKVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGRzIENTUyBjbGFzc2VzIHRvIGFuIGVsZW1lbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgLSBUaGUgZWxlbWVudCB0byBhZGQgY2xhc3NlcyB0by5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIGFkZC5cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncy5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50cmFuc2l0aW9uXSAtIFRoZSBDU1MgdHJhbnNpdGlvbiBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICAgKiAgIEFjY2VwdHMgYSBzdHJpbmcgb2YgY2xhc3NlcyB0byBhcHBseSB3aGVuIGFkZGluZyBjbGFzc2VzIG9yXG4gICAgICAgKiAgIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICAgICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAgICAgKlxuICAgICAgICogICAgICAgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0wXCIsIFwib3BhY2l0eS0xMDBcIl1cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZV0gLSBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmJsb2NraW5nXSAtIFRoZSBib29sZWFuIGZsYWcgdG8gYmxvY2sgdGhlIFVJIGR1cmluZyB0aGUgdHJhbnNpdGlvbi5cbiAgICAgICAqICAgRGVmYXVsdHMgYHRydWVgLlxuICAgICAgICovXG4gICAgICBhZGRDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSl7XG4gICAgICAgIG5hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKVxuICAgICAgICBsZXQgb3duZXIgPSBob29rLl9fdmlldygpLmxpdmVTb2NrZXQub3duZXIoZWwpXG4gICAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgbmFtZXMsIFtdLCBvcHRzLnRyYW5zaXRpb24sIG9wdHMudGltZSwgb3duZXIsIG9wdHMuYmxvY2tpbmcpXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZXMgQ1NTIGNsYXNzZXMgZnJvbSBhbiBlbGVtZW50LlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIGNsYXNzZXMgZnJvbS5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIHJlbW92ZS5cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncy5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50cmFuc2l0aW9uXSAtIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIHRvIHNldC5cbiAgICAgICAqICAgQWNjZXB0cyBhIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gcmVtb3ZpbmcgY2xhc3NlcyBvclxuICAgICAgICogICBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAgICAgKiAgIHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGVuZGluZyB0cmFuc2l0aW9uIGNsYXNzLCBzdWNoIGFzOlxuICAgICAgICpcbiAgICAgICAqICAgICAgIFtcImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiLCBcIm9wYWNpdHktMTAwXCIsIFwib3BhY2l0eS0wXCJdXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVdIC0gVGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5ibG9ja2luZ10gLSBUaGUgYm9vbGVhbiBmbGFnIHRvIGJsb2NrIHRoZSBVSSBkdXJpbmcgdGhlIHRyYW5zaXRpb24uXG4gICAgICAgKiAgIERlZmF1bHRzIGB0cnVlYC5cbiAgICAgICAqL1xuICAgICAgcmVtb3ZlQ2xhc3MoZWwsIG5hbWVzLCBvcHRzID0ge30pe1xuICAgICAgICBvcHRzLnRyYW5zaXRpb24gPSBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLnRyYW5zaXRpb24pXG4gICAgICAgIG5hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKVxuICAgICAgICBsZXQgb3duZXIgPSBob29rLl9fdmlldygpLmxpdmVTb2NrZXQub3duZXIoZWwpXG4gICAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIG5hbWVzLCBvcHRzLnRyYW5zaXRpb24sIG9wdHMudGltZSwgb3duZXIsIG9wdHMuYmxvY2tpbmcpXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZXMgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZSBjbGFzc2VzIG9uLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG5hbWVzIC0gVGhlIGNsYXNzIG5hbWUocykgdG8gdG9nZ2xlLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRyYW5zaXRpb25dIC0gVGhlIENTUyB0cmFuc2l0aW9uIGNsYXNzZXMgdG8gc2V0LlxuICAgICAgICogICBBY2NlcHRzIGEgc3RyaW5nIG9mIGNsYXNzZXMgdG8gYXBwbHkgd2hlbiB0b2dnbGluZyBjbGFzc2VzIG9yXG4gICAgICAgKiAgIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICAgICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAgICAgKlxuICAgICAgICogICAgICAgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZV0gLSBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmJsb2NraW5nXSAtIFRoZSBib29sZWFuIGZsYWcgdG8gYmxvY2sgdGhlIFVJIGR1cmluZyB0aGUgdHJhbnNpdGlvbi5cbiAgICAgICAqICAgRGVmYXVsdHMgYHRydWVgLlxuICAgICAgICovXG4gICAgICB0b2dnbGVDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSl7XG4gICAgICAgIG9wdHMudHJhbnNpdGlvbiA9IEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbilcbiAgICAgICAgbmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogbmFtZXMuc3BsaXQoXCIgXCIpXG4gICAgICAgIGxldCBvd25lciA9IGhvb2suX192aWV3KCkubGl2ZVNvY2tldC5vd25lcihlbClcbiAgICAgICAgSlMudG9nZ2xlQ2xhc3NlcyhlbCwgbmFtZXMsIG9wdHMudHJhbnNpdGlvbiwgb3B0cy50aW1lLCBvd25lciwgb3B0cy5ibG9ja2luZylcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQXBwbGllcyBhIENTUyB0cmFuc2l0aW9uIHRvIGFuIGVsZW1lbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgLSBUaGUgZWxlbWVudCB0byBhcHBseSB0aGUgdHJhbnNpdGlvbiB0by5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSB0cmFuc2l0aW9uIC0gVGhlIHRyYW5zaXRpb24gY2xhc3MoZXMpIHRvIGFwcGx5LlxuICAgICAgICogICBBY2NlcHRzIGEgc3RyaW5nIG9mIGNsYXNzZXMgdG8gYXBwbHkgd2hlbiB0cmFuc2l0aW9uaW5nIG9yXG4gICAgICAgKiAgIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICAgICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAgICAgKlxuICAgICAgICogICAgICAgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZV0gLSBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmJsb2NraW5nXSAtIFRoZSBib29sZWFuIGZsYWcgdG8gYmxvY2sgdGhlIFVJIGR1cmluZyB0aGUgdHJhbnNpdGlvbi5cbiAgICAgICAqICAgRGVmYXVsdHMgYHRydWVgLlxuICAgICAgICovXG4gICAgICB0cmFuc2l0aW9uKGVsLCB0cmFuc2l0aW9uLCBvcHRzID0ge30pe1xuICAgICAgICBsZXQgb3duZXIgPSBob29rLl9fdmlldygpLmxpdmVTb2NrZXQub3duZXIoZWwpXG4gICAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIFtdLCBKUy50cmFuc2l0aW9uQ2xhc3Nlcyh0cmFuc2l0aW9uKSwgb3B0cy50aW1lLCBvd25lciwgb3B0cy5ibG9ja2luZylcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0cyBhbiBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBlbGVtZW50IHRvIHNldCB0aGUgYXR0cmlidXRlIG9uLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIFRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAgICAgKi9cbiAgICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsKXsgSlMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlcyBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZnJvbS5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZS5cbiAgICAgICAqL1xuICAgICAgcmVtb3ZlQXR0cmlidXRlKGVsLCBhdHRyKXsgSlMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSkgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGVzIGFuIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IGJldHdlZW4gdHdvIHZhbHVlcy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgYXR0cmlidXRlIG9uLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdG9nZ2xlLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbDEgLSBUaGUgZmlyc3QgdmFsdWUgdG8gdG9nZ2xlIGJldHdlZW4uXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsMiAtIFRoZSBzZWNvbmQgdmFsdWUgdG8gdG9nZ2xlIGJldHdlZW4uXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsMSwgdmFsMil7IEpTLnRvZ2dsZUF0dHIoZWwsIGF0dHIsIHZhbDEsIHZhbDIpIH0sXG4gICAgfVxuICB9XG5cbiAgcHVzaEV2ZW50KGV2ZW50LCBwYXlsb2FkID0ge30sIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3KCkucHVzaEhvb2tFdmVudCh0aGlzLmVsLCBudWxsLCBldmVudCwgcGF5bG9hZCwgb25SZXBseSlcbiAgfVxuXG4gIHB1c2hFdmVudFRvKHBoeFRhcmdldCwgZXZlbnQsIHBheWxvYWQgPSB7fSwgb25SZXBseSA9IGZ1bmN0aW9uICgpeyB9KXtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXcoKS53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgcmV0dXJuIHZpZXcucHVzaEhvb2tFdmVudCh0aGlzLmVsLCB0YXJnZXRDdHgsIGV2ZW50LCBwYXlsb2FkLCBvblJlcGx5KVxuICAgIH0pXG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCBjYWxsYmFja1JlZiA9IChjdXN0b21FdmVudCwgYnlwYXNzKSA9PiBieXBhc3MgPyBldmVudCA6IGNhbGxiYWNrKGN1c3RvbUV2ZW50LmRldGFpbClcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgcGh4OiR7ZXZlbnR9YCwgY2FsbGJhY2tSZWYpXG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpXG4gICAgcmV0dXJuIGNhbGxiYWNrUmVmXG4gIH1cblxuICByZW1vdmVIYW5kbGVFdmVudChjYWxsYmFja1JlZil7XG4gICAgbGV0IGV2ZW50ID0gY2FsbGJhY2tSZWYobnVsbCwgdHJ1ZSlcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcGh4OiR7ZXZlbnR9YCwgY2FsbGJhY2tSZWYpXG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUoY2FsbGJhY2tSZWYpXG4gIH1cblxuICB1cGxvYWQobmFtZSwgZmlsZXMpe1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLmRpc3BhdGNoVXBsb2FkcyhudWxsLCBuYW1lLCBmaWxlcylcbiAgfVxuXG4gIHVwbG9hZFRvKHBoeFRhcmdldCwgbmFtZSwgZmlsZXMpe1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICB2aWV3LmRpc3BhdGNoVXBsb2Fkcyh0YXJnZXRDdHgsIG5hbWUsIGZpbGVzKVxuICAgIH0pXG4gIH1cblxuICBfX2NsZWFudXBfXygpe1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaChjYWxsYmFja1JlZiA9PiB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSlcbiAgfVxufSIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX0xPQURJTkdfQ0xBU1MsXG4gIFBIWF9FUlJPUl9DTEFTUyxcbiAgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyxcbiAgUEhYX1NFUlZFUl9FUlJPUl9DTEFTUyxcbiAgUEhYX0hBU19GT0NVU0VELFxuICBQSFhfSEFTX1NVQk1JVFRFRCxcbiAgUEhYX0hPT0ssXG4gIFBIWF9QQVJFTlRfSUQsXG4gIFBIWF9QUk9HUkVTUyxcbiAgUEhYX1JFQURPTkxZLFxuICBQSFhfUkVGX0xPQURJTkcsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVGX0xPQ0ssXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSQUNLX1NUQVRJQyxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9VUERBVEUsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX01BSU4sXG4gIFBIWF9NT1VOVEVELFxuICBQVVNIX1RJTUVPVVQsXG4gIFBIWF9WSUVXUE9SVF9UT1AsXG4gIFBIWF9WSUVXUE9SVF9CT1RUT00sXG4gIE1BWF9DSElMRF9KT0lOX0FUVEVNUFRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyXCJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBFbGVtZW50UmVmIGZyb20gXCIuL2VsZW1lbnRfcmVmXCJcbmltcG9ydCBET01QYXRjaCBmcm9tIFwiLi9kb21fcGF0Y2hcIlxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiXG5pbXBvcnQgVmlld0hvb2sgZnJvbSBcIi4vdmlld19ob29rXCJcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiXG5cbmV4cG9ydCBsZXQgcHJlcGVuZEZvcm1EYXRhS2V5ID0gKGtleSwgcHJlZml4KSA9PiB7XG4gIGxldCBpc0FycmF5ID0ga2V5LmVuZHNXaXRoKFwiW11cIilcbiAgLy8gUmVtb3ZlIHRoZSBcIltdXCIgaWYgaXQncyBhbiBhcnJheVxuICBsZXQgYmFzZUtleSA9IGlzQXJyYXkgPyBrZXkuc2xpY2UoMCwgLTIpIDoga2V5XG4gIC8vIFJlcGxhY2UgbGFzdCBvY2N1cnJlbmNlIG9mIGtleSBiZWZvcmUgYSBjbG9zaW5nIGJyYWNrZXQgb3IgdGhlIGVuZCB3aXRoIGtleSBwbHVzIHN1ZmZpeFxuICBiYXNlS2V5ID0gYmFzZUtleS5yZXBsYWNlKC8oW15cXFtcXF1dKykoXFxdPyQpLywgYCR7cHJlZml4fSQxJDJgKVxuICAvLyBBZGQgYmFjayB0aGUgXCJbXVwiIGlmIGl0IHdhcyBhbiBhcnJheVxuICBpZihpc0FycmF5KXsgYmFzZUtleSArPSBcIltdXCIgfVxuICByZXR1cm4gYmFzZUtleVxufVxuXG5sZXQgc2VyaWFsaXplRm9ybSA9IChmb3JtLCBtZXRhZGF0YSwgb25seU5hbWVzID0gW10pID0+IHtcbiAgY29uc3Qge3N1Ym1pdHRlciwgLi4ubWV0YX0gPSBtZXRhZGF0YVxuXG4gIC8vIFdlIG11c3QgaW5qZWN0IHRoZSBzdWJtaXR0ZXIgaW4gdGhlIG9yZGVyIHRoYXQgaXQgZXhpc3RzIGluIHRoZSBET01cbiAgLy8gcmVsYXRpdmUgdG8gb3RoZXIgaW5wdXRzLiBGb3IgZXhhbXBsZSwgZm9yIGNoZWNrYm94IGdyb3VwcywgdGhlIG9yZGVyIG11c3QgYmUgbWFpbnRhaW5lZC5cbiAgbGV0IGluamVjdGVkRWxlbWVudFxuICBpZihzdWJtaXR0ZXIgJiYgc3VibWl0dGVyLm5hbWUpe1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpXG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCJcbiAgICAvLyBzZXQgdGhlIGZvcm0gYXR0cmlidXRlIGlmIHRoZSBzdWJtaXR0ZXIgaGFzIG9uZTtcbiAgICAvLyB0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIGVsZW1lbnQgaXMgb3V0c2lkZSB0aGUgYWN0dWFsIGZvcm0gZWxlbWVudFxuICAgIGNvbnN0IGZvcm1JZCA9IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtXCIpXG4gICAgaWYoZm9ybUlkKXtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcImZvcm1cIiwgZm9ybUlkKVxuICAgIH1cbiAgICBpbnB1dC5uYW1lID0gc3VibWl0dGVyLm5hbWVcbiAgICBpbnB1dC52YWx1ZSA9IHN1Ym1pdHRlci52YWx1ZVxuICAgIHN1Ym1pdHRlci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpbnB1dCwgc3VibWl0dGVyKVxuICAgIGluamVjdGVkRWxlbWVudCA9IGlucHV0XG4gIH1cblxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKVxuICBjb25zdCB0b1JlbW92ZSA9IFtdXG5cbiAgZm9ybURhdGEuZm9yRWFjaCgodmFsLCBrZXksIF9pbmRleCkgPT4ge1xuICAgIGlmKHZhbCBpbnN0YW5jZW9mIEZpbGUpeyB0b1JlbW92ZS5wdXNoKGtleSkgfVxuICB9KVxuXG4gIC8vIENsZWFudXAgYWZ0ZXIgYnVpbGRpbmcgZmlsZURhdGFcbiAgdG9SZW1vdmUuZm9yRWFjaChrZXkgPT4gZm9ybURhdGEuZGVsZXRlKGtleSkpXG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG5cbiAgbGV0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKVxuICBmb3IobGV0IFtrZXksIHZhbF0gb2YgZm9ybURhdGEuZW50cmllcygpKXtcbiAgICBpZihvbmx5TmFtZXMubGVuZ3RoID09PSAwIHx8IG9ubHlOYW1lcy5pbmRleE9mKGtleSkgPj0gMCl7XG4gICAgICBsZXQgaW5wdXRzID0gZWxlbWVudHMuZmlsdGVyKGlucHV0ID0+IGlucHV0Lm5hbWUgPT09IGtleSlcbiAgICAgIGxldCBpc1VudXNlZCA9ICFpbnB1dHMuc29tZShpbnB1dCA9PiAoRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHwgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKSkpXG4gICAgICBsZXQgaGlkZGVuID0gaW5wdXRzLmV2ZXJ5KGlucHV0ID0+IGlucHV0LnR5cGUgPT09IFwiaGlkZGVuXCIpXG4gICAgICBpZihpc1VudXNlZCAmJiAhKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIubmFtZSA9PSBrZXkpICYmICFoaWRkZW4pe1xuICAgICAgICBwYXJhbXMuYXBwZW5kKHByZXBlbmRGb3JtRGF0YUtleShrZXksIFwiX3VudXNlZF9cIiksIFwiXCIpXG4gICAgICB9XG4gICAgICBwYXJhbXMuYXBwZW5kKGtleSwgdmFsKVxuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSB0aGUgaW5qZWN0ZWQgZWxlbWVudCBhZ2FpblxuICAvLyAoaXQgd291bGQgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCBkb20gcGF0Y2ggYW55d2F5LCBidXQgdGhpcyBpcyBjbGVhbmVyKVxuICBpZihzdWJtaXR0ZXIgJiYgaW5qZWN0ZWRFbGVtZW50KXtcbiAgICBzdWJtaXR0ZXIucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChpbmplY3RlZEVsZW1lbnQpXG4gIH1cblxuICBmb3IobGV0IG1ldGFLZXkgaW4gbWV0YSl7IHBhcmFtcy5hcHBlbmQobWV0YUtleSwgbWV0YVttZXRhS2V5XSkgfVxuXG4gIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3IHtcbiAgc3RhdGljIGNsb3Nlc3RWaWV3KGVsKXtcbiAgICBsZXQgbGl2ZVZpZXdFbCA9IGVsLmNsb3Nlc3QoUEhYX1ZJRVdfU0VMRUNUT1IpXG4gICAgcmV0dXJuIGxpdmVWaWV3RWwgPyBET00ucHJpdmF0ZShsaXZlVmlld0VsLCBcInZpZXdcIikgOiBudWxsXG4gIH1cblxuICBjb25zdHJ1Y3RvcihlbCwgbGl2ZVNvY2tldCwgcGFyZW50VmlldywgZmxhc2gsIGxpdmVSZWZlcmVyKXtcbiAgICB0aGlzLmlzRGVhZCA9IGZhbHNlXG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldFxuICAgIHRoaXMuZmxhc2ggPSBmbGFzaFxuICAgIHRoaXMucGFyZW50ID0gcGFyZW50Vmlld1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzXG4gICAgdGhpcy5lbCA9IGVsXG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgXCJ2aWV3XCIsIHRoaXMpXG4gICAgdGhpcy5pZCA9IHRoaXMuZWwuaWRcbiAgICB0aGlzLnJlZiA9IDBcbiAgICB0aGlzLmxhc3RBY2tSZWYgPSBudWxsXG4gICAgdGhpcy5jaGlsZEpvaW5zID0gMFxuICAgIHRoaXMubG9hZGVyVGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICAgIHRoaXMucGVuZGluZ0Zvcm1zID0gbmV3IFNldCgpXG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlXG4gICAgdGhpcy5ocmVmID0gbnVsbFxuICAgIHRoaXMuam9pbkNvdW50ID0gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5qb2luQ291bnQgLSAxIDogMFxuICAgIHRoaXMuam9pbkF0dGVtcHRzID0gMFxuICAgIHRoaXMuam9pblBlbmRpbmcgPSB0cnVlXG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24ob25Eb25lKXsgb25Eb25lICYmIG9uRG9uZSgpIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjayA9IGZ1bmN0aW9uKCl7IH1cbiAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gdGhpcy5wYXJlbnQgPyBudWxsIDogW11cbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9XG4gICAgdGhpcy5mb3JtU3VibWl0cyA9IFtdXG4gICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMucGFyZW50ID8gbnVsbCA6IHt9XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge31cbiAgICB0aGlzLmZvcm1zRm9yUmVjb3ZlcnkgPSB7fVxuICAgIHRoaXMuY2hhbm5lbCA9IHRoaXMubGl2ZVNvY2tldC5jaGFubmVsKGBsdjoke3RoaXMuaWR9YCwgKCkgPT4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuaHJlZiAmJiB0aGlzLmV4cGFuZFVSTCh0aGlzLmhyZWYpXG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWRpcmVjdDogdGhpcy5yZWRpcmVjdCA/IHVybCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsOiB0aGlzLnJlZGlyZWN0ID8gdW5kZWZpbmVkIDogdXJsIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgcGFyYW1zOiB0aGlzLmNvbm5lY3RQYXJhbXMobGl2ZVJlZmVyZXIpLFxuICAgICAgICBzZXNzaW9uOiB0aGlzLmdldFNlc3Npb24oKSxcbiAgICAgICAgc3RhdGljOiB0aGlzLmdldFN0YXRpYygpLFxuICAgICAgICBmbGFzaDogdGhpcy5mbGFzaCxcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2V0SHJlZihocmVmKXsgdGhpcy5ocmVmID0gaHJlZiB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZil7XG4gICAgdGhpcy5yZWRpcmVjdCA9IHRydWVcbiAgICB0aGlzLmhyZWYgPSBocmVmXG4gIH1cblxuICBpc01haW4oKXsgcmV0dXJuIHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKSB9XG5cbiAgY29ubmVjdFBhcmFtcyhsaXZlUmVmZXJlcil7XG4gICAgbGV0IHBhcmFtcyA9IHRoaXMubGl2ZVNvY2tldC5wYXJhbXModGhpcy5lbClcbiAgICBsZXQgbWFuaWZlc3QgPVxuICAgICAgRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgICAgLm1hcChub2RlID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZikuZmlsdGVyKHVybCA9PiB0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cbiAgICBpZihtYW5pZmVzdC5sZW5ndGggPiAwKXsgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0IH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnRcbiAgICBwYXJhbXNbXCJfbW91bnRfYXR0ZW1wdHNcIl0gPSB0aGlzLmpvaW5BdHRlbXB0c1xuICAgIHBhcmFtc1tcIl9saXZlX3JlZmVyZXJcIl0gPSBsaXZlUmVmZXJlclxuICAgIHRoaXMuam9pbkF0dGVtcHRzKytcblxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLmNoYW5uZWwuY2FuUHVzaCgpIH1cblxuICBnZXRTZXNzaW9uKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgfVxuXG4gIGdldFN0YXRpYygpe1xuICAgIGxldCB2YWwgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU1RBVElDKVxuICAgIHJldHVybiB2YWwgPT09IFwiXCIgPyBudWxsIDogdmFsXG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHRoaXMuZGVzdHJveUFsbENoaWxkcmVuKClcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWVcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdXG4gICAgaWYodGhpcy5wYXJlbnQpeyBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucGFyZW50LmlkXVt0aGlzLmlkXSB9XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgbGV0IG9uRmluaXNoZWQgPSAoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgRE9NLm1hcmtQaHhDaGlsZERlc3Ryb3llZCh0aGlzLmVsKVxuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKVxuICAgIHRoaXMuY2hhbm5lbC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZClcbiAgfVxuXG4gIHNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyl7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgUEhYX0NPTk5FQ1RFRF9DTEFTUyxcbiAgICAgIFBIWF9MT0FESU5HX0NMQVNTLFxuICAgICAgUEhYX0VSUk9SX0NMQVNTLFxuICAgICAgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyxcbiAgICAgIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NcbiAgICApXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpXG4gIH1cblxuICBzaG93TG9hZGVyKHRpbWVvdXQpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKVxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3MpeyB0aGlzLnZpZXdIb29rc1tpZF0uX19kaXNjb25uZWN0ZWQoKSB9XG4gICAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0xPQURJTkdfQ0xBU1MpXG4gICAgfVxuICB9XG5cbiAgZXhlY0FsbChiaW5kaW5nKXtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtiaW5kaW5nfV1gLCBlbCA9PiB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUoYmluZGluZykpKVxuICB9XG5cbiAgaGlkZUxvYWRlcigpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKVxuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xhc3NlcyhQSFhfQ09OTkVDVEVEX0NMQVNTKVxuICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJjb25uZWN0ZWRcIikpXG4gIH1cblxuICB0cmlnZ2VyUmVjb25uZWN0ZWQoKXtcbiAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXsgdGhpcy52aWV3SG9va3NbaWRdLl9fcmVjb25uZWN0ZWQoKSB9XG4gIH1cblxuICBsb2coa2luZCwgbXNnQ2FsbGJhY2spe1xuICAgIHRoaXMubGl2ZVNvY2tldC5sb2codGhpcywga2luZCwgbXNnQ2FsbGJhY2spXG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uKCl7fSl7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKVxuICB9XG5cbiAgLy8gY2FsbHMgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHZpZXcgYW5kIHRhcmdldCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gcGh4VGFyZ2V0XG4gIC8vIHRhcmdldHMgY2FuIGJlOlxuICAvLyAgKiBhbiBlbGVtZW50IGl0c2VsZiwgdGhlbiBpdCBpcyBzaW1wbHkgcGFzc2VkIHRvIGxpdmVTb2NrZXQub3duZXI7XG4gIC8vICAqIGEgQ0lEIChDb21wb25lbnQgSUQpLCB0aGVuIHdlIGZpcnN0IHNlYXJjaCB0aGUgY29tcG9uZW50J3MgZWxlbWVudCBpbiB0aGUgRE9NXG4gIC8vICAqIGEgc2VsZWN0b3IsIHRoZW4gd2Ugc2VhcmNoIHRoZSBzZWxlY3RvciBpbiB0aGUgRE9NIGFuZCBjYWxsIHRoZSBjYWxsYmFja1xuICAvLyAgICBmb3IgZWFjaCBlbGVtZW50IGZvdW5kIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgb3duZXIgdmlld1xuICB3aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgY2FsbGJhY2ssIGRvbSA9IGRvY3VtZW50LCB2aWV3RWwpe1xuICAgIC8vIGluIHRoZSBmb3JtIHJlY292ZXJ5IGNhc2Ugd2Ugc2VhcmNoIGluIGEgdGVtcGxhdGUgZnJhZ21lbnQgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSByZWFsIGRvbSwgdGhlcmVmb3JlIHdlIG9wdGlvbmFsbHkgcGFzcyBkb20gYW5kIHZpZXdFbFxuXG4gICAgaWYocGh4VGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgcGh4VGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCl7XG4gICAgICByZXR1cm4gdGhpcy5saXZlU29ja2V0Lm93bmVyKHBoeFRhcmdldCwgdmlldyA9PiBjYWxsYmFjayh2aWV3LCBwaHhUYXJnZXQpKVxuICAgIH1cblxuICAgIGlmKGlzQ2lkKHBoeFRhcmdldCkpe1xuICAgICAgbGV0IHRhcmdldHMgPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHZpZXdFbCB8fCB0aGlzLmVsLCBwaHhUYXJnZXQpXG4gICAgICBpZih0YXJnZXRzLmxlbmd0aCA9PT0gMCl7XG4gICAgICAgIGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm91bmQgbWF0Y2hpbmcgcGh4LXRhcmdldCBvZiAke3BoeFRhcmdldH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcywgcGFyc2VJbnQocGh4VGFyZ2V0KSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRhcmdldHMgPSBBcnJheS5mcm9tKGRvbS5xdWVyeVNlbGVjdG9yQWxsKHBoeFRhcmdldCkpXG4gICAgICBpZih0YXJnZXRzLmxlbmd0aCA9PT0gMCl7IGxvZ0Vycm9yKGBub3RoaW5nIGZvdW5kIG1hdGNoaW5nIHRoZSBwaHgtdGFyZ2V0IHNlbGVjdG9yIFwiJHtwaHhUYXJnZXR9XCJgKSB9XG4gICAgICB0YXJnZXRzLmZvckVhY2godGFyZ2V0ID0+IHRoaXMubGl2ZVNvY2tldC5vd25lcih0YXJnZXQsIHZpZXcgPT4gY2FsbGJhY2sodmlldywgdGFyZ2V0KSkpXG4gICAgfVxuICB9XG5cbiAgYXBwbHlEaWZmKHR5cGUsIHJhd0RpZmYsIGNhbGxiYWNrKXtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKVxuICAgIGxldCB7ZGlmZiwgcmVwbHksIGV2ZW50cywgdGl0bGV9ID0gUmVuZGVyZWQuZXh0cmFjdChyYXdEaWZmKVxuICAgIGNhbGxiYWNrKHtkaWZmLCByZXBseSwgZXZlbnRzfSlcbiAgICBpZih0eXBlb2YgdGl0bGUgPT09IFwic3RyaW5nXCIpeyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IERPTS5wdXRUaXRsZSh0aXRsZSkpIH1cbiAgfVxuXG4gIG9uSm9pbihyZXNwKXtcbiAgICBsZXQge3JlbmRlcmVkLCBjb250YWluZXIsIGxpdmV2aWV3X3ZlcnNpb259ID0gcmVzcFxuICAgIGlmKGNvbnRhaW5lcil7XG4gICAgICBsZXQgW3RhZywgYXR0cnNdID0gY29udGFpbmVyXG4gICAgICB0aGlzLmVsID0gRE9NLnJlcGxhY2VSb290Q29udGFpbmVyKHRoaXMuZWwsIHRhZywgYXR0cnMpXG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZmxhc2ggPSBudWxsXG4gICAgaWYodGhpcy5yb290ID09PSB0aGlzKXtcbiAgICAgIHRoaXMuZm9ybXNGb3JSZWNvdmVyeSA9IHRoaXMuZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpXG4gICAgfVxuICAgIGlmKHRoaXMuaXNNYWluKCkpe1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlcGxhY2VSb290SGlzdG9yeSgpXG4gICAgfVxuXG4gICAgaWYobGl2ZXZpZXdfdmVyc2lvbiAhPT0gdGhpcy5saXZlU29ja2V0LnZlcnNpb24oKSl7XG4gICAgICBjb25zb2xlLmVycm9yKGBMaXZlVmlldyBhc3NldCB2ZXJzaW9uIG1pc21hdGNoLiBKYXZhU2NyaXB0IHZlcnNpb24gJHt0aGlzLmxpdmVTb2NrZXQudmVyc2lvbigpfSB2cy4gc2VydmVyICR7bGl2ZXZpZXdfdmVyc2lvbn0uIFRvIGF2b2lkIGlzc3VlcywgcGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIgYXNzZXRzIHVzZSB0aGUgc2FtZSB2ZXJzaW9uIGFzIHRoZSBzZXJ2ZXIuYClcbiAgICB9XG5cbiAgICBCcm93c2VyLmRyb3BMb2NhbCh0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMpXG4gICAgdGhpcy5hcHBseURpZmYoXCJtb3VudFwiLCByZW5kZXJlZCwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpXG4gICAgICBsZXQgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIobnVsbCwgXCJqb2luXCIpXG4gICAgICB0aGlzLmRyb3BQZW5kaW5nUmVmcygpXG4gICAgICB0aGlzLmpvaW5Db3VudCsrXG4gICAgICB0aGlzLmpvaW5BdHRlbXB0cyA9IDBcblxuICAgICAgdGhpcy5tYXliZVJlY292ZXJGb3JtcyhodG1sLCAoKSA9PiB7XG4gICAgICAgIHRoaXMub25Kb2luQ29tcGxldGUocmVzcCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZHJvcFBlbmRpbmdSZWZzKCl7XG4gICAgRE9NLmFsbChkb2N1bWVudCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCBlbCA9PiB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKVxuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKVxuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9DSylcbiAgICB9KVxuICB9XG5cbiAgb25Kb2luQ29tcGxldGUoe2xpdmVfcGF0Y2h9LCBodG1sLCBzdHJlYW1zLCBldmVudHMpe1xuICAgIC8vIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBiZXR0ZXIgZXhwZXJpZW5jZSwgd2Ugd2FudCB0byBqb2luXG4gICAgLy8gYWxsIExpdmVWaWV3cyBmaXJzdCBhbmQgb25seSB0aGVuIGFwcGx5IHRoZWlyIHBhdGNoZXMuXG4gICAgaWYodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSl7XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpXG4gICAgfVxuXG4gICAgLy8gT25lIGRvd25zaWRlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgcGh4Q2hpbGRyZW5cbiAgICAvLyBpbiB0aGUgaHRtbCBmcmFnbWVudCwgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgRE9NLiBUaGUgZnJhZ21lbnRcbiAgICAvLyBhbHNvIGRvZXMgbm90IGluY2x1ZGUgUEhYX1NUQVRJQywgc28gd2UgbmVlZCB0byBjb3B5IGl0IG92ZXIgZnJvbVxuICAgIC8vIHRoZSBET00uXG4gICAgbGV0IG5ld0NoaWxkcmVuID0gRE9NLmZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgdGhpcy5pZCkuZmlsdGVyKHRvRWwgPT4ge1xuICAgICAgbGV0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYClcbiAgICAgIGxldCBwaHhTdGF0aWMgPSBmcm9tRWwgJiYgZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU1RBVElDKVxuICAgICAgaWYocGh4U3RhdGljKXsgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKSB9XG4gICAgICAvLyBzZXQgUEhYX1JPT1RfSUQgdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRvIHRoZSByb290IHZpZXdcbiAgICAgIC8vIHdoaWxlIHRoZSBjaGlsZCBqb2luIGlzIHN0aWxsIHBlbmRpbmdcbiAgICAgIGlmKGZyb21FbCl7IGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCkgfVxuICAgICAgcmV0dXJuIHRoaXMuam9pbkNoaWxkKHRvRWwpXG4gICAgfSlcblxuICAgIGlmKG5ld0NoaWxkcmVuLmxlbmd0aCA9PT0gMCl7XG4gICAgICBpZih0aGlzLnBhcmVudCl7XG4gICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyldKVxuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKClcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyldKVxuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpe1xuICAgIHRoaXMuZWwgPSBET00uYnlJZCh0aGlzLmlkKVxuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3QuaWQpXG4gIH1cblxuICAvLyB0aGlzIGlzIGludm9rZWQgZm9yIGRlYWQgYW5kIGxpdmUgdmlld3MsIHNvIHdlIG11c3QgZmlsdGVyIGJ5XG4gIC8vIGJ5IG93bmVyIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgZHVwbGljYXRpbmcgaG9va3MgYWNyb3NzIGRpc2Nvbm5lY3RcbiAgLy8gYW5kIGNvbm5lY3RlZCBzdGF0ZXMuIFRoaXMgYWxzbyBoYW5kbGVzIGNhc2VzIHdoZXJlIGhvb2tzIGV4aXN0XG4gIC8vIGluIGEgcm9vdCBsYXlvdXQgd2l0aCBhIExWIGluIHRoZSBib2R5XG4gIGV4ZWNOZXdNb3VudGVkKHBhcmVudCA9IHRoaXMuZWwpe1xuICAgIGxldCBwaHhWaWV3cG9ydFRvcCA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfVE9QKVxuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKVxuICAgIERPTS5hbGwocGFyZW50LCBgWyR7cGh4Vmlld3BvcnRUb3B9XSwgWyR7cGh4Vmlld3BvcnRCb3R0b219XWAsIGhvb2tFbCA9PiB7XG4gICAgICBpZih0aGlzLm93bnNFbGVtZW50KGhvb2tFbCkpe1xuICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoaG9va0VsLCBob29rRWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSlcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKVxuICAgICAgfVxuICAgIH0pXG4gICAgRE9NLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX0hPT0spfV0sIFtkYXRhLXBoeC0ke1BIWF9IT09LfV1gLCBob29rRWwgPT4ge1xuICAgICAgaWYodGhpcy5vd25zRWxlbWVudChob29rRWwpKXtcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKVxuICAgICAgfVxuICAgIH0pXG4gICAgRE9NLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX01PVU5URUQpfV1gLCBlbCA9PiB7XG4gICAgICBpZih0aGlzLm93bnNFbGVtZW50KGVsKSl7XG4gICAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpe1xuICAgIHRoaXMuYXR0YWNoVHJ1ZURvY0VsKClcbiAgICBsZXQgcGF0Y2ggPSBuZXcgRE9NUGF0Y2godGhpcywgdGhpcy5lbCwgdGhpcy5pZCwgaHRtbCwgc3RyZWFtcywgbnVsbClcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpXG4gICAgdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIGZhbHNlLCB0cnVlKVxuICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKClcbiAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKClcblxuICAgIHRoaXMuam9pblBlbmRpbmcgPSBmYWxzZVxuICAgIHRoaXMubGl2ZVNvY2tldC5kaXNwYXRjaEV2ZW50cyhldmVudHMpXG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKClcblxuICAgIGlmKGxpdmVfcGF0Y2gpe1xuICAgICAgbGV0IHtraW5kLCB0b30gPSBsaXZlX3BhdGNoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVBhdGNoKHRvLCBraW5kKVxuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKVxuICAgIGlmKHRoaXMuam9pbkNvdW50ID4gMSl7IHRoaXMudHJpZ2dlclJlY29ubmVjdGVkKCkgfVxuICAgIHRoaXMuc3RvcENhbGxiYWNrKClcbiAgfVxuXG4gIHRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGZyb21FbCwgdG9FbCl7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSlcbiAgICBsZXQgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpXG4gICAgbGV0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSlcbiAgICBpZihob29rICYmICFmcm9tRWwuaXNFcXVhbE5vZGUodG9FbCkgJiYgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSkpe1xuICAgICAgaG9vay5fX2JlZm9yZVVwZGF0ZSgpXG4gICAgICByZXR1cm4gaG9va1xuICAgIH1cbiAgfVxuXG4gIG1heWJlTW91bnRlZChlbCl7XG4gICAgbGV0IHBoeE1vdW50ZWQgPSBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9NT1VOVEVEKSlcbiAgICBsZXQgaGFzQmVlbkludm9rZWQgPSBwaHhNb3VudGVkICYmIERPTS5wcml2YXRlKGVsLCBcIm1vdW50ZWRcIilcbiAgICBpZihwaHhNb3VudGVkICYmICFoYXNCZWVuSW52b2tlZCl7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBwaHhNb3VudGVkKVxuICAgICAgRE9NLnB1dFByaXZhdGUoZWwsIFwibW91bnRlZFwiLCB0cnVlKVxuICAgIH1cbiAgfVxuXG4gIG1heWJlQWRkTmV3SG9vayhlbCl7XG4gICAgbGV0IG5ld0hvb2sgPSB0aGlzLmFkZEhvb2soZWwpXG4gICAgaWYobmV3SG9vayl7IG5ld0hvb2suX19tb3VudGVkKCkgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMsIGlzSm9pblBhdGNoID0gZmFsc2Upe1xuICAgIGxldCByZW1vdmVkRWxzID0gW11cbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlXG4gICAgbGV0IHVwZGF0ZWRIb29rSWRzID0gbmV3IFNldCgpXG5cbiAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uUGF0Y2hTdGFydFwiLCBbcGF0Y2gudGFyZ2V0Q29udGFpbmVyXSlcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgZWwgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbk5vZGVBZGRlZFwiLCBbZWxdKVxuICAgICAgbGV0IHBoeFZpZXdwb3J0VG9wID0gdGhpcy5iaW5kaW5nKFBIWF9WSUVXUE9SVF9UT1ApXG4gICAgICBsZXQgcGh4Vmlld3BvcnRCb3R0b20gPSB0aGlzLmJpbmRpbmcoUEhYX1ZJRVdQT1JUX0JPVFRPTSlcbiAgICAgIERPTS5tYWludGFpblByaXZhdGVIb29rcyhlbCwgZWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSlcbiAgICAgIHRoaXMubWF5YmVBZGROZXdIb29rKGVsKVxuICAgICAgaWYoZWwuZ2V0QXR0cmlidXRlKXsgdGhpcy5tYXliZU1vdW50ZWQoZWwpIH1cbiAgICB9KVxuXG4gICAgcGF0Y2guYWZ0ZXIoXCJwaHhDaGlsZEFkZGVkXCIsIGVsID0+IHtcbiAgICAgIGlmKERPTS5pc1BoeFN0aWNreShlbCkpe1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQuam9pblJvb3RWaWV3cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5iZWZvcmUoXCJ1cGRhdGVkXCIsIChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgIGxldCBob29rID0gdGhpcy50cmlnZ2VyQmVmb3JlVXBkYXRlSG9vayhmcm9tRWwsIHRvRWwpXG4gICAgICBpZihob29rKXsgdXBkYXRlZEhvb2tJZHMuYWRkKGZyb21FbC5pZCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgZWwgPT4ge1xuICAgICAgaWYodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSl7IHRoaXMuZ2V0SG9vayhlbCkuX191cGRhdGVkKCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcImRpc2NhcmRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmKGVsLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSl7IHJlbW92ZWRFbHMucHVzaChlbCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIGVscyA9PiB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSlcbiAgICBwYXRjaC5wZXJmb3JtKGlzSm9pblBhdGNoKVxuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKVxuXG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvblBhdGNoRW5kXCIsIFtwYXRjaC50YXJnZXRDb250YWluZXJdKVxuICAgIHJldHVybiBwaHhDaGlsZHJlbkFkZGVkXG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKXtcbiAgICBsZXQgZGVzdHJveWVkQ0lEcyA9IFtdXG4gICAgZWxlbWVudHMuZm9yRWFjaChwYXJlbnQgPT4ge1xuICAgICAgbGV0IGNvbXBvbmVudHMgPSBET00uYWxsKHBhcmVudCwgYFske1BIWF9DT01QT05FTlR9XWApXG4gICAgICBsZXQgaG9va3MgPSBET00uYWxsKHBhcmVudCwgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LWhvb2tdYClcbiAgICAgIGNvbXBvbmVudHMuY29uY2F0KHBhcmVudCkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGxldCBjaWQgPSB0aGlzLmNvbXBvbmVudElEKGVsKVxuICAgICAgICBpZihpc0NpZChjaWQpICYmIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSl7IGRlc3Ryb3llZENJRHMucHVzaChjaWQpIH1cbiAgICAgIH0pXG4gICAgICBob29rcy5jb25jYXQocGFyZW50KS5mb3JFYWNoKGhvb2tFbCA9PiB7XG4gICAgICAgIGxldCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbClcbiAgICAgICAgaG9vayAmJiB0aGlzLmRlc3Ryb3lIb29rKGhvb2spXG4gICAgICB9KVxuICAgIH0pXG4gICAgLy8gV2Ugc2hvdWxkIG5vdCBwcnVuZUNpZHMgb24gam9pbnMuIE90aGVyd2lzZSwgaW4gY2FzZSBvZlxuICAgIC8vIHJlam9pbnMsIHdlIG1heSBub3RpZnkgY2lkcyB0aGF0IG5vIGxvbmdlciBiZWxvbmcgdG8gdGhlXG4gICAgLy8gY3VycmVudCBMaXZlVmlldyB0byBiZSByZW1vdmVkLlxuICAgIGlmKHBydW5lQ2lkcyl7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcylcbiAgICB9XG4gIH1cblxuICBqb2luTmV3Q2hpbGRyZW4oKXtcbiAgICBET00uZmluZFBoeENoaWxkcmVuKHRoaXMuZWwsIHRoaXMuaWQpLmZvckVhY2goZWwgPT4gdGhpcy5qb2luQ2hpbGQoZWwpKVxuICB9XG5cbiAgbWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgY2FsbGJhY2spe1xuICAgIGNvbnN0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKVxuICAgIGNvbnN0IG9sZEZvcm1zID0gdGhpcy5yb290LmZvcm1zRm9yUmVjb3ZlcnlcbiAgICAvLyBTbyB3aHkgZG8gd2UgY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBoZXJlP1xuICAgIC8vIE9uZSB3YXkgdG8gcmVjb3ZlciBmb3JtcyB3b3VsZCBiZSB0byBpbW1lZGlhdGVseSBhcHBseSB0aGUgbW91bnRcbiAgICAvLyBwYXRjaCBhbmQgdGhlbiBhZnRlcndhcmRzIHJlY292ZXIgdGhlIGZvcm1zLiBIb3dldmVyLCB0aGlzIHdvdWxkXG4gICAgLy8gY2F1c2UgYSBmbGlja2VyLCBiZWNhdXNlIHRoZSBtb3VudCBwYXRjaCB3b3VsZCByZW1vdmUgdGhlIGZvcm0gY29udGVudFxuICAgIC8vIHVudGlsIGl0IGlzIHJlc3RvcmVkLiBUaGVyZWZvcmUgTFYgZGVjaWRlZCB0byBkbyBmb3JtIHJlY292ZXJ5IHdpdGggdGhlXG4gICAgLy8gcmF3IEhUTUwgYmVmb3JlIGl0IGlzIGFwcGxpZWQgYW5kIGRlbGF5IHRoZSBtb3VudCBwYXRjaCB1bnRpbCB0aGUgZm9ybVxuICAgIC8vIHJlY292ZXJ5IGV2ZW50cyBhcmUgZG9uZS5cbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIilcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgLy8gYmVjYXVzZSB3ZSB3b3JrIHdpdGggYSB0ZW1wbGF0ZSBlbGVtZW50LCB3ZSBtdXN0IG1hbnVhbGx5IGNvcHkgdGhlIGF0dHJpYnV0ZXNcbiAgICAvLyBvdGhlcndpc2UgdGhlIG93bmVyIC8gdGFyZ2V0IGhlbHBlcnMgZG9uJ3Qgd29yayBwcm9wZXJseVxuICAgIGNvbnN0IHJvb3RFbCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICByb290RWwuaWQgPSB0aGlzLmlkXG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCwgdGhpcy5yb290LmlkKVxuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHRoaXMuZ2V0U2Vzc2lvbigpKVxuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgdGhpcy5nZXRTdGF0aWMoKSlcbiAgICByb290RWwuc2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQsIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuaWQgOiBudWxsKVxuXG4gICAgLy8gd2UgZ28gb3ZlciBhbGwgZm9ybSBlbGVtZW50cyBpbiB0aGUgbmV3IEhUTUwgZm9yIHRoZSBMVlxuICAgIC8vIGFuZCBsb29rIGZvciBvbGQgZm9ybXMgaW4gdGhlIGBmb3Jtc0ZvclJlY292ZXJ5YCBvYmplY3Q7XG4gICAgLy8gdGhlIGZvcm1zRm9yUmVjb3ZlcnkgY2FuIGFsc28gY29udGFpbiBmb3JtcyBmcm9tIGNoaWxkIHZpZXdzXG4gICAgY29uc3QgZm9ybXNUb1JlY292ZXIgPVxuICAgICAgLy8gd2UgZ28gb3ZlciBhbGwgZm9ybXMgaW4gdGhlIG5ldyBET007IGJlY2F1c2UgdGhpcyBpcyBvbmx5IHRoZSBIVE1MIGZvciB0aGUgY3VycmVudFxuICAgICAgLy8gdmlldywgd2UgY2FuIGJlIHN1cmUgdGhhdCBhbGwgZm9ybXMgYXJlIG93bmVkIGJ5IHRoaXMgdmlldzpcbiAgICAgIERPTS5hbGwodGVtcGxhdGUuY29udGVudCwgXCJmb3JtXCIpXG4gICAgICAgIC8vIG9ubHkgcmVjb3ZlciBmb3JtcyB0aGF0IGhhdmUgYW4gaWQgYW5kIGFyZSBpbiB0aGUgb2xkIERPTVxuICAgICAgICAuZmlsdGVyKG5ld0Zvcm0gPT4gbmV3Rm9ybS5pZCAmJiBvbGRGb3Jtc1tuZXdGb3JtLmlkXSlcbiAgICAgICAgLy8gYWJhbmRvbiBmb3JtcyB3ZSBhbHJlYWR5IHRyaWVkIHRvIHJlY292ZXIgdG8gcHJldmVudCBsb29waW5nIGEgZmFpbGVkIHN0YXRlXG4gICAgICAgIC5maWx0ZXIobmV3Rm9ybSA9PiAhdGhpcy5wZW5kaW5nRm9ybXMuaGFzKG5ld0Zvcm0uaWQpKVxuICAgICAgICAvLyBvbmx5IHJlY292ZXIgaWYgdGhlIGZvcm0gaGFzIHRoZSBzYW1lIHBoeC1jaGFuZ2UgdmFsdWVcbiAgICAgICAgLmZpbHRlcihuZXdGb3JtID0+IG9sZEZvcm1zW25ld0Zvcm0uaWRdLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpID09PSBuZXdGb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpKVxuICAgICAgICAubWFwKG5ld0Zvcm0gPT4ge1xuICAgICAgICAgIHJldHVybiBbb2xkRm9ybXNbbmV3Rm9ybS5pZF0sIG5ld0Zvcm1dXG4gICAgICAgIH0pXG5cbiAgICBpZihmb3Jtc1RvUmVjb3Zlci5sZW5ndGggPT09IDApe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICBmb3Jtc1RvUmVjb3Zlci5mb3JFYWNoKChbb2xkRm9ybSwgbmV3Rm9ybV0sIGkpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ0Zvcm1zLmFkZChuZXdGb3JtLmlkKVxuICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGUgZmlyc3RFbGVtZW50Q2hpbGQgb2YgdGhlIHRlbXBsYXRlIGNvbnRlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2hlbiB0cmF2ZXJzaW5nIGEgZG9jdW1lbnRGcmFnbWVudCB1c2luZyBwYXJlbnROb2RlLCB3ZSB3b24ndCBldmVyIGFycml2ZSBhdFxuICAgICAgLy8gdGhlIGZyYWdtZW50OyBhcyB0aGUgdGVtcGxhdGUgaXMgYWx3YXlzIGEgTGl2ZVZpZXcsIHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlcmUgaXMgb25seVxuICAgICAgLy8gb25lIGNoaWxkIG9uIHRoZSByb290IGxldmVsXG4gICAgICB0aGlzLnB1c2hGb3JtUmVjb3Zlcnkob2xkRm9ybSwgbmV3Rm9ybSwgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCwgKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdGb3Jtcy5kZWxldGUobmV3Rm9ybS5pZClcbiAgICAgICAgLy8gd2Ugb25seSBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGFsbCBmb3JtcyBoYXZlIGJlZW4gcmVjb3ZlcmVkXG4gICAgICAgIGlmKGkgPT09IGZvcm1zVG9SZWNvdmVyLmxlbmd0aCAtIDEpe1xuICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKXsgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF0gfVxuXG4gIGdldERlc2NlbmRlbnRCeUVsKGVsKXtcbiAgICBpZihlbC5pZCA9PT0gdGhpcy5pZCl7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCldPy5bZWwuaWRdXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveURlc2NlbmRlbnQoaWQpe1xuICAgIGZvcihsZXQgcGFyZW50SWQgaW4gdGhpcy5yb290LmNoaWxkcmVuKXtcbiAgICAgIGZvcihsZXQgY2hpbGRJZCBpbiB0aGlzLnJvb3QuY2hpbGRyZW5bcGFyZW50SWRdKXtcbiAgICAgICAgaWYoY2hpbGRJZCA9PT0gaWQpeyByZXR1cm4gdGhpcy5yb290LmNoaWxkcmVuW3BhcmVudElkXVtjaGlsZElkXS5kZXN0cm95KCkgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGpvaW5DaGlsZChlbCl7XG4gICAgbGV0IGNoaWxkID0gdGhpcy5nZXRDaGlsZEJ5SWQoZWwuaWQpXG4gICAgaWYoIWNoaWxkKXtcbiAgICAgIGxldCB2aWV3ID0gbmV3IFZpZXcoZWwsIHRoaXMubGl2ZVNvY2tldCwgdGhpcylcbiAgICAgIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVt2aWV3LmlkXSA9IHZpZXdcbiAgICAgIHZpZXcuam9pbigpXG4gICAgICB0aGlzLmNoaWxkSm9pbnMrK1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBpc0pvaW5QZW5kaW5nKCl7IHJldHVybiB0aGlzLmpvaW5QZW5kaW5nIH1cblxuICBhY2tKb2luKF9jaGlsZCl7XG4gICAgdGhpcy5jaGlsZEpvaW5zLS1cblxuICAgIGlmKHRoaXMuY2hpbGRKb2lucyA9PT0gMCl7XG4gICAgICBpZih0aGlzLnBhcmVudCl7XG4gICAgICAgIHRoaXMucGFyZW50LmFja0pvaW4odGhpcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCl7XG4gICAgLy8gd2UgY2FuIGNsZWFyIHBlbmRpbmcgZm9ybSByZWNvdmVyaWVzIG5vdyB0aGF0IHdlJ3ZlIGpvaW5lZC5cbiAgICAvLyBUaGV5IGVpdGhlciBhbGwgcmVzb2x2ZWQgb3Igd2VyZSBhYmFuZG9uZWRcbiAgICB0aGlzLnBlbmRpbmdGb3Jtcy5jbGVhcigpXG4gICAgLy8gd2UgY2FuIGFsc28gY2xlYXIgdGhlIGZvcm1zRm9yUmVjb3Zlcnkgb2JqZWN0IHRvIG5vdCBrZWVwIG9sZCBmb3JtIGVsZW1lbnRzIGFyb3VuZFxuICAgIHRoaXMuZm9ybXNGb3JSZWNvdmVyeSA9IHt9XG4gICAgdGhpcy5qb2luQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICAgIGlmKCF2aWV3LmlzRGVzdHJveWVkKCkpeyBvcCgpIH1cbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW11cbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlKGRpZmYsIGV2ZW50cyl7XG4gICAgaWYodGhpcy5pc0pvaW5QZW5kaW5nKCkgfHwgKHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpICYmIHRoaXMucm9vdC5pc01haW4oKSkpe1xuICAgICAgcmV0dXJuIHRoaXMucGVuZGluZ0RpZmZzLnB1c2goe2RpZmYsIGV2ZW50c30pXG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlZC5tZXJnZURpZmYoZGlmZilcbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlXG5cbiAgICAvLyBXaGVuIHRoZSBkaWZmIG9ubHkgY29udGFpbnMgY29tcG9uZW50IGRpZmZzLCB0aGVuIHdhbGsgY29tcG9uZW50c1xuICAgIC8vIGFuZCBwYXRjaCBvbmx5IHRoZSBwYXJlbnQgY29tcG9uZW50IGNvbnRhaW5lcnMgZm91bmQgaW4gdGhlIGRpZmYuXG4gICAgLy8gT3RoZXJ3aXNlLCBwYXRjaCBlbnRpcmUgTFYgY29udGFpbmVyLlxuICAgIGlmKHRoaXMucmVuZGVyZWQuaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKSl7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGxldCBwYXJlbnRDaWRzID0gRE9NLmZpbmRFeGlzdGluZ1BhcmVudENJRHModGhpcy5lbCwgdGhpcy5yZW5kZXJlZC5jb21wb25lbnRDSURzKGRpZmYpKVxuICAgICAgICBwYXJlbnRDaWRzLmZvckVhY2gocGFyZW50Q0lEID0+IHtcbiAgICAgICAgICBpZih0aGlzLmNvbXBvbmVudFBhdGNoKHRoaXMucmVuZGVyZWQuZ2V0Q29tcG9uZW50KGRpZmYsIHBhcmVudENJRCksIHBhcmVudENJRCkpeyBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZSB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZighaXNFbXB0eShkaWZmKSl7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImZ1bGwgcGF0Y2ggY29tcGxldGVcIiwgKCkgPT4ge1xuICAgICAgICBsZXQgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIilcbiAgICAgICAgbGV0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIG51bGwpXG4gICAgICAgIHBoeENoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cylcbiAgICBpZihwaHhDaGlsZHJlbkFkZGVkKXsgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKSB9XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCl7XG4gICAgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC50aW1lKGB0b1N0cmluZyBkaWZmICgke2tpbmR9KWAsICgpID0+IHtcbiAgICAgIGxldCB0YWcgPSB0aGlzLmVsLnRhZ05hbWVcbiAgICAgIC8vIERvbid0IHNraXAgYW55IGNvbXBvbmVudCBpbiB0aGUgZGlmZiBub3IgYW55IG1hcmtlZCBhcyBwcnVuZWRcbiAgICAgIC8vIChhcyB0aGV5IG1heSBoYXZlIGJlZW4gYWRkZWQgYmFjaylcbiAgICAgIGxldCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSA6IG51bGxcbiAgICAgIGxldCBbaHRtbCwgc3RyZWFtc10gPSB0aGlzLnJlbmRlcmVkLnRvU3RyaW5nKGNpZHMpXG4gICAgICByZXR1cm4gW2A8JHt0YWd9PiR7aHRtbH08LyR7dGFnfT5gLCBzdHJlYW1zXVxuICAgIH0pXG4gIH1cblxuICBjb21wb25lbnRQYXRjaChkaWZmLCBjaWQpe1xuICAgIGlmKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZVxuICAgIGxldCBbaHRtbCwgc3RyZWFtc10gPSB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudFRvU3RyaW5nKGNpZClcbiAgICBsZXQgcGF0Y2ggPSBuZXcgRE9NUGF0Y2godGhpcywgdGhpcy5lbCwgdGhpcy5pZCwgaHRtbCwgc3RyZWFtcywgY2lkKVxuICAgIGxldCBjaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpXG4gICAgcmV0dXJuIGNoaWxkcmVuQWRkZWRcbiAgfVxuXG4gIGdldEhvb2soZWwpeyByZXR1cm4gdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGVsKV0gfVxuXG4gIGFkZEhvb2soZWwpe1xuICAgIGxldCBob29rRWxJZCA9IFZpZXdIb29rLmVsZW1lbnRJRChlbClcblxuICAgIGlmKGhvb2tFbElkICYmICF0aGlzLnZpZXdIb29rc1tob29rRWxJZF0pe1xuICAgICAgLy8gaG9vayBjcmVhdGVkLCBidXQgbm90IGF0dGFjaGVkIChjcmVhdGVIb29rIGZvciB3ZWIgY29tcG9uZW50KVxuICAgICAgbGV0IGhvb2sgPSBET00uZ2V0Q3VzdG9tRWxIb29rKGVsKSB8fCBsb2dFcnJvcihgbm8gaG9vayBmb3VuZCBmb3IgY3VzdG9tIGVsZW1lbnQ6ICR7ZWwuaWR9YClcbiAgICAgIHRoaXMudmlld0hvb2tzW2hvb2tFbElkXSA9IGhvb2tcbiAgICAgIGhvb2suX19hdHRhY2hWaWV3KHRoaXMpXG4gICAgICByZXR1cm4gaG9va1xuICAgIH1cbiAgICBlbHNlIGlmKGhvb2tFbElkIHx8ICFlbC5nZXRBdHRyaWJ1dGUpe1xuICAgICAgLy8gbm8gaG9vayBmb3VuZFxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5ldyBob29rIGZvdW5kIHdpdGggcGh4LWhvb2sgYXR0cmlidXRlXG4gICAgICBsZXQgaG9va05hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHwgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpXG4gICAgICBpZihob29rTmFtZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpeyByZXR1cm4gfVxuICAgICAgbGV0IGNhbGxiYWNrcyA9IHRoaXMubGl2ZVNvY2tldC5nZXRIb29rQ2FsbGJhY2tzKGhvb2tOYW1lKVxuXG4gICAgICBpZihjYWxsYmFja3Mpe1xuICAgICAgICBpZighZWwuaWQpeyBsb2dFcnJvcihgbm8gRE9NIElEIGZvciBob29rIFwiJHtob29rTmFtZX1cIi4gSG9va3MgcmVxdWlyZSBhIHVuaXF1ZSBJRCBvbiBlYWNoIGVsZW1lbnQuYCwgZWwpIH1cbiAgICAgICAgbGV0IGhvb2sgPSBuZXcgVmlld0hvb2sodGhpcywgZWwsIGNhbGxiYWNrcylcbiAgICAgICAgdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGhvb2suZWwpXSA9IGhvb2tcbiAgICAgICAgcmV0dXJuIGhvb2tcbiAgICAgIH0gZWxzZSBpZihob29rTmFtZSAhPT0gbnVsbCl7XG4gICAgICAgIGxvZ0Vycm9yKGB1bmtub3duIGhvb2sgZm91bmQgZm9yIFwiJHtob29rTmFtZX1cImAsIGVsKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spe1xuICAgIGhvb2suX19kZXN0cm95ZWQoKVxuICAgIGhvb2suX19jbGVhbnVwX18oKVxuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoaG9vay5lbCldXG4gIH1cblxuICBhcHBseVBlbmRpbmdVcGRhdGVzKCl7XG4gICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaCgoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IGNoaWxkLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSlcbiAgfVxuXG4gIGVhY2hDaGlsZChjYWxsYmFjayl7XG4gICAgbGV0IGNoaWxkcmVuID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdIHx8IHt9XG4gICAgZm9yKGxldCBpZCBpbiBjaGlsZHJlbil7IGNhbGxiYWNrKHRoaXMuZ2V0Q2hpbGRCeUlkKGlkKSkgfVxuICB9XG5cbiAgb25DaGFubmVsKGV2ZW50LCBjYil7XG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIGV2ZW50LCByZXNwID0+IHtcbiAgICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpKXtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IGNiKHJlc3ApXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IGNiKHJlc3ApKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpe1xuICAgIC8vIFRoZSBkaWZmIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSByZWd1bGFyIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgIC8vIEFsbCBvdGhlciBvcGVyYXRpb25zIGFyZSBxdWV1ZWQgdG8gYmUgYXBwbGllZCBvbmx5IGFmdGVyIGpvaW4uXG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIFwiZGlmZlwiLCAocmF3RGlmZikgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5RGlmZihcInVwZGF0ZVwiLCByYXdEaWZmLCAoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJyZWRpcmVjdFwiLCAoe3RvLCBmbGFzaH0pID0+IHRoaXMub25SZWRpcmVjdCh7dG8sIGZsYXNofSkpXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3BhdGNoXCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVQYXRjaChyZWRpcikpXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpXG4gICAgdGhpcy5jaGFubmVsLm9uRXJyb3IocmVhc29uID0+IHRoaXMub25FcnJvcihyZWFzb24pKVxuICAgIHRoaXMuY2hhbm5lbC5vbkNsb3NlKHJlYXNvbiA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSlcbiAgfVxuXG4gIGRlc3Ryb3lBbGxDaGlsZHJlbigpeyB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiBjaGlsZC5kZXN0cm95KCkpIH1cblxuICBvbkxpdmVSZWRpcmVjdChyZWRpcil7XG4gICAgbGV0IHt0bywga2luZCwgZmxhc2h9ID0gcmVkaXJcbiAgICBsZXQgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pXG4gICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6c2VydmVyLW5hdmlnYXRlXCIsIHtkZXRhaWw6IHt0bywga2luZCwgZmxhc2h9fSlcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KGUsIHVybCwga2luZCwgZmxhc2gpXG4gIH1cblxuICBvbkxpdmVQYXRjaChyZWRpcil7XG4gICAgbGV0IHt0bywga2luZH0gPSByZWRpclxuICAgIHRoaXMuaHJlZiA9IHRoaXMuZXhwYW5kVVJMKHRvKVxuICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpXG4gIH1cblxuICBleHBhbmRVUkwodG8pe1xuICAgIHJldHVybiB0by5zdGFydHNXaXRoKFwiL1wiKSA/IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9JHt0b31gIDogdG9cbiAgfVxuXG4gIG9uUmVkaXJlY3Qoe3RvLCBmbGFzaCwgcmVsb2FkVG9rZW59KXsgdGhpcy5saXZlU29ja2V0LnJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pIH1cblxuICBpc0Rlc3Ryb3llZCgpeyByZXR1cm4gdGhpcy5kZXN0cm95ZWQgfVxuXG4gIGpvaW5EZWFkKCl7IHRoaXMuaXNEZWFkID0gdHJ1ZSB9XG5cbiAgam9pblB1c2goKXtcbiAgICB0aGlzLmpvaW5QdXNoID0gdGhpcy5qb2luUHVzaCB8fCB0aGlzLmNoYW5uZWwuam9pbigpXG4gICAgcmV0dXJuIHRoaXMuam9pblB1c2hcbiAgfVxuXG4gIGpvaW4oY2FsbGJhY2spe1xuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dClcbiAgICB0aGlzLmJpbmRDaGFubmVsKClcbiAgICBpZih0aGlzLmlzTWFpbigpKXtcbiAgICAgIHRoaXMuc3RvcENhbGxiYWNrID0gdGhpcy5saXZlU29ja2V0LndpdGhQYWdlTG9hZGluZyh7dG86IHRoaXMuaHJlZiwga2luZDogXCJpbml0aWFsXCJ9KVxuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbigpe31cbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKVxuICAgIH1cblxuICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLmpvaW4oKSwge1xuICAgICAgb2s6IChyZXNwKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLm9uSm9pbihyZXNwKSksXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB0aGlzLm9uSm9pbkVycm9yKGVycm9yKSxcbiAgICAgIHRpbWVvdXQ6ICgpID0+IHRoaXMub25Kb2luRXJyb3Ioe3JlYXNvbjogXCJ0aW1lb3V0XCJ9KVxuICAgIH0pXG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKXtcbiAgICBpZihyZXNwLnJlYXNvbiA9PT0gXCJyZWxvYWRcIil7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtgZmFpbGVkIG1vdW50IHdpdGggJHtyZXNwLnN0YXR1c30uIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlbG9hZGAsIHJlc3BdKVxuICAgICAgdGhpcy5vblJlZGlyZWN0KHt0bzogdGhpcy5yb290LmhyZWYsIHJlbG9hZFRva2VuOiByZXNwLnRva2VufSlcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZihyZXNwLnJlYXNvbiA9PT0gXCJ1bmF1dGhvcml6ZWRcIiB8fCByZXNwLnJlYXNvbiA9PT0gXCJzdGFsZVwiKXtcbiAgICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIiwgcmVzcF0pXG4gICAgICB0aGlzLm9uUmVkaXJlY3Qoe3RvOiB0aGlzLnJvb3QuaHJlZn0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYocmVzcC5yZWRpcmVjdCB8fCByZXNwLmxpdmVfcmVkaXJlY3Qpe1xuICAgICAgdGhpcy5qb2luUGVuZGluZyA9IGZhbHNlXG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKVxuICAgIH1cbiAgICBpZihyZXNwLnJlZGlyZWN0KXsgcmV0dXJuIHRoaXMub25SZWRpcmVjdChyZXNwLnJlZGlyZWN0KSB9XG4gICAgaWYocmVzcC5saXZlX3JlZGlyZWN0KXsgcmV0dXJuIHRoaXMub25MaXZlUmVkaXJlY3QocmVzcC5saXZlX3JlZGlyZWN0KSB9XG4gICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ1bmFibGUgdG8gam9pblwiLCByZXNwXSlcbiAgICBpZih0aGlzLmlzTWFpbigpKXtcbiAgICAgIHRoaXMuZGlzcGxheUVycm9yKFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSlcbiAgICAgIGlmKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcykgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZih0aGlzLmpvaW5BdHRlbXB0cyA+PSBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUyl7XG4gICAgICAgIC8vIHB1dCB0aGUgcm9vdCByZXZpZXcgaW50byBwZXJtYW5lbnQgZXJyb3Igc3RhdGUsIGJ1dCBkb24ndCBkZXN0cm95IGl0IGFzIGl0IGNhbiByZW1haW4gYWN0aXZlXG4gICAgICAgIHRoaXMucm9vdC5kaXNwbGF5RXJyb3IoW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdKVxuICAgICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtgZ2l2aW5nIHVwIHRyeWluZyB0byBtb3VudCBhZnRlciAke01BWF9DSElMRF9KT0lOX0FUVEVNUFRTfSB0cmllc2AsIHJlc3BdKVxuICAgICAgICB0aGlzLmRlc3Ryb3koKVxuICAgICAgfVxuICAgICAgbGV0IHRydWVDaGlsZEVsID0gRE9NLmJ5SWQodGhpcy5lbC5pZClcbiAgICAgIGlmKHRydWVDaGlsZEVsKXtcbiAgICAgICAgRE9NLm1lcmdlQXR0cnModHJ1ZUNoaWxkRWwsIHRoaXMuZWwpXG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSlcbiAgICAgICAgdGhpcy5lbCA9IHRydWVDaGlsZEVsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKXtcbiAgICBpZih0aGlzLmlzRGVzdHJveWVkKCkpeyByZXR1cm4gfVxuICAgIGlmKHRoaXMuaXNNYWluKCkgJiYgdGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgcmVhc29uICE9PSBcImxlYXZlXCIpe1xuICAgICAgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMpXG4gICAgfVxuICAgIHRoaXMuZGVzdHJveUFsbENoaWxkcmVuKClcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcylcbiAgICAvLyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiBiZSBudWxsIGluIEludGVybmV0IEV4cGxvcmVyIDExXG4gICAgaWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl7IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpIH1cbiAgICBpZih0aGlzLmxpdmVTb2NrZXQuaXNVbmxvYWRlZCgpKXtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKVxuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IocmVhc29uKXtcbiAgICB0aGlzLm9uQ2xvc2UocmVhc29uKVxuICAgIGlmKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSkgfVxuICAgIGlmKCF0aGlzLmxpdmVTb2NrZXQuaXNVbmxvYWRlZCgpKXtcbiAgICAgIGlmKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKXtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9DTElFTlRfRVJST1JfQ0xBU1NdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRpc3BsYXlFcnJvcihjbGFzc2VzKXtcbiAgICBpZih0aGlzLmlzTWFpbigpKXsgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwge2RldGFpbDoge3RvOiB0aGlzLmhyZWYsIGtpbmQ6IFwiZXJyb3JcIn19KSB9XG4gICAgdGhpcy5zaG93TG9hZGVyKClcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3NlcylcbiAgICB0aGlzLmV4ZWNBbGwodGhpcy5iaW5kaW5nKFwiZGlzY29ubmVjdGVkXCIpKVxuICB9XG5cbiAgd3JhcFB1c2goY2FsbGVyUHVzaCwgcmVjZWl2ZXMpe1xuICAgIGxldCBsYXRlbmN5ID0gdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKVxuICAgIGxldCB3aXRoTGF0ZW5jeSA9IGxhdGVuY3kgP1xuICAgICAgKGNiKSA9PiBzZXRUaW1lb3V0KCgpID0+ICF0aGlzLmlzRGVzdHJveWVkKCkgJiYgY2IoKSwgbGF0ZW5jeSkgOlxuICAgICAgKGNiKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIGNiKClcblxuICAgIHdpdGhMYXRlbmN5KCgpID0+IHtcbiAgICAgIGNhbGxlclB1c2goKVxuICAgICAgICAucmVjZWl2ZShcIm9rXCIsIHJlc3AgPT4gd2l0aExhdGVuY3koKCkgPT4gcmVjZWl2ZXMub2sgJiYgcmVjZWl2ZXMub2socmVzcCkpKVxuICAgICAgICAucmVjZWl2ZShcImVycm9yXCIsIHJlYXNvbiA9PiB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy5lcnJvciAmJiByZWNlaXZlcy5lcnJvcihyZWFzb24pKSlcbiAgICAgICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHdpdGhMYXRlbmN5KCgpID0+IHJlY2VpdmVzLnRpbWVvdXQgJiYgcmVjZWl2ZXMudGltZW91dCgpKSlcbiAgICB9KVxuICB9XG5cbiAgcHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIGV2ZW50LCBwYXlsb2FkKXtcbiAgICBpZighdGhpcy5pc0Nvbm5lY3RlZCgpKXsgcmV0dXJuIFByb21pc2UucmVqZWN0KHtlcnJvcjogXCJub2Nvbm5lY3Rpb25cIn0pIH1cblxuICAgIGxldCBbcmVmLCBbZWxdLCBvcHRzXSA9IHJlZkdlbmVyYXRvciA/IHJlZkdlbmVyYXRvcigpIDogW251bGwsIFtdLCB7fV1cbiAgICBsZXQgb2xkSm9pbkNvdW50ID0gdGhpcy5qb2luQ291bnRcbiAgICBsZXQgb25Mb2FkaW5nRG9uZSA9IGZ1bmN0aW9uKCl7fVxuICAgIGlmKG9wdHMucGFnZV9sb2FkaW5nKXtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtraW5kOiBcImVsZW1lbnRcIiwgdGFyZ2V0OiBlbH0pXG4gICAgfVxuXG4gICAgaWYodHlwZW9mIChwYXlsb2FkLmNpZCkgIT09IFwibnVtYmVyXCIpeyBkZWxldGUgcGF5bG9hZC5jaWQgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLnB1c2goZXZlbnQsIHBheWxvYWQsIFBVU0hfVElNRU9VVCksIHtcbiAgICAgICAgb2s6IChyZXNwKSA9PiB7XG4gICAgICAgICAgaWYocmVmICE9PSBudWxsKXsgdGhpcy5sYXN0QWNrUmVmID0gcmVmIH1cbiAgICAgICAgICBsZXQgZmluaXNoID0gKGhvb2tSZXBseSkgPT4ge1xuICAgICAgICAgICAgaWYocmVzcC5yZWRpcmVjdCl7IHRoaXMub25SZWRpcmVjdChyZXNwLnJlZGlyZWN0KSB9XG4gICAgICAgICAgICBpZihyZXNwLmxpdmVfcGF0Y2gpeyB0aGlzLm9uTGl2ZVBhdGNoKHJlc3AubGl2ZV9wYXRjaCkgfVxuICAgICAgICAgICAgaWYocmVzcC5saXZlX3JlZGlyZWN0KXsgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpIH1cbiAgICAgICAgICAgIG9uTG9hZGluZ0RvbmUoKVxuICAgICAgICAgICAgcmVzb2x2ZSh7cmVzcDogcmVzcCwgcmVwbHk6IGhvb2tSZXBseX0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3AuZGlmZil7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYXBwbHlEaWZmKFwidXBkYXRlXCIsIHJlc3AuZGlmZiwgKHtkaWZmLCByZXBseSwgZXZlbnRzfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKHJlZiAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKVxuICAgICAgICAgICAgICAgIGZpbmlzaChyZXBseSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKHJlZiAhPT0gbnVsbCl7IHRoaXMudW5kb1JlZnMocmVmLCBwYXlsb2FkLmV2ZW50KSB9XG4gICAgICAgICAgICBmaW5pc2gobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAocmVhc29uKSA9PiByZWplY3Qoe2Vycm9yOiByZWFzb259KSxcbiAgICAgICAgdGltZW91dDogKCkgPT4ge1xuICAgICAgICAgIHJlamVjdCh7dGltZW91dDogdHJ1ZX0pXG4gICAgICAgICAgaWYodGhpcy5qb2luQ291bnQgPT09IG9sZEpvaW5Db3VudCl7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9nKFwidGltZW91dFwiLCAoKSA9PiBbXCJyZWNlaXZlZCB0aW1lb3V0IHdoaWxlIGNvbW11bmljYXRpbmcgd2l0aCBzZXJ2ZXIuIEZhbGxpbmcgYmFjayB0byBoYXJkIHJlZnJlc2ggZm9yIHJlY292ZXJ5XCJdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIG9ubHlFbHMpe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfSAvLyBleGl0IGlmIGV4dGVybmFsIGZvcm0gdHJpZ2dlcmVkXG4gICAgbGV0IHNlbGVjdG9yID0gYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gXG5cbiAgICBpZihvbmx5RWxzKXtcbiAgICAgIG9ubHlFbHMgPSBuZXcgU2V0KG9ubHlFbHMpXG4gICAgICBET00uYWxsKGRvY3VtZW50LCBzZWxlY3RvciwgcGFyZW50ID0+IHtcbiAgICAgICAgaWYob25seUVscyAmJiAhb25seUVscy5oYXMocGFyZW50KSl7IHJldHVybiB9XG4gICAgICAgIC8vIHVuZG8gYW55IGNoaWxkIHJlZnMgd2l0aGluIHBhcmVudCBmaXJzdFxuICAgICAgICBET00uYWxsKHBhcmVudCwgc2VsZWN0b3IsIGNoaWxkID0+IHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSlcbiAgICAgICAgdGhpcy51bmRvRWxSZWYocGFyZW50LCByZWYsIHBoeEV2ZW50KVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLmFsbChkb2N1bWVudCwgc2VsZWN0b3IsIGVsID0+IHRoaXMudW5kb0VsUmVmKGVsLCByZWYsIHBoeEV2ZW50KSlcbiAgICB9XG4gIH1cblxuICB1bmRvRWxSZWYoZWwsIHJlZiwgcGh4RXZlbnQpe1xuICAgIGxldCBlbFJlZiA9IG5ldyBFbGVtZW50UmVmKGVsKVxuXG4gICAgZWxSZWYubWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIGNsb25lZFRyZWUgPT4ge1xuICAgICAgbGV0IGhvb2sgPSB0aGlzLnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGVsLCBjbG9uZWRUcmVlKVxuICAgICAgRE9NUGF0Y2gucGF0Y2hXaXRoQ2xvbmVkVHJlZShlbCwgY2xvbmVkVHJlZSwgdGhpcy5saXZlU29ja2V0KVxuICAgICAgRE9NLmFsbChlbCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCBjaGlsZCA9PiB0aGlzLnVuZG9FbFJlZihjaGlsZCwgcmVmLCBwaHhFdmVudCkpXG4gICAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKGVsKVxuICAgICAgaWYoaG9vayl7IGhvb2suX191cGRhdGVkKCkgfVxuICAgIH0pXG4gIH1cblxuICByZWZTcmMoKXsgcmV0dXJuIHRoaXMuZWwuaWQgfVxuXG4gIHB1dFJlZihlbGVtZW50cywgcGh4RXZlbnQsIGV2ZW50VHlwZSwgb3B0cyA9IHt9KXtcbiAgICBsZXQgbmV3UmVmID0gdGhpcy5yZWYrK1xuICAgIGxldCBkaXNhYmxlV2l0aCA9IHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKVxuICAgIGlmKG9wdHMubG9hZGluZyl7XG4gICAgICBsZXQgbG9hZGluZ0VscyA9IERPTS5hbGwoZG9jdW1lbnQsIG9wdHMubG9hZGluZykubWFwKGVsID0+IHtcbiAgICAgICAgcmV0dXJuIHtlbCwgbG9jazogdHJ1ZSwgbG9hZGluZzogdHJ1ZX1cbiAgICAgIH0pXG4gICAgICBlbGVtZW50cyA9IGVsZW1lbnRzLmNvbmNhdChsb2FkaW5nRWxzKVxuICAgIH1cblxuICAgIGZvcihsZXQge2VsLCBsb2NrLCBsb2FkaW5nfSBvZiBlbGVtZW50cyl7XG4gICAgICBpZighbG9jayAmJiAhbG9hZGluZyl7IHRocm93IG5ldyBFcnJvcihcInB1dFJlZiByZXF1aXJlcyBsb2NrIG9yIGxvYWRpbmdcIikgfVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKVxuICAgICAgaWYobG9hZGluZyl7IGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcsIG5ld1JlZikgfVxuICAgICAgaWYobG9jayl7IGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0ssIG5ld1JlZikgfVxuXG4gICAgICBpZighbG9hZGluZyB8fCAob3B0cy5zdWJtaXR0ZXIgJiYgIShlbCA9PT0gb3B0cy5zdWJtaXR0ZXIgfHwgZWwgPT09IG9wdHMuZm9ybSkpKXsgY29udGludWUgfVxuXG4gICAgICBsZXQgbG9ja0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGBwaHg6dW5kby1sb2NrOiR7bmV3UmVmfWAsICgpID0+IHJlc29sdmUoZGV0YWlsKSwge29uY2U6IHRydWV9KVxuICAgICAgfSlcblxuICAgICAgbGV0IGxvYWRpbmdDb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihgcGh4OnVuZG8tbG9hZGluZzoke25ld1JlZn1gLCAoKSA9PiByZXNvbHZlKGRldGFpbCksIHtvbmNlOiB0cnVlfSlcbiAgICAgIH0pXG5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoYHBoeC0ke2V2ZW50VHlwZX0tbG9hZGluZ2ApXG4gICAgICBsZXQgZGlzYWJsZVRleHQgPSBlbC5nZXRBdHRyaWJ1dGUoZGlzYWJsZVdpdGgpXG4gICAgICBpZihkaXNhYmxlVGV4dCAhPT0gbnVsbCl7XG4gICAgICAgIGlmKCFlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKSl7XG4gICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSwgZWwuaW5uZXJUZXh0KVxuICAgICAgICB9XG4gICAgICAgIGlmKGRpc2FibGVUZXh0ICE9PSBcIlwiKXsgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVRleHQgfVxuICAgICAgICAvLyBQSFhfRElTQUJMRUQgY291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGluIGRpc2FibGVGb3JtXG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQsIGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpIHx8IGVsLmRpc2FibGVkKVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKVxuICAgICAgfVxuXG4gICAgICBsZXQgZGV0YWlsID0ge1xuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICByZWY6IG5ld1JlZixcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBpc0xvY2tlZDogbG9jayxcbiAgICAgICAgbG9ja0VsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoKHtsb2NrfSkgPT4gbG9jaykubWFwKCh7ZWx9KSA9PiBlbCksXG4gICAgICAgIGxvYWRpbmdFbGVtZW50czogZWxlbWVudHMuZmlsdGVyKCh7bG9hZGluZ30pID0+IGxvYWRpbmcpLm1hcCgoe2VsfSkgPT4gZWwpLFxuICAgICAgICB1bmxvY2s6IChlbHMpID0+IHtcbiAgICAgICAgICBlbHMgPSBBcnJheS5pc0FycmF5KGVscykgPyBlbHMgOiBbZWxzXVxuICAgICAgICAgIHRoaXMudW5kb1JlZnMobmV3UmVmLCBwaHhFdmVudCwgZWxzKVxuICAgICAgICB9LFxuICAgICAgICBsb2NrQ29tcGxldGU6IGxvY2tDb21wbGV0ZVByb21pc2UsXG4gICAgICAgIGxvYWRpbmdDb21wbGV0ZTogbG9hZGluZ0NvbXBsZXRlUHJvbWlzZSxcbiAgICAgICAgbG9jazogKGxvY2tFbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXNBY2tlZChuZXdSZWYpKXsgcmV0dXJuIHJlc29sdmUoZGV0YWlsKSB9XG4gICAgICAgICAgICBsb2NrRWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfTE9DSywgbmV3UmVmKVxuICAgICAgICAgICAgbG9ja0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX1NSQywgdGhpcy5yZWZTcmMoKSlcbiAgICAgICAgICAgIGxvY2tFbC5hZGRFdmVudExpc3RlbmVyKGBwaHg6bG9jay1zdG9wOiR7bmV3UmVmfWAsICgpID0+IHJlc29sdmUoZGV0YWlsKSwge29uY2U6IHRydWV9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGBwaHg6cHVzaGAsIHtcbiAgICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgICB9KSlcbiAgICAgIGlmKHBoeEV2ZW50KXtcbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoYHBoeDpwdXNoOiR7cGh4RXZlbnR9YCwge1xuICAgICAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbbmV3UmVmLCBlbGVtZW50cy5tYXAoKHtlbH0pID0+IGVsKSwgb3B0c11cbiAgfVxuXG4gIGlzQWNrZWQocmVmKXsgcmV0dXJuIHRoaXMubGFzdEFja1JlZiAhPT0gbnVsbCAmJiB0aGlzLmxhc3RBY2tSZWYgPj0gcmVmIH1cblxuICBjb21wb25lbnRJRChlbCl7XG4gICAgbGV0IGNpZCA9IGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVClcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGxcbiAgfVxuXG4gIHRhcmdldENvbXBvbmVudElEKHRhcmdldCwgdGFyZ2V0Q3R4LCBvcHRzID0ge30pe1xuICAgIGlmKGlzQ2lkKHRhcmdldEN0eCkpeyByZXR1cm4gdGFyZ2V0Q3R4IH1cblxuICAgIGxldCBjaWRPclNlbGVjdG9yID0gb3B0cy50YXJnZXQgfHwgdGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpXG4gICAgaWYoaXNDaWQoY2lkT3JTZWxlY3Rvcikpe1xuICAgICAgcmV0dXJuIHBhcnNlSW50KGNpZE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIGlmKHRhcmdldEN0eCAmJiAoY2lkT3JTZWxlY3RvciAhPT0gbnVsbCB8fCBvcHRzLnRhcmdldCkpe1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBjbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KXtcbiAgICBpZihpc0NpZCh0YXJnZXRDdHgpKXtcbiAgICAgIHJldHVybiB0YXJnZXRDdHhcbiAgICB9IGVsc2UgaWYodGFyZ2V0Q3R4KXtcbiAgICAgIHJldHVybiBtYXliZSh0YXJnZXRDdHguY2xvc2VzdChgWyR7UEhYX0NPTVBPTkVOVH1dYCksIGVsID0+IHRoaXMub3duc0VsZW1lbnQoZWwpICYmIHRoaXMuY29tcG9uZW50SUQoZWwpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQoZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkpe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpe1xuICAgICAgdGhpcy5sb2coXCJob29rXCIsICgpID0+IFtcInVuYWJsZSB0byBwdXNoIGhvb2sgZXZlbnQuIExpdmVWaWV3IG5vdCBjb25uZWN0ZWRcIiwgZXZlbnQsIHBheWxvYWRdKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGxldCBbcmVmLCBlbHMsIG9wdHNdID0gdGhpcy5wdXRSZWYoW3tlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZX1dLCBldmVudCwgXCJob29rXCIpXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KCgpID0+IFtyZWYsIGVscywgb3B0c10sIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogXCJob29rXCIsXG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICB2YWx1ZTogcGF5bG9hZCxcbiAgICAgIGNpZDogdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KVxuICAgIH0pLnRoZW4oKHtyZXNwOiBfcmVzcCwgcmVwbHk6IGhvb2tSZXBseX0pID0+IG9uUmVwbHkoaG9va1JlcGx5LCByZWYpKVxuXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgZXh0cmFjdE1ldGEoZWwsIG1ldGEsIHZhbHVlKXtcbiAgICBsZXQgcHJlZml4ID0gdGhpcy5iaW5kaW5nKFwidmFsdWUtXCIpXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgaWYoIW1ldGEpeyBtZXRhID0ge30gfVxuICAgICAgbGV0IG5hbWUgPSBlbC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKXsgbWV0YVtuYW1lLnJlcGxhY2UocHJlZml4LCBcIlwiKV0gPSBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgfVxuICAgIH1cbiAgICBpZihlbC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoZWwgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpKXtcbiAgICAgIGlmKCFtZXRhKXsgbWV0YSA9IHt9IH1cbiAgICAgIG1ldGEudmFsdWUgPSBlbC52YWx1ZVxuXG4gICAgICBpZihlbC50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgQ0hFQ0tBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDAgJiYgIWVsLmNoZWNrZWQpe1xuICAgICAgICBkZWxldGUgbWV0YS52YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICBpZih2YWx1ZSl7XG4gICAgICBpZighbWV0YSl7IG1ldGEgPSB7fSB9XG4gICAgICBmb3IobGV0IGtleSBpbiB2YWx1ZSl7IG1ldGFba2V5XSA9IHZhbHVlW2tleV0gfVxuICAgIH1cbiAgICByZXR1cm4gbWV0YVxuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30sIG9uUmVwbHkpe1xuICAgIHRoaXMucHVzaFdpdGhSZXBseSgoKSA9PiB0aGlzLnB1dFJlZihbe2VsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlfV0sIHBoeEV2ZW50LCB0eXBlLCBvcHRzKSwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgY2lkOiB0aGlzLnRhcmdldENvbXBvbmVudElEKGVsLCB0YXJnZXRDdHgsIG9wdHMpXG4gICAgfSkudGhlbigoe3Jlc3AsIHJlcGx5fSkgPT4gb25SZXBseSAmJiBvblJlcGx5KHJlcGx5KSlcbiAgfVxuXG4gIHB1c2hGaWxlUHJvZ3Jlc3MoZmlsZUVsLCBlbnRyeVJlZiwgcHJvZ3Jlc3MsIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgdGhpcy5saXZlU29ja2V0LndpdGhpbk93bmVycyhmaWxlRWwuZm9ybSwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICBldmVudDogZmlsZUVsLmdldEF0dHJpYnV0ZSh2aWV3LmJpbmRpbmcoUEhYX1BST0dSRVNTKSksXG4gICAgICAgIHJlZjogZmlsZUVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgIHByb2dyZXNzOiBwcm9ncmVzcyxcbiAgICAgICAgY2lkOiB2aWV3LnRhcmdldENvbXBvbmVudElEKGZpbGVFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9KS50aGVuKCh7cmVzcH0pID0+IG9uUmVwbHkocmVzcCkpXG4gICAgfSlcbiAgfVxuXG4gIHB1c2hJbnB1dChpbnB1dEVsLCB0YXJnZXRDdHgsIGZvcmNlQ2lkLCBwaHhFdmVudCwgb3B0cywgY2FsbGJhY2spe1xuICAgIGlmKCFpbnB1dEVsLmZvcm0pe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybSBldmVudHMgcmVxdWlyZSB0aGUgaW5wdXQgdG8gYmUgaW5zaWRlIGEgZm9ybVwiKVxuICAgIH1cblxuICAgIGxldCB1cGxvYWRzXG4gICAgbGV0IGNpZCA9IGlzQ2lkKGZvcmNlQ2lkKSA/IGZvcmNlQ2lkIDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgb3B0cylcbiAgICBsZXQgcmVmR2VuZXJhdG9yID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFtcbiAgICAgICAge2VsOiBpbnB1dEVsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlfSxcbiAgICAgICAge2VsOiBpbnB1dEVsLmZvcm0sIGxvYWRpbmc6IHRydWUsIGxvY2s6IHRydWV9XG4gICAgICBdLCBwaHhFdmVudCwgXCJjaGFuZ2VcIiwgb3B0cylcbiAgICB9XG4gICAgbGV0IGZvcm1EYXRhXG4gICAgbGV0IG1ldGEgID0gdGhpcy5leHRyYWN0TWV0YShpbnB1dEVsLmZvcm0pXG4gICAgaWYoaW5wdXRFbCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KXsgbWV0YS5zdWJtaXR0ZXIgPSBpbnB1dEVsIH1cbiAgICBpZihpbnB1dEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpKXtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHtfdGFyZ2V0OiBvcHRzLl90YXJnZXQsIC4uLm1ldGF9LCBbaW5wdXRFbC5uYW1lXSlcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwge190YXJnZXQ6IG9wdHMuX3RhcmdldCwgLi4ubWV0YX0pXG4gICAgfVxuICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIGlucHV0RWwuZmlsZXMgJiYgaW5wdXRFbC5maWxlcy5sZW5ndGggPiAwKXtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpXG4gICAgfVxuICAgIHVwbG9hZHMgPSBMaXZlVXBsb2FkZXIuc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKVxuXG4gICAgbGV0IGV2ZW50ID0ge1xuICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICB1cGxvYWRzOiB1cGxvYWRzLFxuICAgICAgY2lkOiBjaWRcbiAgICB9XG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCBldmVudCkudGhlbigoe3Jlc3B9KSA9PiB7XG4gICAgICBpZihET00uaXNVcGxvYWRJbnB1dChpbnB1dEVsKSAmJiBET00uaXNBdXRvVXBsb2FkKGlucHV0RWwpKXtcbiAgICAgICAgaWYoTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkubGVuZ3RoID4gMCl7XG4gICAgICAgICAgbGV0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKClcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIFtpbnB1dEVsLmZvcm1dKVxuICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoaW5wdXRFbC5mb3JtLCBwaHhFdmVudCwgdGFyZ2V0Q3R4LCByZWYsIGNpZCwgKF91cGxvYWRzKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwKVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtLCBwaHhFdmVudClcbiAgICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsLCBwaHhFdmVudCl7XG4gICAgbGV0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKVxuICAgIGlmKGF3YWl0aW5nU3VibWl0KXtcbiAgICAgIGxldCBbX2VsLCBfcmVmLCBfb3B0cywgY2FsbGJhY2tdID0gYXdhaXRpbmdTdWJtaXRcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpXG4gICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCl7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT4gZWwuaXNTYW1lTm9kZShmb3JtRWwpKVxuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLmdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpKXsgcmV0dXJuIHRydWUgfVxuICAgIHRoaXMuZm9ybVN1Ym1pdHMucHVzaChbZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrXSlcbiAgfVxuXG4gIGNhbmNlbFN1Ym1pdChmb3JtRWwsIHBoeEV2ZW50KXtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoKFtlbCwgcmVmLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICBpZihlbC5pc1NhbWVOb2RlKGZvcm1FbCkpe1xuICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwgb3B0cyA9IHt9KXtcbiAgICBsZXQgZmlsdGVySWdub3JlZCA9IGVsID0+IHtcbiAgICAgIGxldCB1c2VySWdub3JlZCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGVsLCBgJHt0aGlzLmJpbmRpbmcoUEhYX1VQREFURSl9PWlnbm9yZWAsIGVsLmZvcm0pXG4gICAgICByZXR1cm4gISh1c2VySWdub3JlZCB8fCBjbG9zZXN0UGh4QmluZGluZyhlbCwgXCJkYXRhLXBoeC11cGRhdGU9aWdub3JlXCIsIGVsLmZvcm0pKVxuICAgIH1cbiAgICBsZXQgZmlsdGVyRGlzYWJsZXMgPSBlbCA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSlcbiAgICB9XG4gICAgbGV0IGZpbHRlckJ1dHRvbiA9IGVsID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIlxuXG4gICAgbGV0IGZpbHRlcklucHV0ID0gZWwgPT4gW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKVxuXG4gICAgbGV0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKVxuICAgIGxldCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpXG4gICAgbGV0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpXG4gICAgbGV0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKVxuXG4gICAgYnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKVxuICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZVxuICAgIH0pXG4gICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9SRUFET05MWSwgaW5wdXQucmVhZE9ubHkpXG4gICAgICBpbnB1dC5yZWFkT25seSA9IHRydWVcbiAgICAgIGlmKGlucHV0LmZpbGVzKXtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpXG4gICAgICAgIGlucHV0LmRpc2FibGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gICAgbGV0IGZvcm1FbHMgPSBkaXNhYmxlcy5jb25jYXQoYnV0dG9ucykuY29uY2F0KGlucHV0cykubWFwKGVsID0+IHtcbiAgICAgIHJldHVybiB7ZWwsIGxvYWRpbmc6IHRydWUsIGxvY2s6IHRydWV9XG4gICAgfSlcblxuICAgIC8vIHdlIHJldmVyc2UgdGhlIG9yZGVyIHNvIGZvcm0gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSB0aW1lXG4gICAgLy8gdGhlIGZvcm0gaXMgbG9ja2VkXG4gICAgbGV0IGVscyA9IFt7ZWw6IGZvcm1FbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogZmFsc2V9XS5jb25jYXQoZm9ybUVscykucmV2ZXJzZSgpXG4gICAgcmV0dXJuIHRoaXMucHV0UmVmKGVscywgcGh4RXZlbnQsIFwic3VibWl0XCIsIG9wdHMpXG4gIH1cblxuICBwdXNoRm9ybVN1Ym1pdChmb3JtRWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgb3B0cywgb25SZXBseSl7XG4gICAgbGV0IHJlZkdlbmVyYXRvciA9ICgpID0+IHRoaXMuZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGZvcm06IGZvcm1FbCxcbiAgICAgIHN1Ym1pdHRlcjogc3VibWl0dGVyXG4gICAgfSlcbiAgICBsZXQgY2lkID0gdGhpcy50YXJnZXRDb21wb25lbnRJRChmb3JtRWwsIHRhcmdldEN0eClcbiAgICBpZihMaXZlVXBsb2FkZXIuaGFzVXBsb2Fkc0luUHJvZ3Jlc3MoZm9ybUVsKSl7XG4gICAgICBsZXQgW3JlZiwgX2Vsc10gPSByZWZHZW5lcmF0b3IoKVxuICAgICAgbGV0IHB1c2ggPSAoKSA9PiB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm1FbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzLCBvblJlcGx5KVxuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIHB1c2gpXG4gICAgfSBlbHNlIGlmKExpdmVVcGxvYWRlci5pbnB1dHNBd2FpdGluZ1ByZWZsaWdodChmb3JtRWwpLmxlbmd0aCA+IDApe1xuICAgICAgbGV0IFtyZWYsIGVsc10gPSByZWZHZW5lcmF0b3IoKVxuICAgICAgbGV0IHByb3h5UmVmR2VuID0gKCkgPT4gW3JlZiwgZWxzLCBvcHRzXVxuICAgICAgdGhpcy51cGxvYWRGaWxlcyhmb3JtRWwsIHBoeEV2ZW50LCB0YXJnZXRDdHgsIHJlZiwgY2lkLCAodXBsb2FkcykgPT4ge1xuICAgICAgICAvLyBpZiB3ZSBzdGlsbCBoYXZpbmcgcGVuZGluZyBwcmVmbGlnaHRzIGl0IG1lYW5zIHdlIGhhdmUgaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIC8vIGFuZCB0aGUgcGh4LXN1Ym1pdCBjYW5ub3QgYmUgY29tcGxldGVkXG4gICAgICAgIGlmKExpdmVVcGxvYWRlci5pbnB1dHNBd2FpdGluZ1ByZWZsaWdodChmb3JtRWwpLmxlbmd0aCA+IDApe1xuICAgICAgICAgIHJldHVybiB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1ldGEgPSB0aGlzLmV4dHJhY3RNZXRhKGZvcm1FbClcbiAgICAgICAgbGV0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHtzdWJtaXR0ZXIsIC4uLm1ldGF9KVxuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgY2lkOiBjaWRcbiAgICAgICAgfSkudGhlbigoe3Jlc3B9KSA9PiBvblJlcGx5KHJlc3ApKVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYoIShmb3JtRWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSAmJiBmb3JtRWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIpKSl7XG4gICAgICBsZXQgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoZm9ybUVsKVxuICAgICAgbGV0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHtzdWJtaXR0ZXIsIC4uLm1ldGF9KVxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIHZhbHVlOiBmb3JtRGF0YSxcbiAgICAgICAgY2lkOiBjaWRcbiAgICAgIH0pLnRoZW4oKHtyZXNwfSkgPT4gb25SZXBseShyZXNwKSlcbiAgICB9XG4gIH1cblxuICB1cGxvYWRGaWxlcyhmb3JtRWwsIHBoeEV2ZW50LCB0YXJnZXRDdHgsIHJlZiwgY2lkLCBvbkNvbXBsZXRlKXtcbiAgICBsZXQgam9pbkNvdW50QXRVcGxvYWQgPSB0aGlzLmpvaW5Db3VudFxuICAgIGxldCBpbnB1dEVscyA9IExpdmVVcGxvYWRlci5hY3RpdmVGaWxlSW5wdXRzKGZvcm1FbClcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGhcblxuICAgIC8vIGdldCBlYWNoIGZpbGUgaW5wdXRcbiAgICBpbnB1dEVscy5mb3JFYWNoKGlucHV0RWwgPT4ge1xuICAgICAgbGV0IHVwbG9hZGVyID0gbmV3IExpdmVVcGxvYWRlcihpbnB1dEVsLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS1cbiAgICAgICAgaWYobnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPT09IDApeyBvbkNvbXBsZXRlKCkgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBlbnRyaWVzID0gdXBsb2FkZXIuZW50cmllcygpLm1hcChlbnRyeSA9PiBlbnRyeS50b1ByZWZsaWdodFBheWxvYWQoKSlcblxuICAgICAgaWYoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgIHJlZjogaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcInNlbmRpbmcgcHJlZmxpZ2h0IHJlcXVlc3RcIiwgcGF5bG9hZF0pXG5cbiAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImFsbG93X3VwbG9hZFwiLCBwYXlsb2FkKS50aGVuKCh7cmVzcH0pID0+IHtcbiAgICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW1wiZ290IHByZWZsaWdodCByZXNwb25zZVwiLCByZXNwXSlcbiAgICAgICAgLy8gdGhlIHByZWZsaWdodCB3aWxsIHJlamVjdCBlbnRyaWVzIGJleW9uZCB0aGUgbWF4IGVudHJpZXNcbiAgICAgICAgLy8gc28gd2UgZXJyb3IgYW5kIGNhbmNlbCBlbnRyaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgICB1cGxvYWRlci5lbnRyaWVzKCkuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgaWYocmVzcC5lbnRyaWVzICYmICFyZXNwLmVudHJpZXNbZW50cnkucmVmXSl7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZhaWxlZEVudHJ5UHJlZmxpZ2h0KGVudHJ5LnJlZiwgXCJmYWlsZWQgcHJlZmxpZ2h0XCIsIHVwbG9hZGVyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLy8gZm9yIGF1dG8gdXBsb2Fkcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgZW50cmllcyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gZm9yIGZvcm0gc3VibWl0cyB0aGF0IGNvbnRhaW4gaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIGlmKHJlc3AuZXJyb3IgfHwgT2JqZWN0LmtleXMocmVzcC5lbnRyaWVzKS5sZW5ndGggPT09IDApe1xuICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudClcbiAgICAgICAgICBsZXQgZXJyb3JzID0gcmVzcC5lcnJvciB8fCBbXVxuICAgICAgICAgIGVycm9ycy5tYXAoKFtlbnRyeV9yZWYsIHJlYXNvbl0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkRW50cnlQcmVmbGlnaHQoZW50cnlfcmVmLCByZWFzb24sIHVwbG9hZGVyKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IG9uRXJyb3IgPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYodGhpcy5qb2luQ291bnQgPT09IGpvaW5Db3VudEF0VXBsb2FkKXsgY2FsbGJhY2soKSB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB1cGxvYWRlci5pbml0QWRhcHRlclVwbG9hZChyZXNwLCBvbkVycm9yLCB0aGlzLmxpdmVTb2NrZXQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZUZhaWxlZEVudHJ5UHJlZmxpZ2h0KHVwbG9hZFJlZiwgcmVhc29uLCB1cGxvYWRlcil7XG4gICAgaWYodXBsb2FkZXIuaXNBdXRvVXBsb2FkKCkpe1xuICAgICAgLy8gdXBsb2FkUmVmIG1heSBiZSB0b3AgbGV2ZWwgdXBsb2FkIGNvbmZpZyByZWYgb3IgZW50cnkgcmVmXG4gICAgICBsZXQgZW50cnkgPSB1cGxvYWRlci5lbnRyaWVzKCkuZmluZChlbnRyeSA9PiBlbnRyeS5yZWYgPT09IHVwbG9hZFJlZi50b1N0cmluZygpKVxuICAgICAgaWYoZW50cnkpeyBlbnRyeS5jYW5jZWwoKSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5tYXAoZW50cnkgPT4gZW50cnkuY2FuY2VsKCkpXG4gICAgfVxuICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtgZXJyb3IgZm9yIGVudHJ5ICR7dXBsb2FkUmVmfWAsIHJlYXNvbl0pXG4gIH1cblxuICBkaXNwYXRjaFVwbG9hZHModGFyZ2V0Q3R4LCBuYW1lLCBmaWxlc09yQmxvYnMpe1xuICAgIGxldCB0YXJnZXRFbGVtZW50ID0gdGhpcy50YXJnZXRDdHhFbGVtZW50KHRhcmdldEN0eCkgfHwgdGhpcy5lbFxuICAgIGxldCBpbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyh0YXJnZXRFbGVtZW50KS5maWx0ZXIoZWwgPT4gZWwubmFtZSA9PT0gbmFtZSlcbiAgICBpZihpbnB1dHMubGVuZ3RoID09PSAwKXsgbG9nRXJyb3IoYG5vIGxpdmUgZmlsZSBpbnB1dHMgZm91bmQgbWF0Y2hpbmcgdGhlIG5hbWUgXCIke25hbWV9XCJgKSB9XG4gICAgZWxzZSBpZihpbnB1dHMubGVuZ3RoID4gMSl7IGxvZ0Vycm9yKGBkdXBsaWNhdGUgbGl2ZSBmaWxlIGlucHV0cyBmb3VuZCBtYXRjaGluZyB0aGUgbmFtZSBcIiR7bmFtZX1cImApIH1cbiAgICBlbHNlIHsgRE9NLmRpc3BhdGNoRXZlbnQoaW5wdXRzWzBdLCBQSFhfVFJBQ0tfVVBMT0FEUywge2RldGFpbDoge2ZpbGVzOiBmaWxlc09yQmxvYnN9fSkgfVxuICB9XG5cbiAgdGFyZ2V0Q3R4RWxlbWVudCh0YXJnZXRDdHgpIHtcbiAgICBpZihpc0NpZCh0YXJnZXRDdHgpKXtcbiAgICAgIGxldCBbdGFyZ2V0XSA9IERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5lbCwgdGFyZ2V0Q3R4KVxuICAgICAgcmV0dXJuIHRhcmdldFxuICAgIH0gZWxzZSBpZih0YXJnZXRDdHgpIHtcbiAgICAgIHJldHVybiB0YXJnZXRDdHhcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBwdXNoRm9ybVJlY292ZXJ5KG9sZEZvcm0sIG5ld0Zvcm0sIHRlbXBsYXRlRG9tLCBjYWxsYmFjayl7XG4gICAgLy8gd2UgYXJlIG9ubHkgcmVjb3ZlcmluZyBmb3JtcyBpbnNpZGUgdGhlIGN1cnJlbnQgdmlldywgdGhlcmVmb3JlIGl0IGlzIHNhZmUgdG9cbiAgICAvLyBza2lwIHdpdGhpbk93bmVycyBoZXJlIGFuZCBhbHdheXMgdXNlIHRoaXMgd2hlbiByZWZlcnJpbmcgdG8gdGhlIHZpZXdcbiAgICBjb25zdCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIilcbiAgICBjb25zdCBwaHhUYXJnZXQgPSBuZXdGb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpIHx8IG5ld0Zvcm1cbiAgICBjb25zdCBwaHhFdmVudCA9IG5ld0Zvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgfHwgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKVxuICAgIGNvbnN0IGlucHV0cyA9IEFycmF5LmZyb20ob2xkRm9ybS5lbGVtZW50cykuZmlsdGVyKGVsID0+IERPTS5pc0Zvcm1JbnB1dChlbCkgJiYgZWwubmFtZSAmJiAhZWwuaGFzQXR0cmlidXRlKHBoeENoYW5nZSkpXG4gICAgaWYoaW5wdXRzLmxlbmd0aCA9PT0gMCl7IHJldHVybiB9XG5cbiAgICAvLyB3ZSBtdXN0IGNsZWFyIHRyYWNrZWQgdXBsb2FkcyBiZWZvcmUgcmVjb3ZlcnkgYXMgdGhleSBubyBsb25nZXIgaGF2ZSB2YWxpZCByZWZzXG4gICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4gaW5wdXQuaGFzQXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAmJiBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyhpbnB1dCkpXG4gICAgLy8gcHVzaElucHV0IGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhIHNvdXJjZSBlbGVtZW50IHRoYXQgaW5pdGlhdGVkIHRoZSBjaGFuZ2U7XG4gICAgLy8gYmVjYXVzZSB0aGlzIGlzIG5vdCB0aGUgY2FzZSB3aGVuIHdlIHJlY292ZXIgZm9ybXMsIHdlIHByb3ZpZGUgdGhlIGZpcnN0IGlucHV0IHdlIGZpbmRcbiAgICBsZXQgaW5wdXQgPSBpbnB1dHMuZmluZChlbCA9PiBlbC50eXBlICE9PSBcImhpZGRlblwiKSB8fCBpbnB1dHNbMF1cblxuICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHRhcmdldHMsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgcGVuZGluZyByZWNvdmVyeSBldmVudHNcbiAgICAvLyBhbmQgb25seSBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGFsbCBldmVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZFxuICAgIGxldCBwZW5kaW5nID0gMFxuICAgIC8vIHdpdGhpblRhcmdldHMocGh4VGFyZ2V0LCBjYWxsYmFjaywgZG9tLCB2aWV3RWwpXG4gICAgdGhpcy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgKHRhcmdldFZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgY29uc3QgY2lkID0gdGhpcy50YXJnZXRDb21wb25lbnRJRChuZXdGb3JtLCB0YXJnZXRDdHgpXG4gICAgICBwZW5kaW5nKytcbiAgICAgIHRhcmdldFZpZXcucHVzaElucHV0KGlucHV0LCB0YXJnZXRDdHgsIGNpZCwgcGh4RXZlbnQsIHtfdGFyZ2V0OiBpbnB1dC5uYW1lfSwgKCkgPT4ge1xuICAgICAgICBwZW5kaW5nLS1cbiAgICAgICAgaWYocGVuZGluZyA9PT0gMCl7IGNhbGxiYWNrKCkgfVxuICAgICAgfSlcbiAgICB9LCB0ZW1wbGF0ZURvbSwgdGVtcGxhdGVEb20pXG4gIH1cblxuICBwdXNoTGlua1BhdGNoKGUsIGhyZWYsIHRhcmdldEVsLCBjYWxsYmFjayl7XG4gICAgbGV0IGxpbmtSZWYgPSB0aGlzLmxpdmVTb2NrZXQuc2V0UGVuZGluZ0xpbmsoaHJlZilcbiAgICAvLyBvbmx5IGFkZCBsb2FkaW5nIHN0YXRlcyBpZiBldmVudCBpcyB0cnVzdGVkIChpdCB3YXMgdHJpZ2dlcmVkIGJ5IHVzZXIsIHN1Y2ggYXMgY2xpY2spIGFuZFxuICAgIC8vIGl0J3Mgbm90IGEgZm9yd2FyZC9iYWNrIG5hdmlnYXRpb24gZnJvbSBwb3BzdGF0ZVxuICAgIGxldCBsb2FkaW5nID0gZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCJcbiAgICBsZXQgcmVmR2VuID0gdGFyZ2V0RWwgPyAoKSA9PiB0aGlzLnB1dFJlZihbe2VsOiB0YXJnZXRFbCwgbG9hZGluZzogbG9hZGluZywgbG9jazogdHJ1ZX1dLCBudWxsLCBcImNsaWNrXCIpIDogbnVsbFxuICAgIGxldCBmYWxsYmFjayA9ICgpID0+IHRoaXMubGl2ZVNvY2tldC5yZWRpcmVjdCh3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgICBsZXQgdXJsID0gaHJlZi5zdGFydHNXaXRoKFwiL1wiKSA/IGAke2xvY2F0aW9uLnByb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0fSR7aHJlZn1gIDogaHJlZlxuXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbiwgXCJsaXZlX3BhdGNoXCIsIHt1cmx9KS50aGVuKFxuICAgICAgKHtyZXNwfSkgPT4ge1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgaWYocmVzcC5saW5rX3JlZGlyZWN0KXtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjaywgbGlua1JlZilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKXtcbiAgICAgICAgICAgICAgdGhpcy5ocmVmID0gaHJlZlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKClcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgICh7ZXJyb3I6IF9lcnJvciwgdGltZW91dDogX3RpbWVvdXR9KSA9PiBmYWxsYmFjaygpXG4gICAgKVxuICB9XG5cbiAgZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpe1xuICAgIGlmKHRoaXMuam9pbkNvdW50ID09PSAwKXsgcmV0dXJuIHt9IH1cblxuICAgIGxldCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIilcblxuICAgIHJldHVybiBET00uYWxsKHRoaXMuZWwsIGBmb3JtWyR7cGh4Q2hhbmdlfV1gKVxuICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uaWQpXG4gICAgICAuZmlsdGVyKGZvcm0gPT4gZm9ybS5lbGVtZW50cy5sZW5ndGggPiAwKVxuICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIpXG4gICAgICAubWFwKGZvcm0gPT4gZm9ybS5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgICAucmVkdWNlKChhY2MsIGZvcm0pID0+IHtcbiAgICAgICAgYWNjW2Zvcm0uaWRdID0gZm9ybVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9LCB7fSlcbiAgfVxuXG4gIG1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyl7XG4gICAgbGV0IHdpbGxEZXN0cm95Q0lEcyA9IGRlc3Ryb3llZENJRHMuZmlsdGVyKGNpZCA9PiB7XG4gICAgICByZXR1cm4gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBjaWQpLmxlbmd0aCA9PT0gMFxuICAgIH0pXG5cbiAgICBpZih3aWxsRGVzdHJveUNJRHMubGVuZ3RoID4gMCl7XG4gICAgICAvLyB3ZSBtdXN0IHJlc2V0IHRoZSByZW5kZXIgY2hhbmdlIHRyYWNraW5nIGZvciBjaWRzIHRoYXRcbiAgICAgIC8vIGNvdWxkIGJlIGFkZGVkIGJhY2sgZnJvbSB0aGUgc2VydmVyIHNvIHdlIGRvbid0IHNraXAgdGhlbVxuICAgICAgd2lsbERlc3Ryb3lDSURzLmZvckVhY2goY2lkID0+IHRoaXMucmVuZGVyZWQucmVzZXRSZW5kZXIoY2lkKSlcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwge2NpZHM6IHdpbGxEZXN0cm95Q0lEc30pLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyB3ZSBtdXN0IHdhaXQgZm9yIHBlbmRpbmcgdHJhbnNpdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlIGRldGVybWluaW5nXG4gICAgICAgIC8vIGlmIHRoZSBjaWRzIHdlcmUgYWRkZWQgYmFjayB0byB0aGUgRE9NIGluIHRoZSBtZWFudGltZSAoIzMxMzkpXG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAvLyBTZWUgaWYgYW55IG9mIHRoZSBjaWRzIHdlIHdhbnRlZCB0byBkZXN0cm95IHdlcmUgYWRkZWQgYmFjayxcbiAgICAgICAgICAvLyBpZiB0aGV5IHdlcmUgYWRkZWQgYmFjaywgd2UgZG9uJ3QgYWN0dWFsbHkgZGVzdHJveSB0aGVtLlxuICAgICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKGNpZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBjaWQpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZihjb21wbGV0ZWx5RGVzdHJveUNJRHMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkobnVsbCwgXCJjaWRzX2Rlc3Ryb3llZFwiLCB7Y2lkczogY29tcGxldGVseURlc3Ryb3lDSURzfSkudGhlbigoe3Jlc3B9KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyZWQucHJ1bmVDSURzKHJlc3AuY2lkcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBvd25zRWxlbWVudChlbCl7XG4gICAgbGV0IHBhcmVudFZpZXdFbCA9IGVsLmNsb3Nlc3QoUEhYX1ZJRVdfU0VMRUNUT1IpXG4gICAgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKSA9PT0gdGhpcy5pZCB8fFxuICAgICAgKHBhcmVudFZpZXdFbCAmJiBwYXJlbnRWaWV3RWwuaWQgPT09IHRoaXMuaWQpIHx8XG4gICAgICAoIXBhcmVudFZpZXdFbCAmJiB0aGlzLmlzRGVhZClcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzID0ge30pe1xuICAgIERPTS5wdXRQcml2YXRlKGZvcm0sIFBIWF9IQVNfU1VCTUlUVEVELCB0cnVlKVxuICAgIGNvbnN0IGlucHV0cyA9IEFycmF5LmZyb20oZm9ybS5lbGVtZW50cylcbiAgICBpbnB1dHMuZm9yRWFjaChpbnB1dCA9PiBET00ucHV0UHJpdmF0ZShpbnB1dCwgUEhYX0hBU19TVUJNSVRURUQsIHRydWUpKVxuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKVxuICAgIHRoaXMucHVzaEZvcm1TdWJtaXQoZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzLCAoKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQucmVzdG9yZVByZXZpb3VzbHlBY3RpdmVGb2N1cygpXG4gICAgfSlcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCl7IHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKSB9XG59XG4iLCAiLyoqIEluaXRpYWxpemVzIHRoZSBMaXZlU29ja2V0XG4gKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmRQb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXCIvbGl2ZVwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7UGhvZW5peC5Tb2NrZXR9IHNvY2tldCAtIHRoZSByZXF1aXJlZCBQaG9lbml4IFNvY2tldCBjbGFzcyBpbXBvcnRlZCBmcm9tIFwicGhvZW5peFwiLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAqICAgICBpbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG4gKiAgICAgbGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwgey4uLn0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uIE91dHNpZGUgb2Yga2V5cyBsaXN0ZWQgYmVsb3csIGFsbFxuICogY29uZmlndXJhdGlvbiBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFBob2VuaXggU29ja2V0IGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLmRlZmF1bHRzXSAtIFRoZSBvcHRpb25hbCBkZWZhdWx0cyB0byB1c2UgZm9yIHZhcmlvdXMgYmluZGluZ3MsXG4gKiBzdWNoIGFzIGBwaHgtZGVib3VuY2VgLiBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIGtleXM6XG4gKlxuICogICAtIGRlYm91bmNlIC0gdGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDBcbiAqICAgLSB0aHJvdHRsZSAtIHRoZSBtaWxsaXNlY29uZCBwaHgtdGhyb3R0bGUgdGltZS4gRGVmYXVsdHMgMzAwXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMucGFyYW1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAqIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBMaXZlVmlldy4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluZGluZ1ByZWZpeF0gLSBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gKiBEZWZhdWx0cyB0byBcInBoeC1cIi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5ob29rc10gLSBUaGUgb3B0aW9uYWwgb2JqZWN0IGZvciByZWZlcmVuY2luZyBMaXZlVmlldyBob29rIGNhbGxiYWNrcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy51cGxvYWRlcnNdIC0gVGhlIG9wdGlvbmFsIG9iamVjdCBmb3IgcmVmZXJlbmNpbmcgTGl2ZVZpZXcgdXBsb2FkZXIgY2FsbGJhY2tzLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5sb2FkZXJUaW1lb3V0XSAtIFRoZSBvcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYXBwbHlcbiAqIGxvYWRpbmcgc3RhdGVzLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5tYXhSZWxvYWRzXSAtIFRoZSBtYXhpbXVtIHJlbG9hZHMgYmVmb3JlIGVudGVyaW5nIGZhaWxzYWZlIG1vZGUuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLnJlbG9hZEppdHRlck1pbl0gLSBUaGUgbWluaW11bSB0aW1lIGJldHdlZW4gbm9ybWFsIHJlbG9hZCBhdHRlbXB0cy5cbiAqIEBwYXJhbSB7aW50ZWdlcn0gW29wdHMucmVsb2FkSml0dGVyTWF4XSAtIFRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiBub3JtYWwgcmVsb2FkIGF0dGVtcHRzLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5mYWlsc2FmZUppdHRlcl0gLSBUaGUgdGltZSBiZXR3ZWVuIHJlbG9hZCBhdHRlbXB0cyBpbiBmYWlsc2FmZSBtb2RlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMudmlld0xvZ2dlcl0gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdG8gbG9nIGRlYnVnIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLm1ldGFkYXRhXSAtIFRoZSBvcHRpb25hbCBvYmplY3QgbWFwcGluZyBldmVudCBuYW1lcyB0byBmdW5jdGlvbnMgZm9yXG4gKiBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgbWV0YWRhdGE6IHtcbiAqICAgICAgIGNsaWNrOiAoZSwgZWwpID0+IHtcbiAqICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gKiAgICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICogICAgICAgICAgIGRldGFpbDogZS5kZXRhaWwgfHwgMSxcbiAqICAgICAgICAgfVxuICogICAgICAgfSxcbiAqICAgICAgIGtleWRvd246IChlLCBlbCkgPT4ge1xuICogICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgIGtleTogZS5rZXksXG4gKiAgICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAqICAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleVxuICogICAgICAgICB9XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFVzZWZ1bCB3aGVuIExpdmVWaWV3IHdvbid0IGhhdmUgYWNjZXNzIHRvIGBzZXNzaW9uU3RvcmFnZWAuICBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICogaGFwcGVuIGlmIGEgc2l0ZSBsb2FkcyBhIGNyb3NzLWRvbWFpbiBMaXZlVmlldyBpbiBhbiBpZnJhbWUuICBFeGFtcGxlIHVzYWdlOlxuICpcbiAqICAgICBjbGFzcyBJbk1lbW9yeVN0b3JhZ2Uge1xuICogICAgICAgY29uc3RydWN0b3IoKSB7IHRoaXMuc3RvcmFnZSA9IHt9IH1cbiAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIHx8IG51bGwgfVxuICogICAgICAgcmVtb3ZlSXRlbShrZXlOYW1lKSB7IGRlbGV0ZSB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfVxuICogICAgICAgc2V0SXRlbShrZXlOYW1lLCBrZXlWYWx1ZSkgeyB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gPSBrZXlWYWx1ZSB9XG4gKiAgICAgfVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5sb2NhbFN0b3JhZ2VdIC0gQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICogVXNlZnVsIGZvciB3aGVuIExpdmVWaWV3IHdvbid0IGhhdmUgYWNjZXNzIHRvIGBsb2NhbFN0b3JhZ2VgLlxuICogU2VlIGBvcHRzLnNlc3Npb25TdG9yYWdlYCBmb3IgZXhhbXBsZXMuXG4qL1xuXG5pbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIE1BWF9SRUxPQURTLFxuICBQSFhfREVCT1VOQ0UsXG4gIFBIWF9EUk9QX1RBUkdFVCxcbiAgUEhYX0hBU19GT0NVU0VELFxuICBQSFhfS0VZLFxuICBQSFhfTElOS19TVEFURSxcbiAgUEhYX0xJVkVfTElOSyxcbiAgUEhYX0xWX0RFQlVHLFxuICBQSFhfTFZfTEFURU5DWV9TSU0sXG4gIFBIWF9MVl9QUk9GSUxFLFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfVEhST1RUTEUsXG4gIFBIWF9UUkFDS19VUExPQURTLFxuICBQSFhfU0VTU0lPTixcbiAgUkVMT0FEX0pJVFRFUl9NSU4sXG4gIFJFTE9BRF9KSVRURVJfTUFYLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFTE9BRF9TVEFUVVNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2xvbmUsXG4gIGNsb3Nlc3RQaHhCaW5kaW5nLFxuICBjbG9zdXJlLFxuICBkZWJ1ZyxcbiAgbWF5YmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyXCJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiXG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIlxuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiXG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIlxuXG5leHBvcnQgbGV0IGlzVXNlZElucHV0ID0gKGVsKSA9PiBET00uaXNVc2VkSW5wdXQoZWwpXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpdmVTb2NrZXQge1xuICBjb25zdHJ1Y3Rvcih1cmwsIHBoeFNvY2tldCwgb3B0cyA9IHt9KXtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2VcbiAgICBpZighcGh4U29ja2V0IHx8IHBoeFNvY2tldC5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIk9iamVjdFwiKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApXG4gICAgfVxuICAgIHRoaXMuc29ja2V0ID0gbmV3IHBoeFNvY2tldCh1cmwsIG9wdHMpXG4gICAgdGhpcy5iaW5kaW5nUHJlZml4ID0gb3B0cy5iaW5kaW5nUHJlZml4IHx8IEJJTkRJTkdfUFJFRklYXG4gICAgdGhpcy5vcHRzID0gb3B0c1xuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShvcHRzLnBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLnZpZXdMb2dnZXIgPSBvcHRzLnZpZXdMb2dnZXJcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fVxuICAgIHRoaXMuZGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKGNsb25lKERFRkFVTFRTKSwgb3B0cy5kZWZhdWx0cyB8fCB7fSlcbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnQgPSBudWxsXG4gICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIHRoaXMuc2lsZW5jZWQgPSBmYWxzZVxuICAgIHRoaXMubWFpbiA9IG51bGxcbiAgICB0aGlzLm91dGdvaW5nTWFpbkVsID0gbnVsbFxuICAgIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBudWxsXG4gICAgdGhpcy5saW5rUmVmID0gMVxuICAgIHRoaXMucm9vdHMgPSB7fVxuICAgIHRoaXMuaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IGNsb25lKHdpbmRvdy5sb2NhdGlvbilcbiAgICB0aGlzLmhvb2tzID0gb3B0cy5ob29rcyB8fCB7fVxuICAgIHRoaXMudXBsb2FkZXJzID0gb3B0cy51cGxvYWRlcnMgfHwge31cbiAgICB0aGlzLmxvYWRlclRpbWVvdXQgPSBvcHRzLmxvYWRlclRpbWVvdXQgfHwgTE9BREVSX1RJTUVPVVRcbiAgICB0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lciA9IG51bGxcbiAgICB0aGlzLm1heFJlbG9hZHMgPSBvcHRzLm1heFJlbG9hZHMgfHwgTUFYX1JFTE9BRFNcbiAgICB0aGlzLnJlbG9hZEppdHRlck1pbiA9IG9wdHMucmVsb2FkSml0dGVyTWluIHx8IFJFTE9BRF9KSVRURVJfTUlOXG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNYXggPSBvcHRzLnJlbG9hZEppdHRlck1heCB8fCBSRUxPQURfSklUVEVSX01BWFxuICAgIHRoaXMuZmFpbHNhZmVKaXR0ZXIgPSBvcHRzLmZhaWxzYWZlSml0dGVyIHx8IEZBSUxTQUZFX0pJVFRFUlxuICAgIHRoaXMubG9jYWxTdG9yYWdlID0gb3B0cy5sb2NhbFN0b3JhZ2UgfHwgd2luZG93LmxvY2FsU3RvcmFnZVxuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2UgPSBvcHRzLnNlc3Npb25TdG9yYWdlIHx8IHdpbmRvdy5zZXNzaW9uU3RvcmFnZVxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlXG4gICAgdGhpcy5ib3VuZEV2ZW50TmFtZXMgPSBuZXcgU2V0KClcbiAgICB0aGlzLnNlcnZlckNsb3NlUmVmID0gbnVsbFxuICAgIHRoaXMuZG9tQ2FsbGJhY2tzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBqc1F1ZXJ5U2VsZWN0b3JBbGw6IG51bGwsXG4gICAgICBvblBhdGNoU3RhcnQ6IGNsb3N1cmUoKSxcbiAgICAgIG9uUGF0Y2hFbmQ6IGNsb3N1cmUoKSxcbiAgICAgIG9uTm9kZUFkZGVkOiBjbG9zdXJlKCksXG4gICAgICBvbkJlZm9yZUVsVXBkYXRlZDogY2xvc3VyZSgpfSxcbiAgICBvcHRzLmRvbSB8fCB7fSlcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgX2UgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWVcbiAgICB9KVxuICAgIHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICBpZih0aGlzLmlzVW5sb2FkZWQoKSl7XG4gICAgICAgIC8vIHJlbG9hZCBwYWdlIGlmIGJlaW5nIHJlc3RvcmVkIGZyb20gYmFjay9mb3J3YXJkIGNhY2hlIGFuZCBicm93c2VyIGRvZXMgbm90IGVtaXQgXCJwYWdlc2hvd1wiXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBwdWJsaWNcblxuICB2ZXJzaW9uKCl7IHJldHVybiBMVl9WU04gfVxuXG4gIGlzUHJvZmlsZUVuYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfUFJPRklMRSkgPT09IFwidHJ1ZVwiIH1cblxuICBpc0RlYnVnRW5hYmxlZCgpeyByZXR1cm4gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ERUJVRykgPT09IFwidHJ1ZVwiIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCIgfVxuXG4gIGVuYWJsZURlYnVnKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShQSFhfTFZfREVCVUcsIFwidHJ1ZVwiKSB9XG5cbiAgZW5hYmxlUHJvZmlsaW5nKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShQSFhfTFZfUFJPRklMRSwgXCJ0cnVlXCIpIH1cblxuICBkaXNhYmxlRGVidWcoKXsgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKSB9XG5cbiAgZGlzYWJsZVByb2ZpbGluZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUEhYX0xWX1BST0ZJTEUpIH1cblxuICBlbmFibGVMYXRlbmN5U2ltKHVwcGVyQm91bmRNcyl7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpXG4gICAgY29uc29sZS5sb2coXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIpXG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSwgdXBwZXJCb3VuZE1zKVxuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKXsgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSkgfVxuXG4gIGdldExhdGVuY3lTaW0oKXtcbiAgICBsZXQgc3RyID0gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSlcbiAgICByZXR1cm4gc3RyID8gcGFyc2VJbnQoc3RyKSA6IG51bGxcbiAgfVxuXG4gIGdldFNvY2tldCgpeyByZXR1cm4gdGhpcy5zb2NrZXQgfVxuXG4gIGNvbm5lY3QoKXtcbiAgICAvLyBlbmFibGUgZGVidWcgYnkgZGVmYXVsdCBpZiBvbiBsb2NhbGhvc3QgYW5kIG5vdCBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgaWYod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKXsgdGhpcy5lbmFibGVEZWJ1ZygpIH1cbiAgICBsZXQgZG9Db25uZWN0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZXNldFJlbG9hZFN0YXR1cygpXG4gICAgICBpZih0aGlzLmpvaW5Sb290Vmlld3MoKSl7XG4gICAgICAgIHRoaXMuYmluZFRvcExldmVsRXZlbnRzKClcbiAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpXG4gICAgICB9IGVsc2UgaWYodGhpcy5tYWluKXtcbiAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cyh7ZGVhZDogdHJ1ZX0pXG4gICAgICB9XG4gICAgICB0aGlzLmpvaW5EZWFkVmlldygpXG4gICAgfVxuICAgIGlmKFtcImNvbXBsZXRlXCIsIFwibG9hZGVkXCIsIFwiaW50ZXJhY3RpdmVcIl0uaW5kZXhPZihkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSAwKXtcbiAgICAgIGRvQ29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IGRvQ29ubmVjdCgpKVxuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2spe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcilcbiAgICAvLyByZW1vdmUgdGhlIHNvY2tldCBjbG9zZSBsaXN0ZW5lciB0byBhdm9pZCB0cnlpbmcgdG8gaGFuZGxlXG4gICAgLy8gYSBzZXJ2ZXIgY2xvc2UgZXZlbnQgd2hlbiBpdCBpcyBhY3R1YWxseSBjYXVzZWQgYnkgdXMgZGlzY29ubmVjdGluZ1xuICAgIGlmKHRoaXMuc2VydmVyQ2xvc2VSZWYpe1xuICAgICAgdGhpcy5zb2NrZXQub2ZmKHRoaXMuc2VydmVyQ2xvc2VSZWYpXG4gICAgICB0aGlzLnNlcnZlckNsb3NlUmVmID0gbnVsbFxuICAgIH1cbiAgICB0aGlzLnNvY2tldC5kaXNjb25uZWN0KGNhbGxiYWNrKVxuICB9XG5cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcilcbiAgICB0aGlzLnNvY2tldC5yZXBsYWNlVHJhbnNwb3J0KHRyYW5zcG9ydClcbiAgICB0aGlzLmNvbm5lY3QoKVxuICB9XG5cbiAgZXhlY0pTKGVsLCBlbmNvZGVkSlMsIGV2ZW50VHlwZSA9IG51bGwpe1xuICAgIGxldCBlID0gbmV3IEN1c3RvbUV2ZW50KFwicGh4OmV4ZWNcIiwge2RldGFpbDoge3NvdXJjZUVsZW1lbnQ6IGVsfX0pXG4gICAgdGhpcy5vd25lcihlbCwgdmlldyA9PiBKUy5leGVjKGUsIGV2ZW50VHlwZSwgZW5jb2RlZEpTLCB2aWV3LCBlbCkpXG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgZXhlY0pTSG9va1B1c2goZWwsIHBoeEV2ZW50LCBkYXRhLCBjYWxsYmFjayl7XG4gICAgdGhpcy53aXRoaW5Pd25lcnMoZWwsIHZpZXcgPT4ge1xuICAgICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiLCB7ZGV0YWlsOiB7c291cmNlRWxlbWVudDogZWx9fSlcbiAgICAgIEpTLmV4ZWMoZSwgXCJob29rXCIsIHBoeEV2ZW50LCB2aWV3LCBlbCwgW1wicHVzaFwiLCB7ZGF0YSwgY2FsbGJhY2t9XSlcbiAgICB9KVxuICB9XG5cbiAgdW5sb2FkKCl7XG4gICAgaWYodGhpcy51bmxvYWRlZCl7IHJldHVybiB9XG4gICAgaWYodGhpcy5tYWluICYmIHRoaXMuaXNDb25uZWN0ZWQoKSl7IHRoaXMubG9nKHRoaXMubWFpbiwgXCJzb2NrZXRcIiwgKCkgPT4gW1wiZGlzY29ubmVjdCBmb3IgcGFnZSBuYXZcIl0pIH1cbiAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZVxuICAgIHRoaXMuZGVzdHJveUFsbFZpZXdzKClcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICB9XG5cbiAgdHJpZ2dlckRPTShraW5kLCBhcmdzKXsgdGhpcy5kb21DYWxsYmFja3Nba2luZF0oLi4uYXJncykgfVxuXG4gIHRpbWUobmFtZSwgZnVuYyl7XG4gICAgaWYoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpIHx8ICFjb25zb2xlLnRpbWUpeyByZXR1cm4gZnVuYygpIH1cbiAgICBjb25zb2xlLnRpbWUobmFtZSlcbiAgICBsZXQgcmVzdWx0ID0gZnVuYygpXG4gICAgY29uc29sZS50aW1lRW5kKG5hbWUpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgbG9nKHZpZXcsIGtpbmQsIG1zZ0NhbGxiYWNrKXtcbiAgICBpZih0aGlzLnZpZXdMb2dnZXIpe1xuICAgICAgbGV0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpXG4gICAgICB0aGlzLnZpZXdMb2dnZXIodmlldywga2luZCwgbXNnLCBvYmopXG4gICAgfSBlbHNlIGlmKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSl7XG4gICAgICBsZXQgW21zZywgb2JqXSA9IG1zZ0NhbGxiYWNrKClcbiAgICAgIGRlYnVnKHZpZXcsIGtpbmQsIG1zZywgb2JqKVxuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RET01VcGRhdGUoY2FsbGJhY2spe1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWZ0ZXIoY2FsbGJhY2spXG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uKCl7fSl7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSlcbiAgfVxuXG4gIG9uQ2hhbm5lbChjaGFubmVsLCBldmVudCwgY2Ipe1xuICAgIGNoYW5uZWwub24oZXZlbnQsIGRhdGEgPT4ge1xuICAgICAgbGV0IGxhdGVuY3kgPSB0aGlzLmdldExhdGVuY3lTaW0oKVxuICAgICAgaWYoIWxhdGVuY3kpe1xuICAgICAgICBjYihkYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBjYihkYXRhKSwgbGF0ZW5jeSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcilcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgIGxldCBtaW5NcyA9IHRoaXMucmVsb2FkSml0dGVyTWluXG4gICAgbGV0IG1heE1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNYXhcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXNcbiAgICBsZXQgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKHRoaXMubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMsIDAsIGNvdW50ID0+IGNvdW50ICsgMSlcbiAgICBpZih0cmllcyA+PSB0aGlzLm1heFJlbG9hZHMpe1xuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXJcbiAgICB9XG4gICAgdGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIGlmIHZpZXcgaGFzIHJlY292ZXJlZCwgc3VjaCBhcyB0cmFuc3BvcnQgcmVwbGFjZWQsIHRoZW4gY2FuY2VsXG4gICAgICBpZih2aWV3LmlzRGVzdHJveWVkKCkgfHwgdmlldy5pc0Nvbm5lY3RlZCgpKXsgcmV0dXJuIH1cbiAgICAgIHZpZXcuZGVzdHJveSgpXG4gICAgICBsb2cgPyBsb2coKSA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbYGVuY291bnRlcmVkICR7dHJpZXN9IGNvbnNlY3V0aXZlIHJlbG9hZHNgXSlcbiAgICAgIGlmKHRyaWVzID49IHRoaXMubWF4UmVsb2Fkcyl7XG4gICAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYF0pXG4gICAgICB9XG4gICAgICBpZih0aGlzLmhhc1BlbmRpbmdMaW5rKCkpe1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLnBlbmRpbmdMaW5rXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgIH1cbiAgICB9LCBhZnRlck1zKVxuICB9XG5cbiAgZ2V0SG9va0NhbGxiYWNrcyhuYW1lKXtcbiAgICByZXR1cm4gbmFtZSAmJiBuYW1lLnN0YXJ0c1dpdGgoXCJQaG9lbml4LlwiKSA/IEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXSA6IHRoaXMuaG9va3NbbmFtZV1cbiAgfVxuXG4gIGlzVW5sb2FkZWQoKXsgcmV0dXJuIHRoaXMudW5sb2FkZWQgfVxuXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpIH1cblxuICBnZXRCaW5kaW5nUHJlZml4KCl7IHJldHVybiB0aGlzLmJpbmRpbmdQcmVmaXggfVxuXG4gIGJpbmRpbmcoa2luZCl7IHJldHVybiBgJHt0aGlzLmdldEJpbmRpbmdQcmVmaXgoKX0ke2tpbmR9YCB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKXsgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcykgfVxuXG4gIGpvaW5EZWFkVmlldygpe1xuICAgIGxldCBib2R5ID0gZG9jdW1lbnQuYm9keVxuICAgIGlmKGJvZHkgJiYgIXRoaXMuaXNQaHhWaWV3KGJvZHkpICYmICF0aGlzLmlzUGh4Vmlldyhkb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZCkpe1xuICAgICAgbGV0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KGJvZHkpXG4gICAgICB2aWV3LnNldEhyZWYodGhpcy5nZXRIcmVmKCkpXG4gICAgICB2aWV3LmpvaW5EZWFkKClcbiAgICAgIGlmKCF0aGlzLm1haW4peyB0aGlzLm1haW4gPSB2aWV3IH1cbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdmlldy5leGVjTmV3TW91bnRlZCgpKVxuICAgIH1cbiAgfVxuXG4gIGpvaW5Sb290Vmlld3MoKXtcbiAgICBsZXQgcm9vdHNGb3VuZCA9IGZhbHNlXG4gICAgRE9NLmFsbChkb2N1bWVudCwgYCR7UEhYX1ZJRVdfU0VMRUNUT1J9Om5vdChbJHtQSFhfUEFSRU5UX0lEfV0pYCwgcm9vdEVsID0+IHtcbiAgICAgIGlmKCF0aGlzLmdldFJvb3RCeUlkKHJvb3RFbC5pZCkpe1xuICAgICAgICBsZXQgdmlldyA9IHRoaXMubmV3Um9vdFZpZXcocm9vdEVsKVxuICAgICAgICB2aWV3LnNldEhyZWYodGhpcy5nZXRIcmVmKCkpXG4gICAgICAgIHZpZXcuam9pbigpXG4gICAgICAgIGlmKHJvb3RFbC5oYXNBdHRyaWJ1dGUoUEhYX01BSU4pKXsgdGhpcy5tYWluID0gdmlldyB9XG4gICAgICB9XG4gICAgICByb290c0ZvdW5kID0gdHJ1ZVxuICAgIH0pXG4gICAgcmV0dXJuIHJvb3RzRm91bmRcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pe1xuICAgIGlmKHJlbG9hZFRva2VuKXsgQnJvd3Nlci5zZXRDb29raWUoUEhYX1JFTE9BRF9TVEFUVVMsIHJlbG9hZFRva2VuLCA2MCkgfVxuICAgIHRoaXMudW5sb2FkKClcbiAgICBCcm93c2VyLnJlZGlyZWN0KHRvLCBmbGFzaClcbiAgfVxuXG4gIHJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCBjYWxsYmFjayA9IG51bGwsIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpKXtcbiAgICBsZXQgbGl2ZVJlZmVyZXIgPSB0aGlzLmN1cnJlbnRMb2NhdGlvbi5ocmVmXG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsXG4gICAgbGV0IHJlbW92ZUVscyA9IERPTS5hbGwodGhpcy5vdXRnb2luZ01haW5FbCwgYFske3RoaXMuYmluZGluZyhcInJlbW92ZVwiKX1dYClcbiAgICBsZXQgbmV3TWFpbkVsID0gRE9NLmNsb25lTm9kZSh0aGlzLm91dGdvaW5nTWFpbkVsLCBcIlwiKVxuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dClcbiAgICB0aGlzLm1haW4uZGVzdHJveSgpXG5cbiAgICB0aGlzLm1haW4gPSB0aGlzLm5ld1Jvb3RWaWV3KG5ld01haW5FbCwgZmxhc2gsIGxpdmVSZWZlcmVyKVxuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKVxuICAgIHRoaXMudHJhbnNpdGlvblJlbW92ZXMocmVtb3ZlRWxzLCB0cnVlKVxuICAgIHRoaXMubWFpbi5qb2luKChqb2luQ291bnQsIG9uRG9uZSkgPT4ge1xuICAgICAgaWYoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpe1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlbW92ZSBwaHgtcmVtb3ZlIGVscyByaWdodCBiZWZvcmUgd2UgcmVwbGFjZSB0aGUgbWFpbiBlbGVtZW50XG4gICAgICAgICAgcmVtb3ZlRWxzLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpXG4gICAgICAgICAgRE9NLmZpbmRQaHhTdGlja3koZG9jdW1lbnQpLmZvckVhY2goZWwgPT4gbmV3TWFpbkVsLmFwcGVuZENoaWxkKGVsKSlcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsLnJlcGxhY2VXaXRoKG5ld01haW5FbClcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsID0gbnVsbFxuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpXG4gICAgICAgICAgb25Eb25lKClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMsIHNraXBTdGlja3ksIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKVxuICAgIGlmKHNraXBTdGlja3kpe1xuICAgICAgY29uc3Qgc3RpY2tpZXMgPSBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkgfHwgW11cbiAgICAgIGVsZW1lbnRzID0gZWxlbWVudHMuZmlsdGVyKGVsID0+ICFET00uaXNDaGlsZE9mQW55KGVsLCBzdGlja2llcykpXG4gICAgfVxuICAgIGxldCBzaWxlbmNlRXZlbnRzID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgIH1cbiAgICBlbGVtZW50cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIC8vIHByZXZlbnQgYWxsIGxpc3RlbmVycyB3ZSBjYXJlIGFib3V0IGZyb20gYnViYmxpbmcgdG8gd2luZG93XG4gICAgICAvLyBzaW5jZSB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGVsZW1lbnRcbiAgICAgIGZvcihsZXQgZXZlbnQgb2YgdGhpcy5ib3VuZEV2ZW50TmFtZXMpe1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzaWxlbmNlRXZlbnRzLCB0cnVlKVxuICAgICAgfVxuICAgICAgdGhpcy5leGVjSlMoZWwsIGVsLmdldEF0dHJpYnV0ZShyZW1vdmVBdHRyKSwgXCJyZW1vdmVcIilcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgc2lsZW5jZWQgbGlzdGVuZXJzIHdoZW4gdHJhbnNpdGlvbnMgYXJlIGRvbmUgaW5jYXNlIHRoZSBlbGVtZW50IGlzIHJlLXVzZWRcbiAgICAvLyBhbmQgY2FsbCBjYWxsZXIncyBjYWxsYmFjayBhcyBzb29uIGFzIHdlIGFyZSBkb25lIHdpdGggdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGZvcihsZXQgZXZlbnQgb2YgdGhpcy5ib3VuZEV2ZW50TmFtZXMpe1xuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHNpbGVuY2VFdmVudHMsIHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfSlcbiAgfVxuXG4gIGlzUGh4VmlldyhlbCl7IHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCB9XG5cbiAgbmV3Um9vdFZpZXcoZWwsIGZsYXNoLCBsaXZlUmVmZXJlcil7XG4gICAgbGV0IHZpZXcgPSBuZXcgVmlldyhlbCwgdGhpcywgbnVsbCwgZmxhc2gsIGxpdmVSZWZlcmVyKVxuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3XG4gICAgcmV0dXJuIHZpZXdcbiAgfVxuXG4gIG93bmVyKGNoaWxkRWwsIGNhbGxiYWNrKXtcbiAgICBsZXQgdmlldyA9IG1heWJlKGNoaWxkRWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUiksIGVsID0+IHRoaXMuZ2V0Vmlld0J5RWwoZWwpKSB8fCB0aGlzLm1haW5cbiAgICByZXR1cm4gdmlldyAmJiBjYWxsYmFjayA/IGNhbGxiYWNrKHZpZXcpIDogdmlld1xuICB9XG5cbiAgd2l0aGluT3duZXJzKGNoaWxkRWwsIGNhbGxiYWNrKXtcbiAgICB0aGlzLm93bmVyKGNoaWxkRWwsIHZpZXcgPT4gY2FsbGJhY2sodmlldywgY2hpbGRFbCkpXG4gIH1cblxuICBnZXRWaWV3QnlFbChlbCl7XG4gICAgbGV0IHJvb3RJZCA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRClcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCByb290ID0+IHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpKVxuICB9XG5cbiAgZ2V0Um9vdEJ5SWQoaWQpeyByZXR1cm4gdGhpcy5yb290c1tpZF0gfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpe1xuICAgIGZvcihsZXQgaWQgaW4gdGhpcy5yb290cyl7XG4gICAgICB0aGlzLnJvb3RzW2lkXS5kZXN0cm95KClcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXVxuICAgIH1cbiAgICB0aGlzLm1haW4gPSBudWxsXG4gIH1cblxuICBkZXN0cm95Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290ID0gdGhpcy5nZXRSb290QnlJZChlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpKVxuICAgIGlmKHJvb3QgJiYgcm9vdC5pZCA9PT0gZWwuaWQpe1xuICAgICAgcm9vdC5kZXN0cm95KClcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdXG4gICAgfSBlbHNlIGlmKHJvb3Qpe1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZClcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmVFbGVtZW50KCl7XG4gICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpe1xuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAmJiB2aWV3Lm93bnNFbGVtZW50KHRoaXMucHJldkFjdGl2ZSkpe1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKXtcbiAgICBpZih0aGlzLnByZXZBY3RpdmUgJiYgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5KXtcbiAgICAgIHRoaXMucHJldkFjdGl2ZS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKXtcbiAgICB0aGlzLnByZXZBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZUVsZW1lbnQoKVxuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAhPT0gZG9jdW1lbnQuYm9keSl7IHRoaXMucHJldkFjdGl2ZS5ibHVyKCkgfVxuICB9XG5cbiAgYmluZFRvcExldmVsRXZlbnRzKHtkZWFkfSA9IHt9KXtcbiAgICBpZih0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHMpeyByZXR1cm4gfVxuXG4gICAgdGhpcy5ib3VuZFRvcExldmVsRXZlbnRzID0gdHJ1ZVxuICAgIC8vIGVudGVyIGZhaWxzYWZlIHJlbG9hZCBpZiBzZXJ2ZXIgaGFzIGdvbmUgYXdheSBpbnRlbnRpb25hbGx5LCBzdWNoIGFzIFwiZGlzY29ubmVjdFwiIGJyb2FkY2FzdFxuICAgIHRoaXMuc2VydmVyQ2xvc2VSZWYgPSB0aGlzLnNvY2tldC5vbkNsb3NlKGV2ZW50ID0+IHtcbiAgICAgIC8vIGZhaWxzYWZlIHJlbG9hZCBpZiBub3JtYWwgY2xvc3VyZSBhbmQgd2Ugc3RpbGwgaGF2ZSBhIG1haW4gTFZcbiAgICAgIGlmKGV2ZW50ICYmIGV2ZW50LmNvZGUgPT09IDEwMDAgJiYgdGhpcy5tYWluKXsgcmV0dXJuIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pIH1cbiAgICB9KVxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpeyB9KSAvLyBlbnN1cmUgYWxsIGNsaWNrIGV2ZW50cyBidWJibGUgZm9yIG1vYmlsZSBTYWZhcmlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VzaG93XCIsIGUgPT4ge1xuICAgICAgaWYoZS5wZXJzaXN0ZWQpeyAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICB0aGlzLmdldFNvY2tldCgpLmRpc2Nvbm5lY3QoKVxuICAgICAgICB0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCJ9KVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgIH1cbiAgICB9LCB0cnVlKVxuICAgIGlmKCFkZWFkKXsgdGhpcy5iaW5kTmF2KCkgfVxuICAgIHRoaXMuYmluZENsaWNrcygpXG4gICAgaWYoIWRlYWQpeyB0aGlzLmJpbmRGb3JtcygpIH1cbiAgICB0aGlzLmJpbmQoe2tleXVwOiBcImtleXVwXCIsIGtleWRvd246IFwia2V5ZG93blwifSwgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCBwaHhFdmVudCwgcGh4VGFyZ2V0KSA9PiB7XG4gICAgICBsZXQgbWF0Y2hLZXkgPSB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9LRVkpKVxuICAgICAgbGV0IHByZXNzZWRLZXkgPSBlLmtleSAmJiBlLmtleS50b0xvd2VyQ2FzZSgpIC8vIGNocm9tZSBjbGlja2VkIGF1dG9jb21wbGV0ZXMgc2VuZCBhIGtleWRvd24gd2l0aG91dCBrZXlcbiAgICAgIGlmKG1hdGNoS2V5ICYmIG1hdGNoS2V5LnRvTG93ZXJDYXNlKCkgIT09IHByZXNzZWRLZXkpeyByZXR1cm4gfVxuXG4gICAgICBsZXQgZGF0YSA9IHtrZXk6IGUua2V5LCAuLi50aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbCl9XG4gICAgICBKUy5leGVjKGUsIHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7ZGF0YX1dKVxuICAgIH0pXG4gICAgdGhpcy5iaW5kKHtibHVyOiBcImZvY3Vzb3V0XCIsIGZvY3VzOiBcImZvY3VzaW5cIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgaWYoIXBoeFRhcmdldCl7XG4gICAgICAgIGxldCBkYXRhID0ge2tleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKX1cbiAgICAgICAgSlMuZXhlYyhlLCB0eXBlLCBwaHhFdmVudCwgdmlldywgdGFyZ2V0RWwsIFtcInB1c2hcIiwge2RhdGF9XSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuYmluZCh7Ymx1cjogXCJibHVyXCIsIGZvY3VzOiBcImZvY3VzXCJ9LCAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgIC8vIGJsdXIgYW5kIGZvY3VzIGFyZSB0cmlnZ2VyZWQgb24gZG9jdW1lbnQgYW5kIHdpbmRvdy4gRGlzY2FyZCBvbmUgdG8gYXZvaWQgZHVwc1xuICAgICAgaWYocGh4VGFyZ2V0ID09PSBcIndpbmRvd1wiKXtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbClcbiAgICAgICAgSlMuZXhlYyhlLCB0eXBlLCBwaHhFdmVudCwgdmlldywgdGFyZ2V0RWwsIFtcInB1c2hcIiwge2RhdGF9XSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMub24oXCJkcmFnb3ZlclwiLCBlID0+IGUucHJldmVudERlZmF1bHQoKSlcbiAgICB0aGlzLm9uKFwiZHJvcFwiLCBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgbGV0IGRyb3BUYXJnZXRJZCA9IG1heWJlKGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCB0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSksIHRydWVUYXJnZXQgPT4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpXG4gICAgICB9KVxuICAgICAgbGV0IGRyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZHJvcFRhcmdldElkKVxuICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci5maWxlcyB8fCBbXSlcbiAgICAgIGlmKCFkcm9wVGFyZ2V0IHx8IGRyb3BUYXJnZXQuZGlzYWJsZWQgfHwgZmlsZXMubGVuZ3RoID09PSAwIHx8ICEoZHJvcFRhcmdldC5maWxlcyBpbnN0YW5jZW9mIEZpbGVMaXN0KSl7IHJldHVybiB9XG5cbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGRyb3BUYXJnZXQsIGZpbGVzLCBlLmRhdGFUcmFuc2ZlcilcbiAgICAgIGRyb3BUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgIH0pXG4gICAgdGhpcy5vbihQSFhfVFJBQ0tfVVBMT0FEUywgZSA9PiB7XG4gICAgICBsZXQgdXBsb2FkVGFyZ2V0ID0gZS50YXJnZXRcbiAgICAgIGlmKCFET00uaXNVcGxvYWRJbnB1dCh1cGxvYWRUYXJnZXQpKXsgcmV0dXJuIH1cbiAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20oZS5kZXRhaWwuZmlsZXMgfHwgW10pLmZpbHRlcihmID0+IGYgaW5zdGFuY2VvZiBGaWxlIHx8IGYgaW5zdGFuY2VvZiBCbG9iKVxuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXModXBsb2FkVGFyZ2V0LCBmaWxlcylcbiAgICAgIHVwbG9hZFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgfSlcbiAgfVxuXG4gIGV2ZW50TWV0YShldmVudE5hbWUsIGUsIHRhcmdldEVsKXtcbiAgICBsZXQgY2FsbGJhY2sgPSB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzW2V2ZW50TmFtZV1cbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhlLCB0YXJnZXRFbCkgOiB7fVxuICB9XG5cbiAgc2V0UGVuZGluZ0xpbmsoaHJlZil7XG4gICAgdGhpcy5saW5rUmVmKytcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gaHJlZlxuICAgIHRoaXMucmVzZXRSZWxvYWRTdGF0dXMoKVxuICAgIHJldHVybiB0aGlzLmxpbmtSZWZcbiAgfVxuXG4gIC8vIGFueXRpbWUgd2UgYXJlIG5hdmlnYXRpbmcgb3IgY29ubmVjdGluZywgZHJvcCByZWxvYWQgY29va2llIGluIGNhc2VcbiAgLy8gd2UgaXNzdWUgdGhlIGNvb2tpZSBidXQgdGhlIG5leHQgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgZHJvcHBlZCBpdFxuICByZXNldFJlbG9hZFN0YXR1cygpeyBCcm93c2VyLmRlbGV0ZUNvb2tpZShQSFhfUkVMT0FEX1NUQVRVUykgfVxuXG4gIGNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpe1xuICAgIGlmKHRoaXMubGlua1JlZiAhPT0gbGlua1JlZil7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ocmVmID0gdGhpcy5wZW5kaW5nTGlua1xuICAgICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGxcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgZ2V0SHJlZigpeyByZXR1cm4gdGhpcy5ocmVmIH1cblxuICBoYXNQZW5kaW5nTGluaygpeyByZXR1cm4gISF0aGlzLnBlbmRpbmdMaW5rIH1cblxuICBiaW5kKGV2ZW50cywgY2FsbGJhY2spe1xuICAgIGZvcihsZXQgZXZlbnQgaW4gZXZlbnRzKXtcbiAgICAgIGxldCBicm93c2VyRXZlbnROYW1lID0gZXZlbnRzW2V2ZW50XVxuXG4gICAgICB0aGlzLm9uKGJyb3dzZXJFdmVudE5hbWUsIGUgPT4ge1xuICAgICAgICBsZXQgYmluZGluZyA9IHRoaXMuYmluZGluZyhldmVudClcbiAgICAgICAgbGV0IHdpbmRvd0JpbmRpbmcgPSB0aGlzLmJpbmRpbmcoYHdpbmRvdy0ke2V2ZW50fWApXG4gICAgICAgIGxldCB0YXJnZXRQaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoYmluZGluZylcbiAgICAgICAgaWYodGFyZ2V0UGh4RXZlbnQpe1xuICAgICAgICAgIHRoaXMuZGVib3VuY2UoZS50YXJnZXQsIGUsIGJyb3dzZXJFdmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCB2aWV3ID0+IHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZSwgZXZlbnQsIHZpZXcsIGUudGFyZ2V0LCB0YXJnZXRQaHhFdmVudCwgbnVsbClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7d2luZG93QmluZGluZ31dYCwgZWwgPT4ge1xuICAgICAgICAgICAgbGV0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHdpbmRvd0JpbmRpbmcpXG4gICAgICAgICAgICB0aGlzLmRlYm91bmNlKGVsLCBlLCBicm93c2VyRXZlbnROYW1lLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGVsLCB2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHBoeEV2ZW50LCBcIndpbmRvd1wiKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGJpbmRDbGlja3MoKXtcbiAgICB0aGlzLm9uKFwibW91c2Vkb3duXCIsIGUgPT4gdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0KVxuICAgIHRoaXMuYmluZENsaWNrKFwiY2xpY2tcIiwgXCJjbGlja1wiKVxuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUpe1xuICAgIGxldCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGUgPT4ge1xuICAgICAgbGV0IHRhcmdldCA9IG51bGxcbiAgICAgIC8vIGEgc3ludGhldGljIGNsaWNrIGV2ZW50IChkZXRhaWwgMCkgd2lsbCBub3QgaGF2ZSBjYXVzZWQgYSBtb3VzZWRvd24gZXZlbnQsXG4gICAgICAvLyB0aGVyZWZvcmUgdGhlIGNsaWNrU3RhcnRlZEF0VGFyZ2V0IGlzIHN0YWxlXG4gICAgICBpZihlLmRldGFpbCA9PT0gMCkgdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0XG4gICAgICBsZXQgY2xpY2tTdGFydGVkQXRUYXJnZXQgPSB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0IHx8IGUudGFyZ2V0XG4gICAgICAvLyB3aGVuIHNlYXJjaGluZyB0aGUgdGFyZ2V0IGZvciB0aGUgY2xpY2sgZXZlbnQsIHdlIGFsd2F5cyB3YW50IHRvXG4gICAgICAvLyB1c2UgdGhlIGFjdHVhbCBldmVudCB0YXJnZXQsIHNlZSAjMzM3MlxuICAgICAgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIGNsaWNrKVxuICAgICAgdGhpcy5kaXNwYXRjaENsaWNrQXdheShlLCBjbGlja1N0YXJ0ZWRBdFRhcmdldClcbiAgICAgIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBudWxsXG4gICAgICBsZXQgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljaylcbiAgICAgIGlmKCFwaHhFdmVudCl7XG4gICAgICAgIGlmKERPTS5pc05ld1BhZ2VDbGljayhlLCB3aW5kb3cubG9jYXRpb24pKXsgdGhpcy51bmxvYWQoKSB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZih0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpeyBlLnByZXZlbnREZWZhdWx0KCkgfVxuXG4gICAgICAvLyBub29wIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGF3YWl0aW5nIGFuIGFjayBmb3IgdGhpcyBlbCBhbHJlYWR5XG4gICAgICBpZih0YXJnZXQuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSl7IHJldHVybiB9XG5cbiAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCBcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnModGFyZ2V0LCB2aWV3ID0+IHtcbiAgICAgICAgICBKUy5leGVjKGUsIFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldCwgW1wicHVzaFwiLCB7ZGF0YTogdGhpcy5ldmVudE1ldGEoXCJjbGlja1wiLCBlLCB0YXJnZXQpfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sIGZhbHNlKVxuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpe1xuICAgIGxldCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpXG4gICAgRE9NLmFsbChkb2N1bWVudCwgYFske3BoeENsaWNrQXdheX1dYCwgZWwgPT4ge1xuICAgICAgaWYoIShlbC5pc1NhbWVOb2RlKGNsaWNrU3RhcnRlZEF0KSB8fCBlbC5jb250YWlucyhjbGlja1N0YXJ0ZWRBdCkpKXtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZWwsIHZpZXcgPT4ge1xuICAgICAgICAgIGxldCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpXG4gICAgICAgICAgaWYoSlMuaXNWaXNpYmxlKGVsKSAmJiBKUy5pc0luVmlld3BvcnQoZWwpKXtcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcInB1c2hcIiwge2RhdGE6IHRoaXMuZXZlbnRNZXRhKFwiY2xpY2tcIiwgZSwgZS50YXJnZXQpfV0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBiaW5kTmF2KCl7XG4gICAgaWYoIUJyb3dzZXIuY2FuUHVzaFN0YXRlKCkpeyByZXR1cm4gfVxuICAgIGlmKGhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24peyBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJtYW51YWxcIiB9XG4gICAgbGV0IHNjcm9sbFRpbWVyID0gbnVsbFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIF9lID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChzY3JvbGxUaW1lcilcbiAgICAgIHNjcm9sbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKHN0YXRlID0+IE9iamVjdC5hc3NpZ24oc3RhdGUsIHtzY3JvbGw6IHdpbmRvdy5zY3JvbGxZfSkpXG4gICAgICB9LCAxMDApXG4gICAgfSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGV2ZW50ID0+IHtcbiAgICAgIGlmKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSl7IHJldHVybiB9XG4gICAgICBsZXQge3R5cGUsIGlkLCByb290LCBzY3JvbGx9ID0gZXZlbnQuc3RhdGUgfHwge31cbiAgICAgIGxldCBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWZcblxuICAgICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpuYXZpZ2F0ZVwiLCB7ZGV0YWlsOiB7aHJlZiwgcGF0Y2g6IHR5cGUgPT09IFwicGF0Y2hcIiwgcG9wOiB0cnVlfX0pXG4gICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICBpZih0aGlzLm1haW4uaXNDb25uZWN0ZWQoKSAmJiAodHlwZSA9PT0gXCJwYXRjaFwiICYmIGlkID09PSB0aGlzLm1haW4uaWQpKXtcbiAgICAgICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChldmVudCwgaHJlZiwgbnVsbCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVNjcm9sbChzY3JvbGwpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIG51bGwsICgpID0+IHtcbiAgICAgICAgICAgIGlmKHJvb3QpeyB0aGlzLnJlcGxhY2VSb290SGlzdG9yeSgpIH1cbiAgICAgICAgICAgIHRoaXMubWF5YmVTY3JvbGwoc2Nyb2xsKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSwgZmFsc2UpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSylcbiAgICAgIGlmKCF0eXBlIHx8ICF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbiB8fCBET00ud2FudHNOZXdUYWIoZSkpeyByZXR1cm4gfVxuXG4gICAgICAvLyBXaGVuIHdyYXBwaW5nIGFuIFNWRyBlbGVtZW50IGluIGFuIGFuY2hvciB0YWcsIHRoZSBocmVmIGNhbiBiZSBhbiBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgbGV0IGhyZWYgPSB0YXJnZXQuaHJlZiBpbnN0YW5jZW9mIFNWR0FuaW1hdGVkU3RyaW5nID8gdGFyZ2V0LmhyZWYuYmFzZVZhbCA6IHRhcmdldC5ocmVmXG5cbiAgICAgIGxldCBsaW5rU3RhdGUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFBIWF9MSU5LX1NUQVRFKVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgIGlmKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpeyByZXR1cm4gfVxuXG4gICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICBpZih0eXBlID09PSBcInBhdGNoXCIpe1xuICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldClcbiAgICAgICAgfSBlbHNlIGlmKHR5cGUgPT09IFwicmVkaXJlY3RcIil7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5UmVkaXJlY3QoZSwgaHJlZiwgbGlua1N0YXRlLCBudWxsLCB0YXJnZXQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke1BIWF9MSVZFX0xJTkt9IHRvIGJlIFwicGF0Y2hcIiBvciBcInJlZGlyZWN0XCIsIGdvdDogJHt0eXBlfWApXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBoeENsaWNrID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjbGlja1wiKSlcbiAgICAgICAgaWYocGh4Q2xpY2spe1xuICAgICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLmV4ZWNKUyh0YXJnZXQsIHBoeENsaWNrLCBcImNsaWNrXCIpKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sIGZhbHNlKVxuICB9XG5cbiAgbWF5YmVTY3JvbGwoc2Nyb2xsKXtcbiAgICBpZih0eXBlb2Yoc2Nyb2xsKSA9PT0gXCJudW1iZXJcIil7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc2Nyb2xsKVxuICAgICAgfSkgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KXtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIGBwaHg6JHtldmVudH1gLCB7ZGV0YWlsOiBwYXlsb2FkfSlcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnRzKGV2ZW50cyl7XG4gICAgZXZlbnRzLmZvckVhY2goKFtldmVudCwgcGF5bG9hZF0pID0+IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCkpXG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spe1xuICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsIHtkZXRhaWw6IGluZm99KVxuICAgIGxldCBkb25lID0gKCkgPT4gRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCB7ZGV0YWlsOiBpbmZvfSlcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhkb25lKSA6IGRvbmVcbiAgfVxuXG4gIHB1c2hIaXN0b3J5UGF0Y2goZSwgaHJlZiwgbGlua1N0YXRlLCB0YXJnZXRFbCl7XG4gICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluLmlzTWFpbigpKXsgcmV0dXJuIEJyb3dzZXIucmVkaXJlY3QoaHJlZikgfVxuXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInBhdGNoXCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMubWFpbi5wdXNoTGlua1BhdGNoKGUsIGhyZWYsIHRhcmdldEVsLCBsaW5rUmVmID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKVxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpKXtcbiAgICBpZighdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7IHJldHVybiB9XG5cbiAgICBCcm93c2VyLnB1c2hTdGF0ZShsaW5rU3RhdGUsIHt0eXBlOiBcInBhdGNoXCIsIGlkOiB0aGlzLm1haW4uaWR9LCBocmVmKVxuICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge2RldGFpbDoge3BhdGNoOiB0cnVlLCBocmVmLCBwb3A6IGZhbHNlfX0pXG4gICAgdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIGhpc3RvcnlSZWRpcmVjdChlLCBocmVmLCBsaW5rU3RhdGUsIGZsYXNoLCB0YXJnZXRFbCl7XG4gICAgaWYodGFyZ2V0RWwgJiYgZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCIpeyB0YXJnZXRFbC5jbGFzc0xpc3QuYWRkKFwicGh4LWNsaWNrLWxvYWRpbmdcIikgfVxuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbi5pc01haW4oKSl7IHJldHVybiBCcm93c2VyLnJlZGlyZWN0KGhyZWYsIGZsYXNoKSB9XG5cbiAgICAvLyBjb252ZXJ0IHRvIGZ1bGwgaHJlZiBpZiBvbmx5IHBhdGggcHJlZml4XG4gICAgaWYoL15cXC8kfF5cXC9bXlxcL10rLiokLy50ZXN0KGhyZWYpKXtcbiAgICAgIGxldCB7cHJvdG9jb2wsIGhvc3R9ID0gd2luZG93LmxvY2F0aW9uXG4gICAgICBocmVmID0gYCR7cHJvdG9jb2x9Ly8ke2hvc3R9JHtocmVmfWBcbiAgICB9XG4gICAgbGV0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInJlZGlyZWN0XCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMucmVwbGFjZU1haW4oaHJlZiwgZmxhc2gsIChsaW5rUmVmKSA9PiB7XG4gICAgICAgIGlmKGxpbmtSZWYgPT09IHRoaXMubGlua1JlZil7XG4gICAgICAgICAgQnJvd3Nlci5wdXNoU3RhdGUobGlua1N0YXRlLCB7dHlwZTogXCJyZWRpcmVjdFwiLCBpZDogdGhpcy5tYWluLmlkLCBzY3JvbGw6IHNjcm9sbH0sIGhyZWYpXG4gICAgICAgICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpuYXZpZ2F0ZVwiLCB7ZGV0YWlsOiB7aHJlZiwgcGF0Y2g6IGZhbHNlLCBwb3A6IGZhbHNlfX0pXG4gICAgICAgICAgdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJlcGxhY2VSb290SGlzdG9yeSgpe1xuICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7cm9vdDogdHJ1ZSwgdHlwZTogXCJwYXRjaFwiLCBpZDogdGhpcy5tYWluLmlkfSlcbiAgfVxuXG4gIHJlZ2lzdGVyTmV3TG9jYXRpb24obmV3TG9jYXRpb24pe1xuICAgIGxldCB7cGF0aG5hbWUsIHNlYXJjaH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvblxuICAgIGlmKHBhdGhuYW1lICsgc2VhcmNoID09PSBuZXdMb2NhdGlvbi5wYXRobmFtZSArIG5ld0xvY2F0aW9uLnNlYXJjaCl7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZShuZXdMb2NhdGlvbilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCl7XG4gICAgbGV0IGl0ZXJhdGlvbnMgPSAwXG4gICAgbGV0IGV4dGVybmFsRm9ybVN1Ym1pdHRlZCA9IGZhbHNlXG5cbiAgICAvLyBkaXNhYmxlIGZvcm1zIG9uIHN1Ym1pdCB0aGF0IHRyYWNrIHBoeC1jaGFuZ2UgYnV0IHBlcmZvcm0gZXh0ZXJuYWwgc3VibWl0XG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCBlID0+IHtcbiAgICAgIGxldCBwaHhTdWJtaXQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwic3VibWl0XCIpKVxuICAgICAgbGV0IHBoeENoYW5nZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpXG4gICAgICBpZighZXh0ZXJuYWxGb3JtU3VibWl0dGVkICYmIHBoeENoYW5nZSAmJiAhcGh4U3VibWl0KXtcbiAgICAgICAgZXh0ZXJuYWxGb3JtU3VibWl0dGVkID0gdHJ1ZVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsIHZpZXcgPT4ge1xuICAgICAgICAgIHZpZXcuZGlzYWJsZUZvcm0oZS50YXJnZXQpXG4gICAgICAgICAgLy8gc2FmYXJpIG5lZWRzIG5leHQgdGlja1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYoRE9NLmlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkpeyB0aGlzLnVubG9hZCgpIH1cbiAgICAgICAgICAgIGUudGFyZ2V0LnN1Ym1pdCgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCBlID0+IHtcbiAgICAgIGxldCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpXG4gICAgICBpZighcGh4RXZlbnQpe1xuICAgICAgICBpZihET00uaXNVbmxvYWRhYmxlRm9ybVN1Ym1pdChlKSl7IHRoaXMudW5sb2FkKCkgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS50YXJnZXQuZGlzYWJsZWQgPSB0cnVlXG4gICAgICB0aGlzLndpdGhpbk93bmVycyhlLnRhcmdldCwgdmlldyA9PiB7XG4gICAgICAgIEpTLmV4ZWMoZSwgXCJzdWJtaXRcIiwgcGh4RXZlbnQsIHZpZXcsIGUudGFyZ2V0LCBbXCJwdXNoXCIsIHtzdWJtaXR0ZXI6IGUuc3VibWl0dGVyfV0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBmb3IobGV0IHR5cGUgb2YgW1wiY2hhbmdlXCIsIFwiaW5wdXRcIl0pe1xuICAgICAgdGhpcy5vbih0eXBlLCBlID0+IHtcbiAgICAgICAgaWYoZSBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50ICYmIGUudGFyZ2V0LmZvcm0gPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkaXNwYXRjaGluZyBhIGN1c3RvbSAke3R5cGV9IGV2ZW50IGlzIG9ubHkgc3VwcG9ydGVkIG9uIGlucHV0IGVsZW1lbnRzIGluc2lkZSBhIGZvcm1gKVxuICAgICAgICB9XG4gICAgICAgIGxldCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIilcbiAgICAgICAgbGV0IGlucHV0ID0gZS50YXJnZXRcbiAgICAgICAgLy8gZG8gbm90IGZpcmUgcGh4LWNoYW5nZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNvbXBvc2l0aW9uIHNlc3Npb25cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQvaXNDb21wb3NpbmdcbiAgICAgICAgLy8gU2FmYXJpIGhhcyBpc3N1ZXMgaWYgdGhlIGlucHV0IGlzIHVwZGF0ZWQgd2hpbGUgY29tcG9zaW5nXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzMyMlxuICAgICAgICBpZihlLmlzQ29tcG9zaW5nKXtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgY29tcG9zaXRpb24tbGlzdGVuZXItJHt0eXBlfWBcbiAgICAgICAgICBpZighRE9NLnByaXZhdGUoaW5wdXQsIGtleSkpe1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIGtleSwgdHJ1ZSlcbiAgICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbmVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHRyaWdnZXIgYSBuZXcgaW5wdXQvY2hhbmdlIGV2ZW50XG4gICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHR5cGUsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgICAgICAgIERPTS5kZWxldGVQcml2YXRlKGlucHV0LCBrZXkpXG4gICAgICAgICAgICB9LCB7b25jZTogdHJ1ZX0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBpbnB1dEV2ZW50ID0gaW5wdXQuZ2V0QXR0cmlidXRlKHBoeENoYW5nZSlcbiAgICAgICAgbGV0IGZvcm1FdmVudCA9IGlucHV0LmZvcm0gJiYgaW5wdXQuZm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKVxuICAgICAgICBsZXQgcGh4RXZlbnQgPSBpbnB1dEV2ZW50IHx8IGZvcm1FdmVudFxuICAgICAgICBpZighcGh4RXZlbnQpeyByZXR1cm4gfVxuICAgICAgICBpZihpbnB1dC50eXBlID09PSBcIm51bWJlclwiICYmIGlucHV0LnZhbGlkaXR5ICYmIGlucHV0LnZhbGlkaXR5LmJhZElucHV0KXsgcmV0dXJuIH1cblxuICAgICAgICBsZXQgZGlzcGF0Y2hlciA9IGlucHV0RXZlbnQgPyBpbnB1dCA6IGlucHV0LmZvcm1cbiAgICAgICAgbGV0IGN1cnJlbnRJdGVyYXRpb25zID0gaXRlcmF0aW9uc1xuICAgICAgICBpdGVyYXRpb25zKytcbiAgICAgICAgbGV0IHthdDogYXQsIHR5cGU6IGxhc3RUeXBlfSA9IERPTS5wcml2YXRlKGlucHV0LCBcInByZXYtaXRlcmF0aW9uXCIpIHx8IHt9XG4gICAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBhbHdheXMgZmlyZSBhdCBsZWFzdCBvbmUgXCJpbnB1dFwiIGV2ZW50IGJlZm9yZSBldmVyeSBcImNoYW5nZVwiXG4gICAgICAgIC8vIElnbm9yZSBcImNoYW5nZVwiIGV2ZW50cywgdW5sZXNzIHRoZXJlIHdhcyBubyBwcmlvciBcImlucHV0XCIgZXZlbnQuXG4gICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIHVzZXIgY29kZSB0cmlnZ2VycyBhIFwiY2hhbmdlXCIgZXZlbnQsIG9yIGlmIHRoZSBicm93c2VyIGlzIG5vbi1jb25mb3JtaW5nLlxuICAgICAgICBpZihhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmIHR5cGUgPT09IFwiY2hhbmdlXCIgJiYgbGFzdFR5cGUgPT09IFwiaW5wdXRcIil7IHJldHVybiB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge2F0OiBjdXJyZW50SXRlcmF0aW9ucywgdHlwZTogdHlwZX0pXG5cbiAgICAgICAgdGhpcy5kZWJvdW5jZShpbnB1dCwgZSwgdHlwZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGRpc3BhdGNoZXIsIHZpZXcgPT4ge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCwgdHJ1ZSlcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjaGFuZ2VcIiwgcGh4RXZlbnQsIHZpZXcsIGlucHV0LCBbXCJwdXNoXCIsIHtfdGFyZ2V0OiBlLnRhcmdldC5uYW1lLCBkaXNwYXRjaGVyOiBkaXNwYXRjaGVyfV0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMub24oXCJyZXNldFwiLCAoZSkgPT4ge1xuICAgICAgbGV0IGZvcm0gPSBlLnRhcmdldFxuICAgICAgRE9NLnJlc2V0Rm9ybShmb3JtKVxuICAgICAgbGV0IGlucHV0ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKS5maW5kKGVsID0+IGVsLnR5cGUgPT09IFwicmVzZXRcIilcbiAgICAgIGlmKGlucHV0KXtcbiAgICAgICAgLy8gd2FpdCB1bnRpbCBuZXh0IHRpY2sgdG8gZ2V0IHVwZGF0ZWQgaW5wdXQgdmFsdWVcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogZmFsc2V9KSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBldmVudFR5cGUsIGNhbGxiYWNrKXtcbiAgICBpZihldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKXsgcmV0dXJuIGNhbGxiYWNrKCkgfVxuXG4gICAgbGV0IHBoeERlYm91bmNlID0gdGhpcy5iaW5kaW5nKFBIWF9ERUJPVU5DRSlcbiAgICBsZXQgcGh4VGhyb3R0bGUgPSB0aGlzLmJpbmRpbmcoUEhYX1RIUk9UVExFKVxuICAgIGxldCBkZWZhdWx0RGVib3VuY2UgPSB0aGlzLmRlZmF1bHRzLmRlYm91bmNlLnRvU3RyaW5nKClcbiAgICBsZXQgZGVmYXVsdFRocm90dGxlID0gdGhpcy5kZWZhdWx0cy50aHJvdHRsZS50b1N0cmluZygpXG5cbiAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgdmlldyA9PiB7XG4gICAgICBsZXQgYXN5bmNGaWx0ZXIgPSAoKSA9PiAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpXG4gICAgICBET00uZGVib3VuY2UoZWwsIGV2ZW50LCBwaHhEZWJvdW5jZSwgZGVmYXVsdERlYm91bmNlLCBwaHhUaHJvdHRsZSwgZGVmYXVsdFRocm90dGxlLCBhc3luY0ZpbHRlciwgKCkgPT4ge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKXtcbiAgICB0aGlzLnNpbGVuY2VkID0gdHJ1ZVxuICAgIGNhbGxiYWNrKClcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2VcbiAgfVxuXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgdGhpcy5ib3VuZEV2ZW50TmFtZXMuYWRkKGV2ZW50KVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBlID0+IHtcbiAgICAgIGlmKCF0aGlzLnNpbGVuY2VkKXsgY2FsbGJhY2soZSkgfVxuICAgIH0pXG4gIH1cblxuICBqc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHF1ZXJ5LCBkZWZhdWx0UXVlcnkpe1xuICAgIGxldCBhbGwgPSB0aGlzLmRvbUNhbGxiYWNrcy5qc1F1ZXJ5U2VsZWN0b3JBbGxcbiAgICByZXR1cm4gYWxsID8gYWxsKHNvdXJjZUVsLCBxdWVyeSwgZGVmYXVsdFF1ZXJ5KSA6IGRlZmF1bHRRdWVyeSgpXG4gIH1cbn1cblxuY2xhc3MgVHJhbnNpdGlvblNldCB7XG4gIGNvbnN0cnVjdG9yKCl7XG4gICAgdGhpcy50cmFuc2l0aW9ucyA9IG5ldyBTZXQoKVxuICAgIHRoaXMucGVuZGluZ09wcyA9IFtdXG4gIH1cblxuICByZXNldCgpe1xuICAgIHRoaXMudHJhbnNpdGlvbnMuZm9yRWFjaCh0aW1lciA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcilcbiAgICB9KVxuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKClcbiAgfVxuXG4gIGFmdGVyKGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLnNpemUoKSA9PT0gMCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFBlbmRpbmdPcChjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSl7XG4gICAgb25TdGFydCgpXG4gICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcilcbiAgICAgIG9uRG9uZSgpXG4gICAgICB0aGlzLmZsdXNoUGVuZGluZ09wcygpXG4gICAgfSwgdGltZSlcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFkZCh0aW1lcilcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApeyB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCkgfVxuXG4gIHNpemUoKXsgcmV0dXJuIHRoaXMudHJhbnNpdGlvbnMuc2l6ZSB9XG5cbiAgZmx1c2hQZW5kaW5nT3BzKCl7XG4gICAgaWYodGhpcy5zaXplKCkgPiAwKXsgcmV0dXJuIH1cbiAgICBsZXQgb3AgPSB0aGlzLnBlbmRpbmdPcHMuc2hpZnQoKVxuICAgIGlmKG9wKXtcbiAgICAgIG9wKClcbiAgICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKClcbiAgICB9XG4gIH1cbn1cbiIsICIvKlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblBob2VuaXggTGl2ZVZpZXcgSmF2YVNjcmlwdCBDbGllbnRcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblNlZSB0aGUgaGV4ZG9jcyBhdCBgaHR0cHM6Ly9oZXhkb2NzLnBtL3Bob2VuaXhfbGl2ZV92aWV3YCBmb3IgZG9jdW1lbnRhdGlvbi5cblxuKi9cblxuaW1wb3J0IExpdmVTb2NrZXQsIHtpc1VzZWRJbnB1dH0gZnJvbSBcIi4vbGl2ZV9zb2NrZXRcIlxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IFZpZXdIb29rIGZyb20gXCIuL3ZpZXdfaG9va1wiXG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCJcblxuLyoqIENyZWF0ZXMgYSBWaWV3SG9vayBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBob29rLlxuICogQHBhcmFtIHtPYmplY3R9IFtjYWxsYmFja3NdIC0gVGhlIGxpc3Qgb2YgaG9vayBjYWxsYmFja3MsIHN1Y2ggYXMgbW91bnRlZCxcbiAqICAgdXBkYXRlZCwgZGVzdHJveWVkLCBldGMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjbGFzcyBNeUNvbXBvbmVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAqICAgY29ubmVjdGVkQ2FsbGJhY2soKXtcbiAqICAgICBsZXQgb25MaXZlVmlld01vdW50ZWQgPSAoKSA9PiB0aGlzLmhvb2sucHVzaEV2ZW50KC4uLikpXG4gKiAgICAgdGhpcy5ob29rID0gY3JlYXRlSG9vayh0aGlzLCB7bW91bnRlZDogb25MaXZlVmlld01vdW50ZWR9KVxuICogICB9XG4gKiB9XG4gKlxuICogKk5vdGUqOiBgY3JlYXRlSG9va2AgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgYGNvbm5lY3RlZENhbGxiYWNrYCBsaWZlY3ljbGVcbiAqIHdoaWNoIGlzIHRyaWdnZXJlZCBhZnRlciB0aGUgZWxlbWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgRE9NLiBJZiB5b3UgdHJ5XG4gKiB0byBjYWxsIGBjcmVhdGVIb29rYCBmcm9tIHRoZSBjb25zdHJ1Y3RvciwgYW4gZXJyb3Igd2lsbCBiZSBsb2dnZWQuXG4gKlxuICogQHJldHVybnMge1ZpZXdIb29rfSBSZXR1cm5zIHRoZSBWaWV3SG9vayBpbnN0YW5jZSBmb3IgdGhlIGN1c3RvbSBlbGVtZW50LlxuICovXG5sZXQgY3JlYXRlSG9vayA9IChlbCwgY2FsbGJhY2tzID0ge30pID0+IHtcbiAgbGV0IGV4aXN0aW5nSG9vayA9IERPTS5nZXRDdXN0b21FbEhvb2soZWwpXG4gIGlmKGV4aXN0aW5nSG9vayl7IHJldHVybiBleGlzdGluZ0hvb2sgfVxuXG4gIGxldCBob29rID0gbmV3IFZpZXdIb29rKFZpZXcuY2xvc2VzdFZpZXcoZWwpLCBlbCwgY2FsbGJhY2tzKVxuICBET00ucHV0Q3VzdG9tRWxIb29rKGVsLCBob29rKVxuICByZXR1cm4gaG9va1xufVxuXG5leHBvcnQge1xuICBMaXZlU29ja2V0LFxuICBpc1VzZWRJbnB1dCxcbiAgY3JlYXRlSG9va1xufSIsICIvLyBJZiB5b3Ugd2FudCB0byB1c2UgUGhvZW5peCBjaGFubmVscywgcnVuIGBtaXggaGVscCBwaHguZ2VuLmNoYW5uZWxgXG4vLyB0byBnZXQgc3RhcnRlZCBhbmQgdGhlbiB1bmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cuXG4vLyBpbXBvcnQgXCIuL3VzZXJfc29ja2V0LmpzXCJcblxuLy8gWW91IGNhbiBpbmNsdWRlIGRlcGVuZGVuY2llcyBpbiB0d28gd2F5cy5cbi8vXG4vLyBUaGUgc2ltcGxlc3Qgb3B0aW9uIGlzIHRvIHB1dCB0aGVtIGluIGFzc2V0cy92ZW5kb3IgYW5kXG4vLyBpbXBvcnQgdGhlbSB1c2luZyByZWxhdGl2ZSBwYXRoczpcbi8vXG4vLyAgICAgaW1wb3J0IFwiLi4vdmVuZG9yL3NvbWUtcGFja2FnZS5qc1wiXG4vL1xuLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBgbnBtIGluc3RhbGwgc29tZS1wYWNrYWdlIC0tcHJlZml4IGFzc2V0c2AgYW5kIGltcG9ydFxuLy8gdGhlbSB1c2luZyBhIHBhdGggc3RhcnRpbmcgd2l0aCB0aGUgcGFja2FnZSBuYW1lOlxuLy9cbi8vICAgICBpbXBvcnQgXCJzb21lLXBhY2thZ2VcIlxuLy9cblxuLy8gSW5jbHVkZSBwaG9lbml4X2h0bWwgdG8gaGFuZGxlIG1ldGhvZD1QVVQvREVMRVRFIGluIGZvcm1zIGFuZCBidXR0b25zLlxuaW1wb3J0IFwicGhvZW5peF9odG1sXCI7XG4vLyBFc3RhYmxpc2ggUGhvZW5peCBTb2NrZXQgYW5kIExpdmVWaWV3IGNvbmZpZ3VyYXRpb24uXG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwicGhvZW5peFwiO1xuaW1wb3J0IHsgTGl2ZVNvY2tldCB9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiO1xuaW1wb3J0IHRvcGJhciBmcm9tIFwiLi4vdmVuZG9yL3RvcGJhclwiO1xuXG5sZXQgY3NyZlRva2VuID0gZG9jdW1lbnRcbiAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuICAuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKTtcbmxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHtcbiAgbG9uZ1BvbGxGYWxsYmFja01zOiAyNTAwLFxuICBwYXJhbXM6IHsgX2NzcmZfdG9rZW46IGNzcmZUb2tlbiB9LFxufSk7XG5cbi8vIFNob3cgcHJvZ3Jlc3MgYmFyIG9uIGxpdmUgbmF2aWdhdGlvbiBhbmQgZm9ybSBzdWJtaXRzXG50b3BiYXIuY29uZmlnKHsgYmFyQ29sb3JzOiB7IDA6IFwiIzI5ZFwiIH0sIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgMCwgMCwgLjMpXCIgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwgKF9pbmZvKSA9PiB0b3BiYXIuc2hvdygzMDApKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdG9wXCIsIChfaW5mbykgPT4gdG9wYmFyLmhpZGUoKSk7XG5cbi8vIGNvbm5lY3QgaWYgdGhlcmUgYXJlIGFueSBMaXZlVmlld3Mgb24gdGhlIHBhZ2VcbmxpdmVTb2NrZXQuY29ubmVjdCgpO1xuXG4vLyBleHBvc2UgbGl2ZVNvY2tldCBvbiB3aW5kb3cgZm9yIHdlYiBjb25zb2xlIGRlYnVnIGxvZ3MgYW5kIGxhdGVuY3kgc2ltdWxhdGlvbjpcbi8vID4+IGxpdmVTb2NrZXQuZW5hYmxlRGVidWcoKVxuLy8gPj4gbGl2ZVNvY2tldC5lbmFibGVMYXRlbmN5U2ltKDEwMDApICAvLyBlbmFibGVkIGZvciBkdXJhdGlvbiBvZiBicm93c2VyIHNlc3Npb25cbi8vID4+IGxpdmVTb2NrZXQuZGlzYWJsZUxhdGVuY3lTaW0oKVxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQU1BLE9BQUMsU0FBVUEsU0FBUUMsV0FBVTtBQUMzQjtBQUdBLFNBQUMsV0FBWTtBQUNYLGNBQUksV0FBVztBQUNmLGNBQUksVUFBVSxDQUFDLE1BQU0sT0FBTyxVQUFVLEdBQUc7QUFDekMsbUJBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxVQUFVLENBQUNELFFBQU8sdUJBQXVCLEVBQUUsR0FBRztBQUN4RSxZQUFBQSxRQUFPLHdCQUNMQSxRQUFPLFFBQVEsQ0FBQyxJQUFJLHVCQUF1QjtBQUM3QyxZQUFBQSxRQUFPLHVCQUNMQSxRQUFPLFFBQVEsQ0FBQyxJQUFJLHNCQUFzQixLQUMxQ0EsUUFBTyxRQUFRLENBQUMsSUFBSSw2QkFBNkI7QUFBQSxVQUNyRDtBQUNBLGNBQUksQ0FBQ0EsUUFBTztBQUNWLFlBQUFBLFFBQU8sd0JBQXdCLFNBQVUsVUFBVSxTQUFTO0FBQzFELGtCQUFJLFlBQVcsb0JBQUksS0FBSyxHQUFFLFFBQVE7QUFDbEMsa0JBQUksYUFBYSxLQUFLLElBQUksR0FBRyxNQUFNLFdBQVcsU0FBUztBQUN2RCxrQkFBSSxLQUFLQSxRQUFPLFdBQVcsV0FBWTtBQUNyQyx5QkFBUyxXQUFXLFVBQVU7QUFBQSxjQUNoQyxHQUFHLFVBQVU7QUFDYix5QkFBVyxXQUFXO0FBQ3RCLHFCQUFPO0FBQUEsWUFDVDtBQUNGLGNBQUksQ0FBQ0EsUUFBTztBQUNWLFlBQUFBLFFBQU8sdUJBQXVCLFNBQVUsSUFBSTtBQUMxQywyQkFB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QUFDO0lBQ3JCO0lBRUEsUUFBTztBQUNMLFdBQUssWUFBWSxRQUFRLENBQUEsVUFBUztBQUNoQyxxQkFBYSxLQUFLO0FBQ2xCLGFBQUssWUFBWSxPQUFPLEtBQUs7TUFDL0IsQ0FBQztBQUNELFdBQUssZ0JBQWdCO0lBQ3ZCO0lBRUEsTUFBTSxVQUFTO0FBQ2IsVUFBRyxLQUFLLEtBQUssTUFBTSxHQUFFO0FBQ25CLGlCQUFTO01BQ1gsT0FBTztBQUNMLGFBQUssY0FBYyxRQUFRO01BQzdCO0lBQ0Y7SUFFQSxjQUFjLE1BQU0sU0FBUyxRQUFPO0FBQ2xDLGNBQVE7QUFDUixVQUFJLFFBQVEsV0FBVyxNQUFNO0FBQzNCLGFBQUssWUFBWSxPQUFPLEtBQUs7QUFDN0IsZUFBTztBQUNQLGFBQUssZ0JBQWdCO01BQ3ZCLEdBQUcsSUFBSTtBQUNQLFdBQUssWUFBWSxJQUFJLEtBQUs7SUFDNUI7SUFFQSxjQUFjLElBQUc7QUFBRSxXQUFLLFdBQVcsS0FBSyxFQUFFO0lBQUU7SUFFNUMsT0FBTTtBQUFFLGFBQU8sS0FBSyxZQUFZO0lBQUs7SUFFckMsa0JBQWlCO0FBQ2YsVUFBRyxLQUFLLEtBQUssSUFBSSxHQUFFO0FBQUU7TUFBTztBQUM1QixVQUFJLEtBQUssS0FBSyxXQUFXLE1BQU07QUFDL0IsVUFBRyxJQUFHO0FBQ0osV0FBRztBQUNILGFBQUssZ0JBQWdCO01BQ3ZCO0lBQ0Y7RUFDRjs7O0FFcjhCQSxzQkFBbUI7QUFFbkIsTUFBSSxZQUFZLFNBQ2IsY0FBYyx5QkFBeUIsRUFDdkMsYUFBYSxTQUFTO0FBQ3pCLE1BQUksYUFBYSxJQUFJLFdBQVcsU0FBUyxRQUFRO0FBQUEsSUFDL0Msb0JBQW9CO0FBQUEsSUFDcEIsUUFBUSxFQUFFLGFBQWEsVUFBVTtBQUFBLEVBQ25DLENBQUM7QUFHRCxnQkFBQUMsUUFBTyxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxHQUFHLGFBQWEsb0JBQW9CLENBQUM7QUFDNUUsU0FBTyxpQkFBaUIsMEJBQTBCLENBQUMsVUFBVSxjQUFBQSxRQUFPLEtBQUssR0FBRyxDQUFDO0FBQzdFLFNBQU8saUJBQWlCLHlCQUF5QixDQUFDLFVBQVUsY0FBQUEsUUFBTyxLQUFLLENBQUM7QUFHekUsYUFBVyxRQUFRO0FBTW5CLFNBQU8sYUFBYTsiLAogICJuYW1lcyI6IFsid2luZG93IiwgImRvY3VtZW50IiwgInRvcGJhciIsICJDdXN0b21FdmVudCIsICJjbG9zdXJlIiwgImxpdmVTb2NrZXQiLCAiY2xvc3VyZSIsICJlbCIsICJlIiwgImZpbGUiLCAibW9ycGhBdHRycyIsICJtb3JwaGRvbSIsICJjaGlsZHJlbk9ubHkiLCAidGFyZ2V0Q29udGFpbmVyIiwgImNsb25lIiwgInZpZXciLCAibG9jayIsICJsb2FkaW5nIiwgImVudHJ5IiwgImlucHV0IiwgImNsb3N1cmUiLCAidG9wYmFyIl0KfQo= diff --git a/priv/static/favicon.ico b/priv/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7f372bfc21cdd8cb47585339d5fa4d9dd424402f GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=@t!V@Ar*{oFEH`~d50E!_s``s q?{G*w(7?#d#v@^nKnY_HKaYb01EZMZjMqTJ89ZJ6T-G@yGywoKK_h|y literal 0 HcmV?d00001 diff --git a/priv/static/images/^^.jpg b/priv/static/images/^^.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1a27118443b84a91eb3532375c1a9d9a5515e9c GIT binary patch literal 50290 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 literal 0 HcmV?d00001 diff --git a/priv/static/images/leet.jpg b/priv/static/images/leet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc6f8cac962c8195a7617845a0e0ab477297134e GIT binary patch literal 68789 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

B?_akE$2n@&Q^$;v& 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

t8C_Y_xtWN3wB!(92bp)z9sEt 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 UC;!?22mu2S13wV|0D>p~*+|amJOBUy literal 0 HcmV?d00001 diff --git a/priv/static/images/logo.svg b/priv/static/images/logo.svg new file mode 100644 index 0000000..9f26bab --- /dev/null +++ b/priv/static/images/logo.svg @@ -0,0 +1,6 @@ + diff --git a/priv/static/images/love.png b/priv/static/images/love.png new file mode 100644 index 0000000000000000000000000000000000000000..f082b1d9705ee7eb88bde097ed85b964c367226c GIT binary patch literal 125653 zcmeGERalf!_XiA1C?MS(0|Q9+&>%w%E!`k3-CZgu zAj3)Aw+KwB=GwsB0bW6s$OPRu6*=QQV#$~c%(SCGx_Gq8Igl_xG5GGb<4A*__e(3+ zdjyoaUm>}qZ`oE5_S7_|@9nSETkro|HOW#y-%`gQ1L0vm4%660&3jz^DF1o-FG!2R z-;Vfq$q%%*R4AUW^a9htf8U7-OkepVu_{c(&cUHpMit|Z=3i~?{F)oG; zrQYVtf47f8mS=;P>7NX@xJvws=;6SSBt%`1EaHFOfglzTegbap_HcR2{Y6+&V2Ipj z7E;=0BA>~c41bGrcCnt)`VUD8gdwyYiIM-?1?SVQB#czA)8XZRh#Z&-m9kkmhR zE~sMyg<3t#?f)UPfS5oZnJTkf82ylE0^WOJL%^8^LbVNlk<~aX2)GS6SEKy*4A@(d zfdD18%z0fHGOUVNLp>+ddNTR_0Jv$1$kqIhHCFs*MkHAm|B*cz3L~5QbBg{yBq%hQ$8g0zL=MKKCR@|h8uRO8%=# zK1eWCy3PNO)IJNZ`3u-H*DCcU-ao+sZa!fA(`~L7upNjUu$^B26`Hp=PJT%L788Gj zNg~>JWd5MP0z(C}1qgo^|NpcFe--By6-*`(Siy>b|7sEp2ag{AGdAo9&+-FD2q^rY z^@05WcHIB>HWhX<9PD}QV|a|}KaS#J&ISK19)1C{E*3u|`x*Xm1Y@84KZ{p6X`and zp~*TYX8f-)r{|ToFNb&O|7$>o(P6+&uj{b-|6U#bzZL&?9{(@ogS`|xIXSs#l7pj^ zkfUdS9-xH%!{&ch5a#us6?5{F@m1_!Rh7qvsU8D-@(Av;pL`bC-Dk%t@NQV-pZYO8 zn{>$+wVr=XF+2IQaYhQ8m;Q%H!sNIR`8`PKud6ITfNi|{mgD}P&J;X*7(BS)?SFdf z@~oHSZ_FwGA$ZS*oBHFt&|gJO#(3Tsq33|+A3_b|K^2ib?SCo+^TD5B8@qf>_Wh@R zs?Uxp?1lOHUwiRh;912n@M@#~Az{xv{NLfgZu$T3;k1y#*sq_j>VB3_(*qw13x)T?+)J-->4NSRrFJggn*BY#o0&S~Svr_Hbexg zXelWv8G3u)qX>`gE&+sJT@sDcK<^m!8pt@Yzo)`3!%*SE`G7y@BjmdQ>gUkKySqD$ z>+5U#1JRZCf`&?W1%LbFf{u>0C{!9komWV&QjzZONRfhB(KLG*cL=z7$m|VUZho%Q z%0;=lyHo1cSxrApmuga~iu!u#6^Tg2=j}|*(h|la|8q_Sp&vtuWISRi^r_eDEEF>u z{XTen2%%WiA*`>MiMEk3F);~`3Z6-vX(~u8cvV*%fe{@=A>j1kLC^m9W}HS^N-14{ zpZ({Ge|=r!W%q>HugdESX3?d(Z~NVyL8#X(+BKVRb#)glBR>Hn@iK5O@G5m->S0du z>o>xdqmdAWVGn+1n*-I$%gfcMgsf=$k5AcaYqeJHE;c?k z{;DREZCCYI85!iZf|?b&?qHKFu$P9YN$sm|=^tRq+d>1Q=5`B$_=JP3X4_Sizj!(4 zb#`;=t(Ya??fmEM%GFF_B2UJzU*WD)9JAp?D_8fQKk|EAtzdDR4#RPXPYIoisGO|+ z465$v=-{~I$=j)=S4`()O}l`T8SzeJ(Y-p`9!YEewXoo&wUeowHTU)W*&b*=hnCE( z4*Z8q;cwMhTHoceQW6o((aBsX3$L(?2-GX@ZRXcJf_T|%iYeRJ)#!IY5Dlxnu+VQ( zopc*#Tsu_!(NR%tk;&GjrEGpV3JMCis07T(M8w1?e6D*_Cmp%cqnV=4S6>#6;#zNa zN33TadO9mAW?dQg4gj%SpdF!Su_u5<*h1l~8j6>L)bCs;z%0KQc3pCjZ$ygoR|?x3 z1}R!pK))n2$mK|w=Q#zj&12Zd$RI6S2su|>$291=86(~rCLwtGw5D?7D*oc5j%~du ze9qg$U(@?W_l|jK8AK~1J7#$*XD_d@U0tOx(>r^)zU>YAxjTK6SXFtB-0`MrM$#p} z%63NTybq_amTX&;=xmVPYZcF{mn>P&_xcuww;yA-&*YkI5KJX46@1|#w-EGBpya?;MoQy!#n_BtbZsjzG>q5<~?NHhg9!Ku$Sm!PkzO@*pGXc=Cc|w57b&J zFXr3@-+}ied4#z=0Lb_%QjFUjD{gb2nTJMoV=PnBcl$Pn8qH)<#;8n|Ly~_bk$09z z=+Ssw3TJypTNwm6VF?zuT|xMsG?d0B>|NbheU*Jvl2tQ&^V{F^8&IE6z)r#slWL2> z85J(?eeC-+9`!)xy6}FDJ;wlwhF!;2h-)sz&?ZYO1gAQ1O=|0ks0UZzpcRWg8d`n2 zV0|ZUMc|1fbJjR8nWyV^P!dJC`f68$_K*`g3p@z!Bu(ow@fM12;e9zAJ$d1!Rev;z zi<@iD&D$WtQhZz76P{+M*YbU*Xxq`xPJdcYftvmP*{(g#vTHh^AgfJkgXBn-xdpgg zLOR2bNXaSN+p61)TBpXzYdZFdiw!2sGX|z5^y+a<*k&3NB*O__68rOZvM5cK>{4Aa z5+~UX(P@jYg-B`N1z&hZC`8PL-r1I%ti{d=p`l$xG6AhW_!xsR-scJ~64nb(PtM=w zZ|x_wmHo67szt4=eU{SI5*k?gG|eWaxGGCcHPI=uRIIfUNnO_58{BtPXO@5+QEGzMs&w#^&3asTnDoscjsK+>Zxg{)2&%qk$*`y8RkN zn}Osp`I(1bygv<9pajCXqEt(VEzZI(Ez!zPfu$e z#j4KqzC=eA*dyIfiw$HMNJV6+2K!;v2$hTPeL)9NK(Z4diJnU!}OS>;h>A8Z#jg!M9ND6%qf{6-HbTC4$RSH^RX?Gp3mvaiz=(#sGmap1+zf-b0d^W-u;DWP~!qJj8Xx;3Yk>H#0vr6QFN9Fw-! zcr_i|m?5zeS8b?mzbIZf4X?g`^{R8Sna*}!=*e7Iy^j^!#kXkAHY9OGNW{Vf5K=d| z-Xj-`K_=jGv9)99V}95)?eDeHh3T)cFI3T(M}H;%CvN9qn+)bIoR8v0k6+G9F|RlJ zxp>@kRF98))9>xOGZ$GOSgCP-P@CKu*1{r3G`nZ=H}RHa+!oI7K!Xw$vOp9qnXG|Y z3ijHy=xG;&njb-Qvreh=B?N-}EMx0kGHbl%k-U^9Rw$^l@RGu0F4DYZ- z?Xue1<{X@u+?~-Z(FXgmHcd6|Gxy5&r@JwR`&qbHPVM%yXUD?yTztWY7YJ#5Kn@M8 z!mT7fqJ+71mm8W5ToYay;bw66X9+S6aXLwh*_zD(>pTUuDIxJ6d^QS+p|=rT5+9mv zv?sRC2Ph`}#%zC$#+8Xy28pP*Rt|woM|nDiNLw_DIt>=0K4Ey*wp3=6A>!BV^m%FH znvUN3`XXc#f8S2ErlafaedT_*{J8h?q~D_6X60(PT(_aEz?lIqDBKt@_jZaRaaqoNgkJX-wLbz*10j4aBVa5-Eki~QlUV*POx(s?uLQNQ0E z=VVH82BRtKpJ(Pzah|4<(R<6Z>Y#TT{l!iKN+Z=$ zY$~E%9pAAb5yk5XNi*BHYcGXW$z%<2$YY^WRuoUAe!HK?4pSw$hwoTLyT{2e%4mo-M_6}W+mIV#2(Tow~t-3WGQ35MA6f{GK!Yi$rfU+XE8)MqFrtB2`~L?@-O zEb4@ETk8+Wq^NO98^sTqah*-kNLgx(C)#YrD2SQPtOWhE=fR9Mg_>VT@+YP~lIWsH ze|f@%rq*eUkqY`f+@$y-VT$-pj_~@fpY~DyITql^Xf;1%qoo(oeUA89G#PhpL5L+3 zQ*zQFQubsm>^CPrR)5_0NlR5&zcGdeL?|Rapl2_r&gan&R_Mh9h5@xJeg?jt-J$Nd z;|l!=(pd~=;ZHJ&VBuKo)njE}^Yk1Zh-b6_bU?!2=5&eA083aR|}I&D#^}jZ9Ce1PSJ4#{PXMux(MQPdX|5CbfSb z4muA)>(Fj8lLC~lGw3Vad{RTsJ{1|&tv>|k2t5#QnoZZq)Y;ItCA;XUiYM$*ooC`k z1rBNhE;=_7(;wc>PPmBy8~H z2V;B`5Wc#(PFU7T^}^%MelR}-xJH-U1mzvUNCDl&k@$o6_Oo;QqT1&sf1L~ZpWpl6 zTkSt} zS+J2%Xs|U+JjFQ3GJ(oqmHKjO;>npxeIu0J`OQ~G3AWXA3!H#H@3SANSY7%NF|7=5 z7ORTg$&QmCv7SwT8q&WnGqM_W?hrF1J7>JZtVW2 zd^Tkqq}d~PJSNh%THH3MTRyTMKojR7B#KMkVD zNxl%2priake$IjYlPk6}SFkRIEBMuu`y<^dQEv|{PsBr0 zztGhK(hym)&qz2oU0s_`K@(Xm3~$CJjZ{?V5VLg?M)+5^5A-*t1>bt+8YKuKMhcTh z!V?dF2cvl17ki|$Fh|67$2aYZcI+wGzLaTynU zj0?BK2H&W^`CS%AJ3RD7ymSn0i7Jl!TbI~;*)=c^3UL}^W>*DqgbwKd4nu7!{t!-; zZBfO71nJ^C@gO~Qs8ao+Q&ha`_vmo!+yQJblia9TAHy;wd8LI(*w5|g1O@GD=dzb;fN$zzNr1n#*U|s zN><&*vxY=w?K4w%cV5ueMO)^b618`7;d6R5i7Kj^$bw^;P*tY`TECZY!Q69f2G+V# z*JucnlyOR_1V$(~Q!_XRx|Di_tsElD5bQSW4Xf9~>5|)=v1rOLdV`fTB$G1giJBky zE6HmRJv}STYMAAwy8$7ojZINCE;iKY42?SPJ4;;rUr`K`qRgeC_mNL(s;XiK9C+&d zIy420l&@9cgUmHsoyyJR`ZX+_Sxm>Gg;vr_&wE2cq{h;PeeX!i!xu&C{2uSvENfl( zWIPKVnw%(V(P2(#-mPc5-$z+Vj^t>3!|T^?%E=mv8E;ZoF8f($Vb?Gkp1giMYN?UE zv(Q8xaj-h$KzOY2

x&;~6#0(~*WZRI*cp?plL8W2%1M)BEkhTKCwrxw`L+7VQk( zwkfl8|4l=6H;I)?Ih>P4R1BMc091WpwA*a=7wJc8Oxd;U!!8xKmc%6Y`6HV;;T^8v z>8tn0cSCfSRa?B=k=K|PS%R*67hJBnG+8Zc^^0v(Ds+nc;yK&>_B=_BThAG`lhzId z{Iw+00BDiD4>?6;<^MC zoeHjI3K_kirHwoj8o3bbk!ED#qYn?nbTWqQhU1uQ10kcXP`JUqoC7YcJHkPPuP_d z@9~G6qUP8aLDYq_5osUquaErgKG@v2e;L_V;)qL8+{nU;KGyMK2RcBMh zfRAcr6isj+%5pmq6^9KTTHHcM%PsmZUDYd9U<68K( zx>W&22<^N%3bapc&UFX=hqUm=tK7hHXA( zknxcqr0ZK=x1$I1KdV3Ng)g42{iUphIO^=>VTsN*A&iUjeJ{hh>Ah`5%WQQgM6b8J zmy~$?OAPkDb=sO;4w$R1Q`ER05n~>r1+*~e)pe1iF zFUH4!0E?@GU-xx0lI87AlM1}Pk|qSV(*G%Bxj*+m^#Oyp1z|5tnd7u*)_vu9f49@g z?7P|YB%aBqEPNGAg7e`E2K^e^ zX)Z&gp-xSTg09mOZW>(`%n3>P?^?<>>TLSW7MYzJTn1P4sTF75Ly78m5cN>Qabk6H zSQjH;g&}Yqx+A5a1`tJTqQ3V<3qK_|_+17VZ$grKn`buQ{6~kSR0@*omn2qwf(<8; zLZAtjo%2i{jMb@`8Inhuwa>hp!zB7z0q^J*zp#)u69t9a zv0EUgHGZwrYI3m@qB`i26Uem}OfP<*-HEh9s8Y2A`Fl^N@??F%Yg2OeBh>Fzzx%vh z1^s~r>%@D$(vN85!;cl4%@z+4`MUE*24_x~dJz;0CdZ)&TuW`k;@F$i>3r>LPG7+Z zNL256iJkPW)O?pQz6LsT88Vb-a23Y7D4P;bUdy)X?y z$tAYhf(&Vom_-hfP=Bk%8`b$mExcZMXol{2#vk|^AlQNuckscG>@phZ9_e!oac%#Y zF!l}y0de!qaJPMPtNOlO7tbnJ@B7jBNV_y*CW2Bp!8e)}dfM}TkLU@oGWRSi{Kk8w znO^G;*QCvcM3q@Lk)(Ft*V<8{bDdA`GpuD13vi$NF%n$&UZn6%rwySI$I~PC$0gr| zB>@882b$^Fx<3Ynx>(%jqr7vWtMDC?vT?1ZT{?S9x9Y^FG~e<1vzdHoq_b_nmT!9T zQsH89`p~FOVsIWGN3QlRSFcJjci8hHRd5##>Y3q|v<2xYam${&` znA;bl&95wJB>X+<1n+TYOknk3Y)cwRXOh!S)+RC1Yw^W3)Rz?9VoAL0s3ar-KI(NG zy{lXcVm}}~KE2-Fmt0FSU| zJ2V{U1bD5-qs(_(fmv{CP*zl^yEWcCd z%BA741gZU?{$A8q=E-2>0{NCW*8xQYU;%(AYt)h8rd1T|bHB}7JA-%OZ1uLO&NhM+ z#Eguh8G`H1;K5Y}6Mf;%L9^H{)SHl>gz^enn#0a2Ls1nlKb-vyQgglDa#z zw_Bs&!FifQoKy z)5qoC>-u?gYXqL8Cw*Jwx!iWK44)MRrE{hRI1t%_r!tQX6%|;<#}@%o}Gr-W6uy8eI9jskSRv*X3O|m4u~6M zI{Ud^pQtl&Cb!1zPzShD#dJJhCkQmAfIR9=(*Dw4d(mq?RF^bs-(oHg(CTwYZ7m1?-=Z?P7>6kFbS z#yYBJ#GF(vF*L-3Jt*;cfJmo+=^T>nlZ8$uovZ-Loe-3-sintUgBvh8}9?BGtpgwn0E|Ev28slstOjN)$$VkA_03aZSX1n-GFs#=`_CKoN0G>swRe+GsKXc*Ot5gM_HuA! z)pI|1DTnmjw}$^Ihs@Uw%W*0wAQ2g>cq~c|>xJT5o&l#ggxMbC#~41#^P1Dw^c4ON zr%E5}kiN|fdkP2mkMY+rg}`bo30+>x5qYHUi%*aDqO21){J*}TqnJkw<&O5&fvjR6k=UpmCd!0e!HLp&Bi^&gCHCla2@g#m-aRuytq;JVxl?I?LlXn|&;m zfTkT}ju*ejL*?v#ny+2X8e&RUs$0(@7PDE|Gu1>4jE7fKdflvL(`VicqQbhcH*Efg zm5-~(s6)973}b1F;;a|Vuvv$6!)QzCx82q9yj$(`1HUQv%$Gj_U#7gj4~$?5dd2ZY zs)3xpe{{mBSS2nWVs~aHU3Ogm@m;${bWQm@FidrJ^Ja^rQ8V5nFh1eQO%f`iyD7we}Vg&bnFkmM@~;Abc?8+Jl|WG=ecpI*>qpi1~~kG2(TzjBS?x(=C-1 zzcfBamzCiBD^~XktvW7uKt6bLI0IC{y44NDu%#ABadw<>`iwOi@+JIcyK@c0$<|Kq zoi^RT?SZA)3sSP8k#@}zcbgGXkZnXYtT`=-c3xa-!PxA6Tw$~H-O>1RukNw3_3SKu zzheG|G+Ov-jxf;B%RuR#jYBZq_St9EGl5XInW%M6J5kvlRAs_MnK`W-onH6Pc#YpTo6QkVLTWdKK9-YKePZy_rvmmndk zB#1J`I5rAk<}D>I0jYsRL|x{y_2HcJN)TEZlb^|Ag3U#uc!Il$&SAE*{NPu6dyVtX z=pakO5)P2p(|{+97yHNbuvwrC|8N)wHCvt9C4fb4!mMHj__fA7mwj%QvcxgZSi}N7 zHd*4>@#q#VfAveNCj(AXXrm^@%o#B3HFCn{dnGBun(B15+h5$DY8a)j16M!%Q5OK-7o{iV6~-Ovx!U?KbXY-t+%z z5oIlAtuc0p-!8C|rpc?Ug43j}a0hP1A?w#uE>Z~1Z+ml0(Z>_)e6cO|6HbY+<*M_Y z&O7{)iG_#5iHJme{HvMwE-3j1Z9vOZoMfPLnbFwdS42PoisS( z1Z8ZdN%e2Hy^~6sM=j^0I!%MAd-~x;7S1O4cOQ(>w&B)Hoa;@<=dx4H54M9?c)(GS z7$`ClosX@OR;vBPI8s|jG-tL$Q$P5_fpF)2FgZ8(5W>uAh zFKemukR;eIF;*OVsO%mRzYO7=^*|b#JK7?BBp5Mdyc%96`)r^ZCiD*l9<(1OtJB#C z>S^cj@;hVff4~KZrOqh;gdmAezr#Be&qiJhg3 z8!Cz1=B2OFF~SV=hZxGe)ib(I=hutXgRExRUGyMp9#RI>txMicWGf`V+5{ zX|lwN6s>SdE)us-UiZx`6_3d;xAYYlLu^x;OU1G2dhUKBpp8?ftJ|DM@~#LlCtQtc z8hCEairkGy`^h5u?ft5-@XJKjQ$)mKtVql?!a3V&sX4E*_f1(eJAPnN(f$*Exj$=I znC48*s1;v$4p}6Csw!7=wS3=elJD0LP2>C3=lyA3<*WzU)2ZEUl(Doq!?eqiPJhoq zYx80~oGn-_B2Z2%W`4Jwve(PhI4cG~>(ZE2?I&D3FP~`7fGCW532H-#LJXZhdTO$a^IS9WBYtj?Y?jildyayer0qPGi_BN*9>_Tf5*5p`UVH3Biu?)ts9ph@s zXX%L}C-A&IG2IK}`!Ju*uZ6ntlK@|^k{{EX*LL0^aHp=NyYcEhR`$EN{^mqCCFEMo z_S+Hrr-y65**RCuE}oEE=FX&OrxN>{#IXyt|8MGFoXT-EOj5Qouvg9OaL1z8Xd#^b&I z5{=6mb3F*bJzJm^I?{w~Ivc!ul(mQjhRr*oXoW62es_)nlYDK=l6?qO4oBZRqaljN zpW>Jq9_vtgKV{+;zm2O!d(krrHrvcZAztnp}C)9_Kc3B|uM zFH-}UQ^SRq_exCLS8h%LYZjPLxA<0z$C3no)(8xOwk?*><2udrqZu>GjbRu%sbJc} zQ#a#t)KO;?6iCTbhA>VbPECztp_iD=yc`E$t02Vg$z#~&DBV>B;0I2(6}{2?9Yfup zcpgn5N-)8ZcRfGmSML-J+|adaW|_fQTcB8hl#Ez;%Jly*tW|wGG5Qj3Fwkbgm%eg; zAkTV-AwGc#+}Nb{=f`a)lQ!Z@nc!3n)28p`txjiCr-P-H2WU99R#woPRdmuy6lj%U z9M_)B)G(HQR_M5*j?i@`Kj|SKUwdw=!=@7er5^=sVsrO6<2)vHkLmkce4H+C!wNno zMnf{StRtm`>hT>Z6DZk&8|_=e#h^fvn;U*z96sf+9zaC|Nsu0ER~3MA(C*>JMG3(} zf8lJV_k@w~^!e^5-rJ@!ek&nOX!`90B~GnL$~RaT--Uo*(>ewB>gDXyty5 z@;25#+xg0xRoiEM@9~TCX6bX=Umf0$6{9q5uT!}4(9`t#lm4Hg=F)q`pa;jZ`%@B&JDHJ|aK@Wjwncou0nur0E0^D8nxy zR8=iblhJmu$CMzw+5Zv%PB-mznp3x7Zs$Z&(Ly61RW(s-LPe1AHy4G`WraTxk7mYExPDVyB6qkX(-og@&v7ALgteZ)*GWxuK09~6U4pB~2V}?=4!FKQAW$fP(G@J_B| zcyUgAM$IvdQFThCmtO&ge?uUU@$9{I2BiN&E|~ppgRJnkDGg2V)p9i!ew2FF-1f$RH^)7sT?Z(NWQ*L8y)MF;-$S+aMj6M-f z-nkqZGi2hGUV~>_$O?IN=G6M$qNGH%fC&;_AA>)t7{ie*G;DdemvDw*Kxb@)>B_P^ zi1n)qsBu?n`&Ny&V@)0sXQ7xGHfya>j$sVe*`7b`hxE<;x;|PVq!^@pWQq=XOn6FW z0&Q^80THUhNR0ze0IoZ|QeZbU*FdJVX=W7u35z|gBJ}tnrn6MH^pL@{NCeYCvU#+* z=Jfh+a9xQ(3lVCiZ?(xsZeX3wLsxX8T2@HPt@Lmm+1=}=M}-3mnp(d~U$mp(ndxo@sojv0z8=ZARP zHagkS+H;K&nkGha1Lmji%x04_c}Foc%Upo_^D0VS?ink%v}C}}OLR#9+AJR3E3N99 z>?SErzoC5(u^^t*7H>)8Ou;yFRp)V0OSJ01@RO|Do$jyiMw;QKaz7X z%9`gC-2)w-nenadu|=n0Qj+qN5nVa}Na+GV2bmPVMLb5!zji%lXu828`jpBIg!OHM zKhK$5F(8aZ5F~wuWJ1Bp1*IV&#WOhn$~J=xm^8n?IvgjQtD@V&hn6jpACl8I*tK3Y zq>&OnE@tuwdtbDAcoSDV)X~D9KYxtk=@45vg+r^%;=jFH_{UC8_56?1NP)r-Ep&Qg z&V@soX)&lgu3p0Wtd1UJ+qkAwFYe#K)5s=hH}9rTXBr(niR=84iV8#10M->Qiiv#% z;5+C|ul3q0i3tQqwnXS|Z3g+`*93f|<2JlA86|U_z!ty2qI;y;0_#B5>y5-?Vi--s z1c-1JYwhi~I*=$M+HT1#Cr*FTnQnIpbOx6_S%$O{@Nga1S~|3Fn2uCy8T={>Z%m6J z?z;WnD#Pcq`hK;8e|Q9-l-_rjzL}d{otz{*FfaczxSKu#>Jm9gI9BEht4USU`+C%^2b=X^%^>cgscf#H1HXrnd{Bwz%PCrsxh!Fd2hFz1jfzMNq zf0c*h{fY+ByQG7lvq{h9k$74~#XV&@lXy1X#~PrPhNe8jU02x6M+2V5$2BV#{T|1bUG^2Srt9`HdPIZLy{H`qU`ebY zr^|d*#7E@Zr|ymbQp1(jdw<=Qyz>wjlcOIR(AxNcZYZeCt!~rCaym-m!Ww*K5s$*3 zH)dt97mj__Bh;wSNkMP(H7<}mYBL853#q#cL6FsSa0QDji-T8?A03nMbO4JC5mCm= z=7~Z@-#C=0IN_SNOqX)cR?u@CqnHf5Wq&74V%T8h3w+se^twY}GxWwV6!SAGo4Kcg zcp`?f@x}`j9P2X9kl2r1Zcd~71{1`Uw}J;7)PA@kzMRr`KS-DAzU+3n*`?Po&rkY! zs7N0u!1$m-ch0FobR!yx&HM5f}o}q2Ly|(XRnU)O}L0!EB;3b3*{MiSl zHC^`p_lsiOSg3LOWrZZy-bSW;+beTleWs}A=*o+w;u6i3O|tmOH|0vkMwZn0$!e9=ppaFPN)Z=#FUa(wsgOAo~{G zG)jVt(&+1`xus{gvKsUW)!%6);QBEFyk(%-EdQEwq*KCi|Q0capyJ%sWVOW(;2x^e)&7u()_%4;$b4vYmXHCz*Ug8RoO2m2US#fm z8HwIoR1(y*lDSekWll^&Pa+aBWE51#e`7GG^@cMznCiQ(eS3N0cv)GF z#nA=&r{Jzs5QWbu5mwS&|VU2Gsu@?@9pjkGaP7v$WTOmv-KbL^KB@TMERy2{l4R&+UQ-+n%7 zh%FLg@sK1;pNyfLNyAnq5 zu`HV*-(D3vn7H@85h=}|or)ws;{fQ&@&MX#XVP~(-a~p3*S;l}58_PEde_%jT&Iae zV7(%4;JYSWxse)4Be5jjbIvc+nTy&!aG>%QDzy=>PPB>*Ho|uDuqZtqN#hN1PRy6t z?)rXV0j49T&kH_}-^goiOC{GnXDZ#?#Y9OTiINir`#eN)+ZB^6UP9`UgJ|v5W_pSB z((Ui3PH}l~g5R}jLtU~KAalX;@c43Dt6c)$+dw>3^J~744C^(OxC?QGt){yIj=B}+ zk!@>#MbEN7T8xKW=Z6jP`wEB=&!0aM7QFmKwYkyfPA2Gc(3g1S;;$F@lVGz%Z#o7E zacE>AN~eeeKoc6E(|$D-l+K^djKJBLEIe0Y6T&-QKya^1D;W>m@zO&Mp~2A&O;;on z%z?+Y@4hMWh$a&x8C8Z9Q-@NSL9T}z!A{(8f|a#Ul+MUVFi%U-A0K6joa3eWcccL? zLBDEuP!B(LrBjI^CkM2}xXizx8qu+}*KM3ty%H!S&yy4EmCo6Dq1ng3*hKm2hkZ%wg$^vy32AItRqNiLB z;LM1!FR``$iC?U@z2D(o_Mo}iU~c7OY41NU1wDU$Mq0Ummd+K(jB?nE;Enn49r?C$ zFSykEI%hD(ru^zR%k0Z-bM)Bv%|TR<(%%P4%xpD=>f#}ExG~UcV@3Ta?E`mTWY66zL?(aKiUN@e;KmffNK5p8tKrJRdW0M;&D{RpDjAuqb zV}xR548b6a)gtfhF8E>o0+NXix8W&{%imB6@~d)sU?*+|mzSX<94go8+S($4DkgtA z0PrV~_S~vaYo;G|!<}h*3aY?i77FjNx5KXLp&g&r0y2c<{2!ah1^sl74;AiD(H*DG4BXfXDU@_=Up{Q4tKWZT0i+mV z1vxdA?Ebwv>rS}vHX?-10@2Rcn01zpbN+oI_4VkgTn!T^ZzcTO^k^CQkU;y^%NZ&L zpnd;tB(FQtJSXqnTQBv5vKvycxqNSxJO6$IONw7Q_sa?YwIIUJe2$5q4{R{17Lq-y zj^6k=8daIcBUy(M2r0D0ya6g=qfL#to#ohLEQ>d}>szbM%;3E3f8X7R(PNBJM!ep) zJDds+qK}J_X4NC|bvwV>_ft#_WwWFx*^ZT_X7_)tt+dbj>1bAv+Q+LUx@QV`tAN+pZ;$25e}#lC4L3p;KMk6pWf%=g(lT=h+y>LG>*zW1;Jr3>K#sGm z!$NUWldFpy?B$s&^_W{jO{nxgCzWjby*=}e(EXYj{gO>l=|Y%~UG0nTm%xL&o(Q85 zF5I)wP>%FmMM4>=tK$_?6>6aM=lpiq+<+gI`#L13X&oyzIj(L;^-(hojOM z6k$J^kug+uh|}1Bzw?-|xYI&^$W#2ju=Zx%nQWKibz-#znC5BEblw)F%>Vod*wJ;3 zRwZ=a^5urpW83an%OPHV_X){Ax5^)yk}Pwf1yzW&tgFb(#9N7SlO zD@hxUtTjb!5W$HH7Y4=I{!TqLTbSXd1og7iq?H8v?8Av?Hk#Y!$0zg$UlprE$$8e3 zOG_-|jOrzIU)suyxS8YP;~1LuPjE@RsAkr!=N_cZ6m*wDq(1)O`92a&uSn>6crszK z<`PVxpCQ+kT_VXqYYp0X8JUocN@GupfXyJD1If%5s0h~L(8xkQ{C1`;Zo~Jk^>(|W zN|FYDlJZ9(ZH#cb*1F5YLRsRPTLn;aXRR5P_O_zr2JC18fO8NyIO{MD{9KGG8$;Ozg^31@1MMpjyB+C%9-`3ryk4m2r9vuvyC3IHt-}A`IcT1 zQZ_3bbK6w4tO$j(aYAa)@s z#a`;3A!MSqNjh#M<4nuxUTS2Qyg(!xzb%O7f%3W-Nv<}PIIXm<+>|yi9Nunt*)`fN&Q<6) zN7=wyAck$X+iCt>=bB^Hq+r&azyHl++!WEJ)_z>!TAVsND^B*zEmo=4BuwFpSzR3z zF2`|(vD7SFf;0$E!N39n2UXEdx616p8l{$f5f+1r(gJy5Ts&>1%_-x^-ET0g6=5WE zIKU>Fy-C@}SgKiu=F~ANSMfVkI?h;{8coOq0C4pItB!+D8!FeKoZpT6xleEm}A5Ww{Itmr!oAqZUn}w32 zq@g1_2eW5+Zl`F`KW6cHGH<`K6wpR8;Uer~JQwMtOXZs>?k3FyGFN^b&rAdaDU*np3^HJmVpp~LIp>vgN0<+GykR>WJdv_W zWnMxIW9puFA%qM9EH8E7DYM=Hj|&QVsd_*O!rhZMY;8CBp}ZB9{U+Ls77$#pkjn)G z5)X-rF)R&ZW5;-ud=p!uIUhw%3Wv?PNjP85Eq%~8oYKDg=Wf3~WD5C{v8MSlt1|Mf zTUdIQ-`y^ivMerjJcR$`#dGtzi5)B-p&p;to8{2)k#notKc z&by7>X?tAS=hgFHWIOn7)_07$kz;2@0sSE)1e)gufVEf9xaKi2Z zbcq6^$%^jK(sA2}E_AIVGF2XHCHV&)Ikd_f==!??!R7-fwqF8*b`(vLEdw|g7ND`olp=Mz8$}dWKR-w}vvI_2=*y zDqw*u)I)-j(B~0-GM>MgV1UVC+#AWut(k-S->l1_K}_+fW}?9B2tt#M28Z<-r{0}N z)yi5WB<>vXv2%N!e-BC)j`gXmCZJtXS5dFY{xxoLbj!H$${70k_0R$F`uJoKNY!v! z7IHSVnG-JaUS(KzYP2dE`ck}?osU}+5sX^u8-HC+nJYb%$G(fludLl34Pd-M_HH^o ze}_4AGD-HqG7p^U%(=h7G!*}#lPo`2AY};J9U>~owtvnLc+UD_m|e9L&E>Sw zg{18Sww*1yW~@U!+F|CG*bD|r)=C3Eeq+8<9fp2)MC2Z|Tfas(?1P$f&zxa9g=Jb{ z4m#{N?0vtlMU3H|8I;F}+@E>TsdnqB)OIlfUsXpUu#8v^?#Tes>HvD{;G9@Isgh6j zh3HwZkH7p4tMTh~l<%BJCf-lY>AlT+&sjmnD?uvTsXr%x|6eKfIJnL| zK`V5M*JS;%R*>yD;$IT21Qrub1%3J zZ)pyTSlqSWVvwlMOFMbSb`_K5l3ME3F)Q1kx0Y5+0UXc9-Hr}yMkRY?e1waK-JsusjsMdJLHMN8GL|o3yuWAv+kGBzc~qL+*V@Yz5&nkc{OzRb%?FVtM$D# zHE_h3F@}Ckdcj{;d1o2iT!EclN0SCl8}D(X%MSih zZ-lER5ZLgL>)+Vp@2=|6oNVBQtID%vxqXnKWwZL+*RV!MBPA;%jF3=JHr(Kxj@&TD@=~;Q@_NW)k|~Q^>nMvqI4)(AXX74wvpgZW9;sFR0rvwDCS!jFWYz z-cKWuKw{jV&o}A4hCYz}8neKryXFdHE4|o_^|LsTAF*rzz`w8s908$#YCT*rvP=7- z9>YZOAHp^99dfKtS;_aNY=F~MA&)+XJkLDzRsFZjcA}LSjY}k3*WARMs)qw3rq{`d z`pxXm5y$Nqcq`FATvmTm`W^$cmbzaaE?@SPvszwbwJv8)v;RAJ6|**p=>z@qj&Bg+)u*%K`>)DjfEiz^q(p9CNC-yX?8*0k*URPA9dGOH@Rwj6ycPbBTXbwfS z!^~KXi7}i7FK}Z?z zb%eJW+EY4aG!dHFA%Pd}2=$%0ybglt^*&TWVKW0uhx+GSS!mN{-CKXJ1l(>AkmIv^ zvpi_-=L8Ugr0c-Vw^lTOJY4!J2sA@VytIqOG5x8$WA?Yq_CEoPjE($gOp49)yS4mi z@<+a#m+fmk@!#fYCOQ~hJjlG61?6#rT*fhX%&7OXB_AKF&&-iI{e8IwCjME z)gu&SJ(*a<`-TISusZM`>Yygj5U>T9h$X;p$&We>=c(c{4y*>YiAExFEO2{r_2$&} z=%8Lp7AJlt;cH|j9_~_8=v>3ze_R!RQo4)MqJUF127O}f_uZVzNq|4%65xl!qKaxp z5|th)n^`ToQsTyAFf+3lB=bfnjXqf72|xehe7KKhTh%L?*u6yq05*%#3-z%uGmSSN zc5n$SjoD92ru0KEt7b+_6}56a&$g@f;baiEVLcuo0OzyDRryNAR=5 zb_-vTYzn+kvF&!%-FK{2aCT=Mx#kNI(*pBW%R{363dWHKQxxBuUhyZ!tolhpDNZe0 zsm$nFnBwQ6s;Aqv+w8&+=SpN`Tg!*3KPHzyq@t)R*&q0+{ zRSsV}GeJ0dP4?j5n&Tn=^B=MeSPWmxay+|(BWz0qMA{q+DzfYBQ4{L?6SCi zeTzI}F=#Oqp}oARU0xP=y_rb0zpDF_H+^aTkcu>=18F*J&Qi0?ZkK)q9{dAr3p><5 zW;!Ij0Bqg30M%UIq1)v93g)-S3VkyLEF?>;a*lfn#G`BH^P8pjl$?=Y(@ZF|C+V&lw3n4y7=;n_i==#k`RgIN=M-UR z#1*)un#*($ie2YKK2{Z*f)qw7?hC40l%YcWfaLb?6PvYLAwj9>c!d|nI7a{e?|d$~ z+M8w1da!w&4j-o2iNiwE=@+vMBP41#1b&Wnj(hw^yI zTr=^*>}l~c4B?HnDd zMMVV~qqiJ6PZ>hX=!hP07O$V3IHuE(A=!EwIg`u<3qNQ&w;iMz#M089&d>1&1l^?M zRW((dejkigT1XoKxFaQBF{QK1XtcNy+*piBQ0RZ8npJym-SDkBArm4jX?0KP4gqZz*<4Q zgkL=25&>poP~2z+OylAeOw2|bA&=iEK2bD(U#>R59Xce^i~7XJPjJEu`H@UxPi55s zfG~y-<9zjM3akTqwO~uf$3yE$jsa{>`83#V1(dUsn3PnMvB-~r(rT-nK_tt|^ z5nEi(`EOa1D%{fg=Cft^o&oEw?!vvgu48c_W0Ma`yqhKl>D;ZeTH2Ycvwxz^dlrBA zB}71+n&+79sf~NsTQqGOzoO11e;1vcqMxWVx3^?gyn_Ws6vM)h_7U584+ILs7|`$Z z^Z>($gE;Jw@(ltv}!ix|9(t%h=$sWtQHEP7t6iLKNa8ow*Ou^1p5eG=N`a>|- z%`8hTh1Fx0&2{Z`3j>4Fg{hEkN9o`=X)o1by*930!V=HF?lWQNo`gQF&nThzM+8+Z zX5jCnAEdOO3y?>-r1y<76?>5|sY}QMB7BX^jMLgk@f(#z4sEnWg2G_k8Z(Juj-WVf zp!T{MahYtFahe8m&he*TOp)jx%uCVTjJt|hI1$CCZ5&%fQr2**q2azQ1^-GguOE#V zJkz-UC@pz-*jDens|#$UR0tGv`o~ELq(9%V;YkrdZxmhSei+zI%FB!}4=w0aYo6ak zUy251d8m%HEq)e?TO`C#i<5QLSbccJ)atoO zWw<-?wn`|HEcyz>b8Uzf;!b4JW;nf=@jv8AazPt^ZCQ6jCB1rTJYweP`s)w@!Uq^v z*+>{~2&Q>>Jj$rY;#bDKE~4U3Tcy5^?=cK`k_nYq&0BAM#YMSv9@eoJT@T4{137=s zr=d0dM5AYLN*^CrZ@VYMlGLDi`+IH0Gr?VHW#zXsU@=S&q@$0jIUIXXxtpPk>FKp5 z_5LmJILyK!ZY}q}lGE*~)wb&y_XHJ_9w+OEY@{jnf4BDXeP&YQB6^px-DFmA?yC)T zL6k>|(Q(@r_o_#&$~MFMvSj*^3TO|7s$woUy0(Ya~_TkDml4v})1;RTf3n*~z4 zp90`QY7C3OGTvRdrfol!MMs-}jdh`~%!qsrcE@D}qKOaro`h6?AoX*{aOn#n+ybM< z9*?V~^cUKvFRbGP3V5WPZa>j)&x|{|T%}0ERQ-2x>w6aMmu2cBbWH;3L~CYph47j0 z=;B1omF!6KE>bHDTkIy3*^O$@j1)UrHgBd9u^8KvECeVPBB?;V3@QlyEm{|gdwUV# zAdhB;RV?9A_|$YuV=&X1%o+kBA%e@go6U63#ZA5OVLyFD^7kd?V0l6BYD3(Bx)Z2% z%?3K2?Qdf5^+|_^X$+B(qk%h__O(x$HR?J(nMu8;*$ayh)4nIWe6i7yaB%Tqm*Tg) zRLxmf>in_@5b|SAnuyTrIHUoELFU!U?`W4E0)oK^Q7KV)3XCK&O?WDdNP;L5(PQUE zU1h~USfA&+ajGv`ouX83NIwg^uhQghJUr-V)ft$PlPh$Dqy|cY$nvPoqNHL8I5d>4 z%gq79P8G3uq)BJBy~Y6?s0Lid>ncC`yF@yCnN2h+lxRJWvg(}~{SJx=sT*}#PZ^}Q zESVcoI@ANsx4KJRWh}HvcqzM$J3zA7)(dlZPmSav@q|7_{X=10`ku-6?L;Hd8u8p5 zMfXUJ8YUp3FQhZSWknb;T+X?18fpo%aK`d@Gp1Zzj*^clLHfl50suGiByfLhLmI8& z)0lj(jRZ-sI5{Q7yDn*qQ;^uFs-u-(ROvkb*!WU76Mh8f%`#G1Pt4=%pje_m^XP5J z4K5RtaRplR7L`Sl1*$-Q$ti6_YNWpF-o&Hf|LkQ{)Mfoa*whDAT3{QYqfQ6&o7!$=xkU0tuT zIX@lN+6WO@tCGW|vLH0EaD|Cm4m--QcBX0$A!rmwfH5Qr)uN6*_LC{k2v?#Tl@>qE z6o;#-Jy{c`cenfq&;4Y3)kWyS;_uCBR$EWJK^X}VttHS;D$5$aj1C~3@6o1L4o-Ve zLw)nTu9XRcmGxoW^g57Q4Z^t!^`dCXK}n^BKLrENOX-+4E3@2Fc=)=r+|Mm3H=2~k z%F=0I4h@!Io>YcH!?z2ML@0_ia@^R#Z_e1tb+JrWa-cywz)jWgVt z#&t{xw6=Qk0$RcBx7$zB!guf|a~R_r%zvmX6^^}erL`=yZCIAj%Xg-R){X_b`VdjF zSXvC8I|E-@82N}3K_oUxE;CrfXC>sPXY3A)a`i4=IP9MS{w;K;lak2aH5l^iwP`MZw^tGFXE%O9$ zwE}79{KPaub`?|-_Qpu)7n@V!B#xU-P7O&&;rPjai?EKr`iZ^nT;DH)R)Wl&e=je2 zy1(n3J>SbOvh%nrKN0>QpTdXK+0jI5SM1p=davZZPp?**cp>RsfN$VT_*7E>k5{$P z7{(}lN~T4ogJLAuNGrrGn>(c!Fc)pBGXVrHFl!Zw(C!Fqtq{Y(t;)H6ix~hQH-yg` zwn4+V9SEj64{fHEXOV} zT2+4J_+=W`#vHIdD+`!w0_Uqc=Y)oG~lrhRvz-4wpuSP>WCS^XtG%mOr;TD80olQoq)($KDMva87k{aRP>sX}iR6e5d zrhLGe^D6AK97wy8=nms)firPs#CZ?Eg(()$Qk=*h-{t(rC$DWiy+&VcLGe#d`ze6? z2FYXNCGy++zwk$eb|nNn#v3b(@KQw=LrY4-Oy|4xW=M#wQbw5c&n9Jmiq}Sb91b!U zCG)qOA)9;Jx;h)7EEIm|_>($@I?Dv$1#mRnwVt0sYc%$@sohjGIy(W8cy<=*3W`wc z@iJ&XX=|9AJcwQUMSQ)db5U=Wbj1su4~5_2 z%rR_tB^2PL6%rWFdm$?fKU~n3N{Ku zr{})fX_(AVmFNT)IiuZ01}9HWZqKlP(BLV@ZK+d2Xo``{Y54&$>jH~lcrPewWI-R)i*r@PU=T~QVp z(#?I;qFb_K*CQ{Bx&Quq zKeO;a|Ik|45ys!RDYqzT zWyQmh?o$-?v#{u-chkaGZJ`vcp;8`@7*i6tD0eeazhMSkLR! z^*r?psiN%3!;nC^=6Z>Sx3%RS9lWG695D?6+BjX_3Rhr!pm9K9nF@S{*~=%IbyiQ4 zF+vSAjdV6bMJ^T1LK<^RZH>_QLZ}F>r-IDo$cP_ipo^C+R?$&_`g5pOeT>E9r=WMk zyH3Z!XQDi@M8!uSngjqz>~)hZWycvtsj(FOs`F}c_Ol3 zl~r){Xue=q@)&0nKjt8-IgUcDhL;CSGehBv?-6Itx;J{vnc)omI0f9 z-Ie$~uutZMEro>Pa7lAf7I^?|V2m@R))E*iJPZyp3g!;{9fG(^rnTm_uu}!Bl^?dW1Qj-4DtX+05As~? zC;K88crg((-O#AW)ROr~&3Em|7-m6ydEwKz|2Uc@Pa=2Js&E{=<4!F@!w z)#|VkWT2l&ORlZ3b~HyYjv;j@`tB*m3~FETN}_5lOHLj~35|3HYZw*vPpe~bdul?s z4Q~72{y@ZawxZ`1i*N8T|Gg)6UdHn22gH9$RqmUt?fSCX6X197r}Gj+icAwb;mz+c zLX&_rf_>GucC$e!nv&aME5c$mg6c6XBF;`0@P)@de}rd8+gq`41mR`V)z~f33280& z7|i?NaEO%Kbl^6Eap|bg*s{*kLf%1Ti<5RmLRMAt@O;kER|2gx{rC{|*8W*{tZtP<`PI`HAZaL{NP(guv%AIU$2D!1_~GzvLVZwj z2m}}VOWp!_$)HM6OQ#yMHlkts59Y=Rql)nIO#Y?h@eRNBb;7=OgdV23Q2-A(3>LEg zo!O3Y3*OBJIE>+M08gRiMpbg7m7(mM4kf=3--42rbHrA8^8v@YN&;C}NKgOCQ+DSo zk1R)xGQ6iQ{58Sy)N^!+{3vnr)kTCHT4mTvHi@>tVT49jprOEN5cTeQg*+^A30dCh zO_0i~89ooycZIg9Ezb_5>1OG4p6IUtI;2W~1hB}HHCJ9Gv=45T_56AXo5Mg?Yr4>)j)5Ccm}P=8UCX_WL{U$#a2F?E%S*} zx5$@s&CfJw=Z!5@c<+vpMh~w9e46zX3UE-#7A60};_16vEB5|3U=cw#6^U9vC5* z%m%nbM_&IW9T@P8U5NP(ifR@pzKHS>Od&C+L%u$4Ut)~J%zzk>hP^0r;SWl`=QMemG;58be6lJB2JgQpV|7dCNU3?Zx(wem;Qc`UwsRJDRCL`i>HlJ^<+R|I-%IK;0_Dd`$a`r1f zl6VdD^(z(BVm~WwMU#p7*D-G8*Z_N~kDE0>XZ01e>h~7AH5FMMFZs+dAd*J7 zvLt6gN7};Cxxwq(tJ^k)#@5^O^or<)$Fh;+SQ?!2pF8<&EN;D?x(jMqgT+qya@r(E z0K3*5VI*Q$pV~)_VY}!AhLrR77LO;SMf=ai>X*n8^nb}{gujzoM_E0*2| zF2^e5ww)!4OjmE#y?f~zHy&9~g zENp;eSy{8Rn;M;^J=B;Ld5r4!#>_xQt$yK|&&jgS^sLOW7C?N87VCRh9l><2k*)5R zLZd8xT-j)CBP{N$xP)a#oYj^H!iN)08=4H1ENtLM+gK}*LSu-vQI2-ErzfPYeD7~D zZ^m9j1SP~M7rnQ|@oZ@u%Y{<$u{9Cu+9Ez<6N%)t;bmn5QR8KXw3$SkkSMxv!XVh-u7&Z*s)PPDKn79+QY z-{B+(kGA_8m-iucFzh5wNGm;-d@Dk8eJyYs+;>7MMNdHZQZ*R#V|{iOh{bKD0+LDN zxI_+J3#u!7AKFezF?cXfVcqj!KdBK))Wdg52wk4icbQ<;aKykPvMtrc0ZdwZBb7<<<*ShPgQpSE^Lt(zUH4b7Qo zbb(Xa$iy+zkmu;KnOYjoq$S#kEDqRi7fZ~IpEG(zfm5wE@clNgR`l##X9u;0yM};vG zyEcT*oT-j}awA8>Pd&%z-KhQ*KGt_eFeKu!k=t!mVLE~rY#l|19%W?IvU9tb3{DC& zaQMc&M;NXYl#Lq0&9D@^zsY*hKat8TTwmloKsrmmAD%r(qHQ#RVaOr+p&=Mz<}|9Z zQ5tx?RFe69(t;Y$`*gUq(j_rA>F0~!*n9LxyxsHVA&4!i!G>q!Bss`#)j9Vcb)m|B z=gy&7q+Uw;?pn^!t7Lu0;p z%BiL8+PGZRT5i>rV=`^@5GpYMKXU^h1o~<6K0s)m{n-2Q*6f~AW(hDy8aa~wiiMuL zSM^_v+=x5_^GxqwsRIZ`jl9mBJ8_Y70dH&96;p9)Sc-r8XxD(=&5WeKBQ-5WFc-9V z_(vHbd`gtc5-Dv$#hB#_IR&U)h%~v1T`*l(H9bA`Onq{H-E`IcPIf{B>vJ$Mc3A1(IsX zX;0iqbo;ju>?k3Q6*CKoswOfw|tKw&uETdGf33K`W=QTj>W%E zm&2?B(4fE_*JMvBqQDXhCyV(^Wy=etK^}hkWe9{Ubf~KhaY|KDIa?`0nlIC?x}r<* z*s(P#+fhIY4O_+ydM}Rlvo0l1)RD&+)dv_l7j1j429Wad2T4!GQ|k4V<;C;X`nY>> zp#OAGC%52*5;5^BY_J$j6pTX0C4qh3&R33pkqfI+Jhi*pZwUN*{f%7BZZ0V30$t!W z==65wF5so1RL0bi8jN$Z(N&Y~q1};0vsJy>>-F&=$Sr(BgGxdwaB^rE1=p+wf5x`T z9pj4DzyJ^Zg$}gnw7_1IY=XxKj$O{^_NJT*k=V!^%w@&S>YK2{CoYoV+<|B1{+WOZ zn5E?3QVrO}O$y2++7Y?z;u#y#8yU!`uv1L@o+6z0h&O>NGxA!OqUn2`Bu{~CF2z}* zWsVvnJ`%^e;4;=jx}&E}O;$Ogw@he#EolB{jukFT8`V||RWHJhcszxcdI<&3Oh=Xo z&ptpy#cuocS(EFVM@2nah{YM-b@DPv*O+bs0=28MB0R>mIg9wZ;^{Q?H$F2Bb((e` zv!eZ?Ab(gv%y@8SJ)0A@BPjDP*{+zJn1e>}11ovD(fdK-!yl8iwvHpryMwV)mGpbv zjGP(xf3wd4?XFOJByNhbD#68|-T!bIRNtHx-EPTA0t+0cJ-`b;8k93=FAhXk2O-85 zH9k{*p8T<76Wa8RrOo6SAitI-`=6dTn10#@_vr0=T8mXS)BRaQGuC4AB=3bE58F}$ z5&mihw_>EI&r!2fpQ7%5e^LT|bLELzOAm}{PNF(nmKVE80@t1KUW0{YhrxLDJ=n%Y zYP1+>+TPmsVN_LL7%=qAoW9L4L`7?BMxjtjB>>;el)NLs87u|5T6NU>G0h9MJWyOb z;!99Ti8#XACPQeA>Hs6_kEfn8D3>1wu1xPS*<1lt}hp@0S+g-R=suBlg|uu1!pMlK({ize<^}h-R`=9yVOf^ z3Js*inf_k{o_g7DI*n!=z+AMZ-;TzUtHv8gfXVJTwz1jcWQiOYQLNcHLyF+ae|=)2 zIL3fUz8d*Jc13ea(qC4GwZgSGtUvqAT7;JA5#T(X)gg|+lUqssvTAkRPL##q8!iFH zb_Ck}Au7xBpRu@!MxJ8Q_iy#z0$72<3!}+n_%H;tE6fd{<_3gbU(rB46HWsNgE*YnSZxaJ1}w3#F2I-41ug98zSI`)qV4KB_R1yo?OWmlx^+5o9ur<9 z(3k1Bc);B^{~7t0j@fz*$Y!|0g4a|oIGgi}kXqAc9Qvo}ol zAdr%!t-X*#UASJ9_*!NxUh(9JCD}x!U?w8>xgjCB*-%NF+@(pj1l(2-@Ywq$4t_TNW)0Fyt2WhZkcs z96AP-;!rz;Mw4dMAiAk;|tg_ngWavJ>MUjC1$ba|e4WH}mK0;bo_npu< zzPb{a54B(8%Fyv!aK-)WmqnN~fX1RR8`a+;f|HZyo^&F8cnPSz0l*l=qV=dxTDr!- zd`9cdsg2eKf|0~LvJkUbGO;FW4E^Na17`-Pv$h7sc5gTd8*RQ|6>(3bJ+iGvA1F{g z{H4a4!nEJ-_m_b^l2W>N(+((%77ZTPAJofzFvtPa6w7q9X5o$SfkVcy=3`+lWNK+O z5c}h(#~T-DJ@kkBmL>_A_O8NTvD;{13s{txlotW7U~O{(0L*8V9AVWV(ch9RW=?RCn{-!1a2g7 z-ESDYjwjdTf1)@Z@VH6nsYyf&@w@pAwc<>UmQtT2hAScOkieD(@%2;He7E~Tj~I;h z62FVmP)}WmOTs`gWjQb~PjY!|`kcG3NcNxU0T>ZjzsV za4Z>)1Lt{lVgk`9+X#=vLlu;*c^t8T1E;{i&oVsO5Hyh`uC4djVr&1I&&8B$!RHh% z=*tgko7TMW+)AT@EtU@+u6`^!PYZvq_jGi;YG2M+MiM$rTt%*+-)yv$I>CKD3XnRx z#aTw&vkcMCAvjWe1a0#iIp6Nc!VD5;K1r}u>91E#LRs{on%+QTkp$mD8QiE-FC2k_ z+3rj9%7|T|R0*QaFK<*#u*F$)kg%}n_YIeQez(wQTGruUb=cvU4mOiT6;IPO?*p{0 zpWh#QDe-gEZgGO_sSfo=!X`+5LxYJq5{(3fnweCHX0wECT|pX9Uv#BDYbrhfGrzH* zp*6Q3ns6Xi#7;DoNqZ}L!C01(G#kc9TeEUnGQ3N8P_!382MM{z-rzZynzp@i=|Yjx zD{pXa{bycXKQ1vm!*Xh~FOjo9N*N^DmtCKnsY!=3SS5kLeLlQ@B35=wjELcMXQFL@ z>soPqOz^f-puDY|dFF9@)Ot@TdR+eJJ|W2Uscq6^_7+S(|9>k@15#;(m=IGhEHz#` zKwg=1#`cu}9vxi}i0LlT%)fLUlSHtSP zDii^ank7}Muq+w6FZzDbjFkHbhA|jY6$zAAG+w}Ovne7qy}~U7uvw`ly-KVaptK5( z6Pm+3Ig7891k|KayS&8r*{bT=u5>`KYT}zRn(J=w#vwu^NCHC=$j+%H!8Ool+a+yf`9%Mc=8JtY=>LK%GVNe2!tg~FqL#j_pf~xq_!;EVMOhFI zV+pT^_NOYrD{{d@5pjAPC*y{-y+tcd5-5wTBoz)>I(WFMJ^hqNBc-sy zG<$%;vw%TDKR-An)X`JdV@YGi?+O-3j@$1V7+h6sJ3lu)>Edn1u|b;`Cbk3-L%IcxpEr5*(}_2h0=xRq9pqw%9f3R9a+gtZ{WEb$Zt0 zB0$p+9-R6n1c-Y%@po8L?jz>u0vXdz4IOgv0xhsBz3|dpcD9<3gjAj&N3yx)V!Ww! zFq%a)ny%grYA~E>NIQ(+&`hRmR7(1nYDK;q;$Zh=^tGl@k0z#B>JqT&a_6m&%0gT`g?-PXQJCB@gGWy69;c0vg}RegQ8~K6Yu0=OT3xW; zc{;M@w10+rj&MCYqwz!eme`5AMNUF}##>0n}Lapl8a1`w< zKhz(VST1E(sv2>7UoBNUcZgHEJsmurQv7)`{Xk{0HUa+Lpi_goX`ej(DWciO)X@_3 z_mBalF%ZgR2vr^c$BGYSS1^0UjIf@TyUyjW3%V6P(-tZq zw3e8+f=n^yS;^u_Cy-W&N~cD}j-u8q0KQ*SFSR^3RwPiyrvX}CtA|v;DVZRjuKl`1 zc6?0TVn~Z6g<#cyg=KCCFgBCX_0w6p@O&c!mMlgIc-Jr4Yu1>WN$fnd8XrhZvrHpy zY&1}RKQ!*#Bf?0^aXWhZGF+^fT&$Qj`bdM10-w(#urDJrM($kV@JBqDqB)liRf3E@ zzEC%~`DO^KlZVZ95WT$TL%BS$oKm-=)|w&) zn&QI)q0J=f+E2d5WXNUL-v|%Rj*-FVyUWPcI)3I_{R9Oyd-Oc*GAdlTAE6u+%%zn2 z6Q$elQ3(N)m}rliMSw~~XE}E;F{fIG8OSrcq(k>U3+KuBTAmJt#~&Ali_FK49sM)b zN~s@wPZ3Nl&IdL57%zVSFRk+Sa<4G|+58*6TGGHx3_~u^5rT0$zpr_j1~v6+E0M0B zHC0-db!e#49e%}3TUP{;@Nos~eA-%D)0o&MXMQ+0VZMp$7?l4O&f4->mV6utHvz(f zvRu!naX-7NH|_O6zXy1YxLgK^&)xs(Ux`AJQJ@Yz&2-6cIHDNvZO`Q=#&xKJj&{#B zKZ4>ue_lx{0nW6`Z{MFR3lMYJ4Ph7mGOTj1_^{g8AFo`{$t*7xL_x;G@izE(*e%o@ zZ7O2}8NM-#Q!CB(FQpS}Ye!mI+Gu|mIVxQ<6`)GIE_?bnOl@4iE7Ufq2=mbVr)LA- zbNWJMNj>2u8o?s$ZAKW%E%$O&5axA}uL3`NHJZlCdPUj8Bds0t0(PTr z?;ZBJg#Xkqo;%p1tGIdpe3+t)>Osl0$wLivTQ#nqJ;w(c&* z&Og16Xf`=};2M>a`oZh`ugi|hrgUoB1Mp%~w*j`P=lVVf>GCiGMZjE?ed{V2w8)}U zrG})XEck7wf6AYQ7Bi8c{5q-fOktfkL5(RgTi9 zPlAP|#nlm;r`YtA(OiE>1c2AW;y73`EM-$(Oj#Z}M%>T&k$odA^C^9LZ)XW)yu6-WG`(E3cv70?7pM4lNz_x0T#e`a)QODh^*(VBmIo< zV+cz0!@5vEER0pN)d-ke*=$y;D=Oy%4MfbeQO3SbD#)C2%PDm}tW1mW6pSR!7LrlT zQ$DCZLxTsyzAUEROj~8AAX@qv+>#@ni|>Z2HpvoHx~kjtMb!bc?pBi2|15R`U)UeD3ygYH8}%H!rIY%gx$B_@bS+&u26Y>KTnD0K?^_CJOU{g z={7mr#K%EdtIZC3@(5x%KLqH#dqw4<|3e6+lo!ksY#%vwIHaHsWjgY!vB7EPy{`5a zghnQMto0!oCXniN_P0_mz{{7h(-e*-wnph9;)3F= z|9akfz!%1>Tc*zdJ7dU#?DIcJ)KX$Qu;96b5o}aP+}o3jh|TR0oA}ykc36YQWCQ6+1%CHYM0Bw z>ce#CAI7X%P=ipW+tbCYcYhNLhJIw;Eol^gqb+neY$4gsm*=T%%Q0;CX0YWLC&s(ndU_UT6ca-;cEhImjQ6XN6EH*tdC_OJa33YbF5{dTI>0q~6WN)N#$EnHQ&`K3SS zs8SueZ2$W;p0CKEPMsJAoj4W_i8cA7j0#02%i-y$nj7@qUKAx-tgbisohD9Kr?p;= z-wo7LX{<+XE2rMf@ui7#H&*@4$*>b}zp_M+*xm12xaG%WyFuVRQ4C(Sj&P7`vAu+PqOV@`F%3eB$$ zGYhQph<3`MRtxvto!9TF2Pq zg_F?J{Q`GueqCZjH>#8qKXi=7Y+VDzN`-|i;corPUb`u3VNC|Xb?kKd{^J@6CNT}M z>#~%dhUK=Uwa`qWr`xF`UkxS;rjKIJ9ztL|;?4K|`1S|&o-0Ot?o1UPm_&lZkE#Yq z&+rPMl>m*;5e~ADf82X}AMRRVHDe2rHm-TD;1gQngiwCWE`XLVm z9eD-mVwiNB7rICt)w$$PnV)W?PB4h}-M^*%I!kH3ai%E8qUC4Y;8}yOOCn@qSBO(M zk=-q33JnS9QAXBFBooW5^5gq;9sx^wYC8or7ULu6jw**HO@Bsc=b?2`_NFlWG{IsI zGdp}G5}8O=-`adJBp@G8eB1h2yyH5Xa&~v<-|*mHFA@Yr0hb&&_DA?nduiT_$pp)! zc*y{I0&B@2o_(cv=9eL%b3r^aenDMX^KZOicw5~ojxJwd@X#}hl$wl)9)NA%E?UYb z_?n|&u-NN?CJ1+02}anPGN+2_V`Ge|bQn9So{^XPu(0eKKA|Ej^sw(e|OIKWa!zVVGjyr*Z`Zo)$JA zk>afe39q2XzK5deVZBxRP>63;G^Hb^R2vLA!~aNUVM3ltyJF&JNxd;eyt_t0tHva)0>pNf9DPB+<+6&lU4){ zW=7DMa|!uZDbXa*B{G zFpoCA$H(P@gC-^0i+2+H?SK(iY|=*sEu@pF{e06q6o~AB)0y>n%2NCO-*sA=p1wq- zT2>+%-)Gc^7>(Rxo=7+y+rQhEtAOarUN2D8VI z=g$qQaOswy#0pfX!ojLcb|4Fum7Nx1N#lsSj?d%eDofO zbG^Ig_1))*cSXOUQp$v$+iB$zZNH5e9SZ+JSbad)NC3G|r~muzhZRWiZ;SF*)hc`Z zuB(hLN`q-gA6&ZI2Qt~yY%_#CC69@5!$Jh2CInOK#+qcVO)FOmY;@LbpaYV;bDKA< zM)Kc7z{`T6WrI`ef~eyyr>{EV2D6SLUbVw-JOg$NJzW4Ta)uD{=v zhV{Cx=e9;Tv@rGG?NgpRWa3c(Ullu4#jO`CwUdjo)K zll4^tP?d{C=nlQdC-tlY&@=EZAhC%kD2C4Xbp!N-;oayPdUg9hU#3ddBjhk z?^#`XM=)KBS2U7rTJr9)E}_?`ifWGSBY3IwSD*VMT2Jhw&hwEn;1IGH$c{GYfK;W+ zNS}ZbX&xmBG+wT{B6h0~OIBAtx|FSs4@a5t&mVcT_ziy#-^m0yQ01u*zCDYM?lh3+ zOO>6_hGDaYlja>bGLh-8&PPW}_uVg-k7HS~(GWBUUo}~}J#_nb+&DP*Ytvj@!hpOvlB zgGmOf8C`gf7YaPG#obt^f0h|7tKFY9ESLpWS)mO-k0wh~EzoO;F}l@t?Y!9cA+V53 zM*s1wldmm#cHQ~`W%?iFew06=$&8g^$oMR=Nfzl_93uopBqzVs=`S*{zt*R`T?tr~ z!MCM=okEQ5n5fAMh$lgv3`fUuppV9dmBK0RBka1`gyuk+IZoxn5zSbc}FMa&e&BK-xYRU@atP8t_QnOaq$`Jl+&Jzmv2Aw8=fkQhim3XICJl{S^tB{S}@Zn|{3dxijHOTLVrNI12Sj$PK#p zSx{pdyutd(0%~?QuF*j8!#H;k7-Z@0Zz<#~`Q^&=EdjA z2nlhHL@1;wVQ#14xGn04EI&UUTt_U!xK zj6p5#-4{YZuX8v6PPlWR?uVavd@Olk(Gi_3T|<~6qIWe07MLGbrk^%rgZ!s?&)ou+ zJDdUsQE7DY~7yFpwWa4yxvv#>|(HspvWt?whfMb6(tm6wzs0$LSGN_QX&7(#&Ag=~U2 zrA?k_V<}k%I4FVr&^D<-rv}Ce@#GcmSpf>`^8=Lqh*xJL3t9&%C81lzV&q`#59X;# z$=shWt>DCih3HVWmv(DK7*U@O3+gSzmIc%XP&xo1T`yN>Qt;cE7kR*i`#@Ld9^0VsAU6|v zZ(E!abL@2VrWA+>AmzXrG+ZKJ$+y<%-Z$UXwUg-SUs3+m{E+W-k@uRD*;(LUStI{A zb`Bdq3e_?ER5ktcKFmTz&)&R(aK5mAnb63X>a&z9p*nyFhJS?p9KU*^260G8ZBv}Y z^oWBX@aLq%lCMPN@Whj;ap|DUx$oG&np)*GQ_I?fzrIc1%4f0&R%Gb>rj9y3nYR46*!v8a7c_Da&Dmxu-qIp7JC1Sck8{p~N6z!s z(b!8%lU4j{0`?K7)n31hnr>N9wx8ls_>wcgSC?+`llIqx)vM55E-oXojPPWV@r~E= z7|%ffe$B0z3y`Hf>^CKK@dqMp^p7fgqF9hat)M3p8=kXcfRknyz5EhB-`TM7=8`}9 z)ezrIp-N2LBr0TJ4r+YaGDh0xEb8i5QBsQ9%SeIt5BF?TG{M4&G@+S44nB-t0`|KM zx8piHyYtR%jc3oq;}Y{o?Z0j%|F2u|S?n7||bM$CveiV+Q6*`LA@7H4U(TSh@2s$EOwf20iJ zM7lMTy1C3Tm#wAYG0GSR>N7<7B#%Ft(4k(a!h@jJiky&UE^#jqpT(H;j|D>Hh{@#J zaFRIo(7e7xriG(?Me#hQ$W(xeZ0W;nB(*rkikkG@>yuJVV^hW(LAr%mi^_`9B!X5$ zOR)sla;J!<=QAe6g!mbuLV*g^Wb4v3#g0r3s#vsQ%p@u;%D9BHMH-OO^7G4_(S|;8 zdLcgJ*v%LCDxpKvX+L>3`JPM`K1z~d@u>AgTS+Cx3^<8(;d`+vZ7y0^F?3sSsOfar zSY2SL7s@Dl{(DgZb{TFHlPz^DdvH0VKsTS7(K@%s48VSZlzaWFyDndMqzFv&uL&9oqyQhJCrKn*QoN-~1;MrvASgiU(!` zN_hmWRWdxR0dzUBHXrN@m$oHgwai!WJB<5JDm}V0HKiX(prNgyuwZRc>dwV0+`eZ?B>Gf8e~DSbCZFeaC*vQ5-ihI%&65xV zmvlDOr3YtWUm8z4mkvY%1IN!6_@?iaXbB_!YwyYb+B;7z-XR8XMjzPi^h8-k%Rpzb zsI;~;N`C&cDE^#0c-{s%yv*e^82=uo6GV}A#dcdYk)34V=22luO0BmWWae{ zb4-+8{oIsXOItsu$fFR2xlg#BH|Mk^Ov$^I|UqORHr7(ro`g>hhhOKOd=w`*NU(u^*2SuYY*{F*d{ zgoSMfAmSvbkF0s6seIT46fdfSgtF9C$_OZ==j!9|a%hIlJ|rTId)BoI1LbR7MxjAo zvF>ir$*a?o*4@B`P)py9sWT5Xw_{(%Akh?b(a5i67^`0`NNF(~XV=3g7jik3O9&t} zqCx}f(&D=9t2YcY#oP<1Uk=UN@PPvH<|0YUqN9^~+gn1WahVX3fJ)5bd zxhHhKBpsxad79Bfp>BQv164OTt~Ihqg_=i+xorqzF@+RhyzcP*i!bg>U^;(B;67aS za9uU%)S!8ajf}ke`5N2pn>{svPB!4xUn8TnV5+!b4{xYv*%TBEc|005o3*q884S@- zFn3Ak3fUFJF4jc z%9mep=%NTPG^}B7G~=q2mwwR>ULk8V#uKHZg72FT&ItA}yE%jzAqT&I)E#Qk-+eQA zFtW^+u@_zwHt=$J{*0aZDCXa;F8ORZ#6<&p;MJ$CM8l(pJn;KZWaF-YLDRaiM-W$R zUP+S08A`jY)*%Gm(3Z|OXuoPBkYB9ddewVxoOxcHuvN>K_KnP_o-_vCL~cb`)UI z(C9E&bZTCtYB%P6c#z46rg-1({PEP(kX#V)?}-DxK(+DD@1~Ei--6j^KPNh1@OaBb zCRG~Lfm~%Ut&rhm1-nHinjbK_hlHeBJv)iBfg9{S#R7m404sOHOYWpo$Z|VIL~-c_ zYB7VAmohJxL6e-xru$ivNDO2Z+%QC)5p4fLdH1yvfcwPU6ft;*6W15R3x=8kT#@Y} zZ2D3jZUZw)yMCjHmJ0n2&e=bwJL78eqoeHryotJ5ox1Fq=D*n%p2gwJ%t4GyF zDx!NVuaD*Gesz6#F5UqL!+jiJT?u28!^^0SqVB1Y34z-qWnfi(zWJ{AI57urK`rmx zy9v%$$BWz|hhS^6ZG7V^aRd+dNcWZQjySf&Ve_x(pqFCwO{m5b4=X3Cb^}1F*W{Zm zWW1b30ncz=tPB<4k>oE=tJgQ}FUY?eVT@tdXE=2l^fOd1uqrBeYp*WyVZ$|3Extr} z)N^rjJWCi_HhQH;93~x~<!Ezi?xW2zk&nrw2T@CFt`elShZMw=Cy4esE9-J z?*Q?W_E&btTsEpib-fj^@yG2^{I zUnG`NjlcY)4?Ic(!I9SO<7qq8k{&e4DmP}bfs;iK_9odf%d7iBM#gABJDB(1qhHGg z#uE`3ly0C3w zlGZ-S@WWaSwSBApj0j&DlNXPMd+LCeKlnbwbet><iCv!T6j;}jf){Q1Q&j{5ipnhVJ0JI7mcsDLE z^yy>CbIZYa%R!G(#)HFy>u+rLZ6Ger1LOZ~AMMot?hTIl3;mU(M_?Q5kz@3ke5=op z*~acGE&IH7j|DD2FclCwms-qP(FhE??{d5X8u?|fRIkC|n!IhXv71uFdmL;Dv&u6%w#Z@GXq^!)MlZ^3} z`MRICwAyPCACsMI6sI*^UP?V*h{aYmi6aH zw$kuNu0VD1Vhd8iF*{8r`iVgQaeEh26BUQgEMa!0`+_N!iVKUpi^5GDv+oSLAtzB? zh8*JWgY7iM-1Zl1*sS1D$j92ymTJ8ULsEtx<;KX3KI-^8y@~%`{Z;9k5MrC%KN38toBgKS z_Aa;K+HonLkA>}Acx`}9(ZqZPsZ==KkM`=uMTtVOZ3I2AY@y~VymNzG@D2MJedG)W zkGGSKi`UJrXPqwJJ;D+^u?)Xj_1KuezlPyWV23GSfwE zQJ;WHObqnYRs`uqyOc7(b93*Rk^&Mm@BFLK&l#Wq8aw;4^*WhfQ677@RH{f+@HPM} z-r_x%f1#Sif1k~@x7$?_{p2imP4A}WAiMSV7lpGImrX{>U*o|4kW91n$zZZlT%Oq! z+m~4tSeHNQC?M>`l26ov9ki|*0ym6I{|K|8k z7B`s!zS0!>uST>51^XQ_u9c4Lod*fi0CbtLy1ckFd@7fRT2wx{s$R8FK(yuGas)S{HjIIk>7ea|+qG;C@$kWlFz3INQp;(ajm4}KMy1=`#ZjUD6|bS z$?3n5DADF4Z!5uJ()Tm4GSD`F8~oi@A=vCSc+6^jXe)VlIsBpdX$eOSWgY+WMwlCl zq5sCuxZ0qxtIi>DZ(KK%cC2)J0+NoiR0lkvlpGoBTgrIigiSNhZ?ozf01%84)^Drt zx7V#yrSm$v2fP5ZnAWsZV)sK?YEAyEa1F%bosS`vN?z9mH9LV@GGN_7vK?f_Pa#Z{&r8!4FzUP;v+#esro;4SHI%{!%PY>@_u~XpK(N=7^uf%7FsVo zU&Q9_kXwn=9S?q5uo)lC6-{cR_v!ri>iv%s;>dEz)odE+ z5KZ=DG^y7)h-^&Wuz8S6s<6tGYti_Nf`oiXpY6*KQb|%)Jnd$%r)X+auBjH=|o02jjGA)%+y}G-a=tZo(T5!=T0GN zFRG=a!k_uEL-~a?n^EI-j!s@Lz9?~L+{8fh^(JL(R?IXVT>aBYVQOP@hS&iA-{BiQ zaUJoDmMIO7;?K%e8`2~tR7FIa+B<(2h6H~2Q_x30btd0BX4WI2{=xhB-`0=!JIju- z{L7Mav4us|{N7;0y4tgF{5Z}A#mIoP{XFg?tzj(|I^2DRA6<$ct7lZZx9u-9`F9Al)Wt?KNeqVWKaED4BgPsB$bqm-cn z=he}8+#Hzio;^z~-F?wjV^1+x5<*cZGL}KiqyKUGp;L+sypHH@fO7< zXqpUz=MP^kDucqT1IDE7=XXC!LR{i!%YuJdX|sV?!j@|FQR8+sShZk<4&xdjG8^z? z1zIxG*&J+6NfgD~agafM-ya2ccY^JSqki$m$?Y_*wHt|Gw)Fud;MKCj{;YM<*&;=4 z*B*-7qcJ)dm?i^Ea1Iy|{2%~b-4SJo=`+2#PT#us4ScSX`xfiT(+)-hVl`u#YE;A*SS6Hh%d zHm_s8Mlw6u3OWzE)vsXvmGAA1suxQ)l?gr&n&lFJQNK5sfVOaAJojqu-iX== zMd%QVWa(TvB?CqbH>z5mjj85tk@HuRra|_&uO!ikw>r@>3|h8LGx&N&W)tuMnR+C> z>8%1l9fNpIQjc$CNYaMD4aIaZ=&{b{(H{6RVK6i z)n7@PpTn-x0yQK&4-ZUgF^f1viRfj%(CDm{q)Vy%dh#|~^X+2t_;PM1f7Un*_jh9S zY!GJHw^VBRw_IPw%UFCBXH+yxzfNrjM~8*JjK_r|mw>BI%Qe!adbARL483(;*of+o zn_ZiNU$#nr2il*vM%lAwYPuJ^Xl=%FM^m9cPdQ1 z|K3T;PfztoNF%lT6#^&5@kia}c>wc&$T%7n^5tm@Dd>6(=q$BMX>@VWPU?(8+^YcQ z$PU^jR5a|3Bbfv1ssVw6GjC9R)|8)qq9`K^!$gGIwCeD7x&s3~dn3n63t$;SmOC@p-JYvKClG1I5-{81im!PGL@g<^C~d><(hPN==_L(efm7w! zKz#}FoidUNMKkYp=X&$?zJZ%i@M*)s0-OJ@9{(8?yaEt?rHY&qLXT-XGFlQ~#%cF6 zoulTrw}gQbvY^g*OEqvr>PgEhp_9^QQT%#>_Tt!?JHft@WFacJ>2UUa_Q}2BM7FSZ zOd!K_diP99AqO`#ORYSDk!dD{W%uj_)l}g#qCpj!i{b;l_`&Ntvu6=>ysqdPuY@>N zBiyjj`IoYtrwK2E53&S&&mYwwe0UJQ(CCqYffpC)o8XG4Q2g*k13dLlzlcXiys;JNuGj9GfvC7OjxV?t$3t~kP zbd8YiG`@TDkPrytz8pn-d&Qbov3i1Y)DlR&P(g&Pn)Vh>hHl)9%y`bfvW}vhc_*Km zZgfs=d|-XzMqkkjl?zJ_5^q3=)!2M1)-X#G_dQ==Sr%^Y_>a{&_z#7qjXb#PP{*?$ zCknjmlUE6g^*c^pcFbTQlLy<0Il9C(V|ctduq5;9#IZ#*V~Q~2@xYo`@Vo^nmK{-8 zt6V*UQp2Cl4udM7eFBOdVK6vH635t_~lKsZbSqB~l~eP|QD*bLZILxW83 zMa^vfNa}pDgr4qC69R_3DEKxvJwZHxDYE{3y5zg0RP%tMXs#l&B;_+fI2p=U^wzr0HRVq4kh z!08A3)rN&10@f#6FKg}JBoL8llgR^s9^vHmB#zZ@YpZ*saNf<0SWI{}l1P>%FP7}r zLG%5vpX(Q!>rZH6)zt>4k_3o-8JPgrZ{$92$62SqgW-Fib~WL7nQbe{)&i~2o~Ti3g5{cv<~$k14a0yGwquN)Zkr`WwfMpK_jRprEf9@$ ziPzu3)F<&ZNH`72*wO`bB(1%D?@o*>_Noj0sN9Fj2y@bBzeoPH8@yFo zo@8sK6yD65^M-{^LC=Ym;cH__*yT|*(6VnVK`5Vth>O$m*h(N|8Y7F}l5D#e$_(~+ z`Gjv(IW441+oC2Bzg@l056DVRHzXuX_MR;U@V2}cgy$X}?=W}}=|&s5Vqjuokqt0R zKI)s$@@o`I6@7+n73wq&H^>{b0b8s7jpU9aZYeV(R@abCwU46>p;zCR@D2x3cK?O; z{Cc63O)xZZ<&becTpuz26%$8^vg&PnkH4Uhyv~m@wJvsVeZ7>WyG&on?fgA)3qlO5 zNuF!;xnYN0Y@aXs^hD&>dYlkx#}-px(J^?ucnVk%32@-rcKdVy37j?O zw>mD8CYN0|By;&LwEeO>#^kT{d{!a+ON4Qx2nv7Q4U0o5w8qHVaq@@M=6J9wj6raj zV{-(vc2M~{esE3DaE#hLez%X*YPrI+u61~*!Ui9dLe$xgU+dub$U)qlMCj1Ti!_sqgF%`_M*U}Ji%h!7>X zkT8ufcmw(?UpnzsF06uH!e=%xY3HGXN-v&atHS^zLRTi|zt7BzC&yj(cJ<=EU9Ic> z0-s){ow&N%Kc4e7_d(;u&$w?tA3xQq&I+N~?z@5taTm8=e55VaKqLwJ+P;%6v9~2R zdVwc=X#PcGKb)D)U?^s84*L1(oS1EM(}&Cv0PpkPnw!yeTjoXBtjq8**%r*kXBtSu zVdqf((K>6JC&3&T!Z2P)$!H26QQRA{sQ3@@w*wUFixyp^f0MHaef4&FQZGoMlZykP zu1ViyMd+2R*FO|g4>#B^ya~d+&J?zG)s8CFZ5MLL){L=plK7Yj-B2muXA`hmn~8fl z5I2m(a$ZtizxcbK&v+Z!N7fK^74x+0t!wTcK9bi2IISaH;-MS4SzunQsFNy2M`Um&4AuC>)R4@|UZ;N&wduml78o`m~ z4V!@m>{m&8`eYNv#pT0-Sivm)EZv*0=>WOX9u-UVyP{6AjgQND3rxstQ%M|}X_s>= z2pdn6J4#FdL3;2<3{Cq;y!Ju!BOrw$x6qCW?M|XCv*i%Bd+b~kT?UWawzH9kSe;4I z@#0qk?`|@4&#}nk_cJ8mcapq~FJIyBV8lkhVuQlw@fikvQHwt-lG14Dpi#*{205NF zY=EQ)d=SV$VydHMlJcR9dG$h=Y5U^nX$noe+>nB6wZGH>M~+Iu)A8(^0g9_18P7np z#Czo~F4^iSmI~Xexzh|P#iCrsJHA7g`15}W7?!b}s$gOA9G1p{7PG&9++CmDEtf&Z zuS+NRq$=8wKAPyu)jtl02`Zo`rauSzu-vtJqgQ7$iO9dO&TlIx_v-#)F3eqjv(-VZ zDsfg~nA%SX;4cO&_2disGIe*0d(a5Z1V6#1W_t1(uJ{asMd8+I56D{uft_Q>10}D$ zh&|;w$o$Jv$8*My6k{~)1|iCUs*1hHk0N=sWJ1EJMx+ki5wnRF;Zgm&-b?&k4S6Y) z!V8RCfJK0;Z8#^_yUNuMM;$tUbSbI*cdU2i-q4;CuN!g3OG?IY)2j&|3FezldvswMiYV4q6jqUjRqgtEIZhy}x@rAx# zZ@M_~{iCt&DOy7LdC*{{8*Lyg=dH3uQ5C?#nl;ZKt#~J`B)UV@O|r@<#7OYNjtU<5 zEmu)|douediw8u+#`9;*IcW64mAuWw@WWnqz{#Hn%OB}_fi@?zCI0I4iPzO#-6LrqWtT&JHH7`uNMSJzf;vIObP{D~k7J-^67pY}uS_oLFDQGI}iW?(hug7I3No1l}1!GO8`WF%;`N z*?}^ERApm+CnQJrg39X37fWU9%zn}xPAvm`_-RRF{f7b(x-lV;{P$AH)pTFj1BO*M z1u7M1sFq`WHCF~FPGkDCLxc|2Nnx`pNlPs#=visMWjl@SkuF?QQ&-)SvEBm#T<8xS0~+gEz2>bugm0W zhsANf67pPDzh*xWTc%E0()<^2aYz4d)B-O@lPCNFfyb}_^?(2txkc9k=>DGC%|KjR zUOm4GfQf>-UFq&Zmc)rhu8?a8Osa+cLiiLPkO2;BR9$XdOBct`wS7(@>(3|&XsPV< zrwATYi$GD^vIdM}zKZF#>oUY&zyZN1ti{f0)c~s$1 zJ3hR`oDqyErAt~G)v^&7jgkRaIKA%8%^a5nFOF0dTmS{1Y zB*}(1@*>NmZPGbwgzXQ6xIuamjQdzW1XWTOzD)Tzi51*y0~js96%Xr20_<{d8w6HY z)5t3m1Gh4pCRil5x;!gR5BLfG zH6q5uYjkdu5+uxY?gjK1om^YgrEY2OkI`TWi_qI&{s7TA5t@`rn9BvsvDS3gNi$7S!{fz^h(nUkz8w>&4C?n&6RsnSipp0M^ zrQ|Q|6)jz`pAua# z&QOiF>mR@Td*jv{tszqCkme&aSA1uUPTFTH34L!YH}3FpUrf?7rDS^K{37aYB%621 zut>CFLO%lQyFu&NNw1QamI&2f+d=$Ux*2EyRDNRJs)(BmB_%XkR!;lMn#j1U^3UL* zWLfHI23%_BN(u~s3n$ua#(O>2~c)3Ql3G24xs=!y-K3fvQM}A^x|Ba$EY?Z5%o;hLXeS)D^VSUZeiw_#A`4 zCY>e$<`7JbpQxxiTf$j@3?wi1TO7xG=-r0nyv(fD!~wwI_TlNLoM1f4+UF8`;o_Z#~z24_h|cnVK8Kj&fs5N%l3#-}~dwCdu! z(&X<;^hs1y)x_M;wpfkCTRWc$53oq+2;=t%KV#~e&QloN{;H@<_xGIQiLag0Tp<{; zGF^En1a9<;Bd{dkW}~&k9`bs_hjwy63T4n)RE6PFY9@SEA&vUn2pOUoB7pC#x2%gU zQAxUdk6^sJx!Z{;Ew!oNK(1lki<8Q+GduVEgK*7`D@ej;57z2-Fnvjo98(FO9wGun+B%uxRch?*VO#$?Mgz)Kkn< zbv4C(8kBNXBZtIXZqKYL_#C_~^$#jf2UWcCxG_Iu4tg{3ZUka}BqBFn)&{gHy8YW; z9#F96?|Y8DJ}pXxS#*=HG6`h(CA0us(ZL{>8og3ZA8W@B5*QG(N;%WF%wvGpT`y-) zqdLEsz%(i>!{{|Co>c9Un|d*FvW;g-ilQ3jcvU*mOHj`X*h$ssYQCKiD&07Z!iKGZ zsO2w9iBDMu@F0Y`;o6kl72-lwxF;V+^KP1dW||L!*pOd{@ny7h!W50+_(MOfupj}g=NhDFAVVF-E>seHd?mgy*HYe+9W@NaMXhUg zh#oF=+^mgqaXq}s7_?58Qyl(}*z3uR9-r6Zk*h!C4Yj8e38#O01;cu}=GE8uRXjQl zip36FcCs{!)n&Ly1u80?@TZ(#H}d>=S?1HXh@(&pt7(#Znw?oNYKpuka4%Zqy2~38 zev2^#BSbVrp6ag?#Kb&UYlyzZ_ykB>&T(=gJK?ksHXCDFX5PwdlfuEohy2Wat{U=$ zsqjVOjT^7cz?he@_2U-|)Ks(kNyvr$wwa(Mropo{YYV0rVh| zR`3;*-Cs+fk2f7>Z(WXpt(!(*L6-DX3Fjp5lLZN##$d8vZJmANHZiN{DtYrk&7KyKUR$a)63?e`f1=u{V4*ALSDnuWf7Y>(R&Vl%{qDa<{x3LU>ad1Xe zZSOFCCqs!R+~3`n-rO_@!5;RP{hVKdX=21LL_xF~p{Eckj4;$bkZ&>Du*qXThFH(|yn?Gp z<)L-EOUF`GN%cR|kwg7|lv2y-%(W1BO(g~I@{xn#Zy6RNlvj{m1=+nInVh6!eCTu( zkuMK7_EW4Vb9vt3un|F`A?VkukVU3PV0-|y)sOJTu`t)2L#C`2Xho5@KUv@Z%88*N z?@Lg+M`lF4o8)q-v`j3=Bz!+^c5!*Bd*U`eWHTZjD+33f(rjAkMqsmzJLF7A6*6&0 z)vmbN{h14A$YUELE?(ZPlImG^T%$d!hGR+zdm~es)%68u}86<6Xyuk$V_?tT~e~ zaa_^V4THgQXZt3_EI@qr`_Sh`4THSzSpt@CZhvC$D*?|VgH zyS$fvy8rYIb#c)tqgqrS2s(iHsH}*9t$~atlw!t%3~v9(s1p~h37HKVOMbEIk0709 zWx>B1_i&V&yc%^PJTW)djZLAD7}?-HK(5XSyeTQSRBk02`gk!G&8ZqId+)`s0s>aB z%{Ujd9kg;Gj(TGYhp_+;$N#z0MZ@uHse{V&!7`)UuM#9f@#qhtv^ zlq5)NYl`*wbHJ!Qomck7E28A=Q2;ie>REH$`>)7vBS~c#;go30x;45q&=511x2d$pPU~qm zjc6jB$(rkK^z}ubu_>f*PI@qD2bo>vHl@dak(l}bp0aiat%=dWuEne9y^i;f*EO59 z0L|S3KdVIOk$n4tp@VcLGR8=o||}Teo$O4PTwFRm|n!sxwRV4f-CN`<(yuF7yFxgY*+@f^CFpL!5qV& z5oYj7)8+njvg_$4%gdob+56*WS%3&NuBK%|_a|@VbYYIlAJqXf??Qf7WPbRSWJU+d zO|fIRkobH4fEyw7&+kHv99>R7UQM5{9YDKjsSgNqW_#GKY4Lf! zfLYzSDo{$?nE1!&4mY(~Uv9N#)MMM z`5y|7% zH{f4Q@vOSV0u8o5Qqht;R<(ec@+Sg@(AUeJrWIEuINv)JBsZ^dGygwnVEy>%)!kuW zc1w1;>_e-bQ`dg7?0b~t`pX}Oy=i;2l|=p4A&(@K&~y96pS0?6eLUp8A^zd~&J#mq zDe7v};;~l?Kj13W;L?EI+?4w_F;`^bb3Bnq4{T#^XAt^`T$7amEX?1YC#q(xGk~Yg z#{Es7-v6Jg7XjVdkrk z0FFc99#;fO0_Bdo^;}BkMpstM-cUyozbp>wznf_MjZ2FIeR?$ejg!H#6uf|z|LX9a zcAQQ~CK?Dq-)P2fla!3FWsty@ztTRXXpL#u3^Pd<0O5-{ygSz+^>Jbn?A`mzmrxrO zMX=0!N2F;iG1ukAYZycKgvihW%)`=sJElIz&oxUSbvdB%@A?U{o;G^!o7Y4YA!vk|^CjIFIVi`KW z4swD9wFFbsuO!}uDUsApHFChPL%)3_sB<6VUB_OR5F!DLyXywmg6q2b%JED8X6TVC zgjSSK)V>UhvVcz9k`>Sk@w3V{>1;WUf{BEF5$SN16J@Z)yd@YRbpX9zM9RRb&)RvE z2Dyyno#v!!n`r5&Pt*cV64gnW1_N3}(V2wNQ%syJE?ueiO7`iXSyzD^AvSxgX1-g; zfoSe{lTQ}zN*&+p-raswg9q9<%8msFRNpnuyd~~;{VzpzgbmOvSB8JXdRSXImRB)yg~#xzY+gSsf(&Iy(+n`y4x-_9 z1priE6%!kvj2+l!r?r^`CFif8-7H|$wf2IMr3q<5cMOPuZG~>(L+}le)p0SYM#zxB zgs{^*`8%Fk?L>em>I+u(cu3;M4<4%)w*cO#1;C=W5Rige8HhW9`8Pg9ryGFFX(1H= zq_BH3bN;Braah+wv!C_^>=)`+>uV1Ih5MA7%S~!JerE#=i^Yk^b9G*H9AY6SvZN(j z6v3z?R@0W4nw~h?JQ$^SpOu2N%T-BVwPMeeM_K^%xCgkaZy13$3JdT zO^)mY+?^JjB#+gZoNQm9weLn1!8n8guJ^t24;6)lH=G2K^=WK#o<4H_zy6`A6CAk) z_{EDICCfLJUOMS+csl|~;3ujR=1a~1!SI*qAhtvn!Dt|yz}N<$$_AbY_VB{Dc_ODD z1(ZOz0wg3&rjyGge+@#4n1mz&-*(@V`Dr7H=gqap1_g$p&=`7<{V9?FANwuYrJ{He zZ30!2j7HHmp6t_uJ{riEd>^ZFG1ub-vkV|06Q%9_W`%O>5)~aX*Wzd6Yz14vBhN;* z_$%1rzs(Bz@ps9-D*F3p|8Sy73O0C@GLx^Kg56=`cw3zh;uKQh5wIym2om%X6rCOJ zTQxl`auLVc8PlG2H9pJYQWN?U=e_4rQu^yX&o(L*hADe`3hmx>X{Np)D&mEE&zBou zoEC1it=&1oK6D<1@O@(~dv)Ra>pP3N(*4k&4As@__`&;>oedn>OCW1>;U6KWOjqFA zy?bo|UpD_n?M_*#kHh?w`Iy0{8{b=^a@)$dZux(P2y1;ATvNMM^0(MLoo3&EiWx-a z%vUZ6l9~Fh_?WvfhW(KA49R;2NBvDk#!fn~C~lfhNJ*5GI|%)K$C2?4Z=o*yWYs(K ziUy?$?&(EQ^=kYDudkzwZwJIOr7#$JuObg?)=oMs5d@8mo9Q(*!$Zq%4o=nxgfC?6 z{xY+snqyrOK)=j$s6kRk*9oeU^!QQS&+0FvVf;^bfZ|6ym}Zio7PD>Z9pM1X z+25A?=?fOzLm1GgI{h&X@a|LAV80*eGhJPJnh zY6y>Co125N{^sl5N~T&&zPOM8BJ$MSlE{A?+b*0Y{YcXm3fn;7+?mfE56_g)nOR-CpDNFRyth2=Y!0#sh*_-5%(l2l$|4g{Z;i`IqHFCC2%t{zguf=GF zd0i(SypYKG=H-(&w*bWBZxhbRK_V3Mx<|@CYodcG&X3Tc#0m){AVbj=XE~15W(_QX z>cxk>4q4@YPG)a$($k5pvgeyqxX90$V!2gi?*6nTGWw9EYlQHb_}mT`Wr^pc)(~hF zDYtp<*1uPK8@eYvw~djy7W{tz6hZ60g{ElYqL)Ac$nWwN1IB8ipIF_sS`0s{MRTqI zpb^#s&;efd6b?osW@ccd>p=rj2O+br2xZby^00oZ@nvB$w3}DQ(v|_)Dr&1Rc?Adz zxCTGQ=`b0yE!to+VO2Y-TmT9Xfzi_jK<&lffRP7Yz5~o0mg6{Nu8raaS*l9f!Hb%M zw)u;?z+%hD5w&rnLc&~TvgDbZJ;4S)gCgx%rgm!cX2YyGz)hh?uyGunTw!b8ym_%f z!B%ejyMer0rUD0CL!~c-?E0|pLw z^sY~S@_X8Fu9O@O7ohwu7n|bpi(Uc+Ais-StOXAF^$~E)6+6C13+#L?c)j&k#)8hD znIelL3%os_S(E|0UOm!tO4+xv@thAJbBS%n1_A>h{j%`qRhN7QSQ!ss>-^II7eHgM z;k>-F6X(NRVUEsTl~;x4ZPtt_5036XKrG7)1}p2|w_gB=(lN$3uuJ3I2Kc+?bAvu} zka)vm4LNp-!_I@UZ>!b3_Uz_+YZGFwVwZSQqsGN9{-Fp25{?OE~@Jo3*7eN)&}s{okr zDP#y3TP1GQHEqzY?Y<=?Sr}m5+JNDlvOrHF` zp$!c$$#8y5awu|Mzl$}exb)(dKmo|_;{Ix}YZMsI)fzb_G^!o~+%287T#s*(I zM4=94fpk15i*Tv#E(>p#<}k`CI`;T2#)n5P?b(CY_E`gC9uOT5%y)nR8v@2hVi4Pu zok+uMx=k#pUiEytsopOvlJhBMkBZgj(wF3wfZuWOVtilxo!^Szki*L5tCFvN^{Yuw$qrBk_-pFw9PK`g+*%wD4fkFajNT2}ZclbbPajR}?X_>rX%a-3z6SwN~ z0KJyO@L-SjG&W$Oeg(wvwnjAz3v;Q$Jg9iFJ=b9c01^EZWGV}t$$=5&1Pz8(odZM$ z7IHO5K5K!m<8gUqQK#xbZ*44gXBDT2za4VvC8dm5VHa2VzEDwj0wOc^3OOUO(cm+7 zauQjv$Ri^F4^=6EK}<2g$9GW_0>?9f4DI`{YQHn^=jG=_D+Xe3E*y(|l4@2FZgwn@ zYBc~E8PY!vWNbE^pWEtnhc#L2V6SqI1Nj5+Q4k`NgEt1)Gq}(8T*o3+iFx3v=~pJhho+v@#6GimIC}Ua#$7%dLAHH3|SljVb}=^ z6<~*Ikl#9k%=rQ`PCwD#n*cIkYsW5wq?2y|#sIeSSQ{h(AXp>|G{8XOh9|06#3Y$|Hn$4QL?uW07Z0*{=cnvli-5CKX!Gf~Y7Ac;6^JhVGKp=RSH z{LeNYC3UstYc;iPr~qtLX2%8$Ibf-528L=*YyePK!wwC$k<=s?(&exwhd5aa;Z&D- zyLre#0}OR>7E@hvrjyMYpu;x)$}6uVN1KjBzc^UIP_1H?8(8EpKYgSnp-S`2HUR)F z`L^?3^=8XXR>F1M2j4d~8f*~v?Aeu!7TRdNSFzV|((AfBa_TyXJo0a@(yc4>=^pNp5yD9KU6T)Yw}0Qo%ctro;67O`j7u21ei zaPW)W>$_i~#kLz@jJLFzr)`fkj|vZ!A-@w_3-~y>L%uX$9>~viSYDv>*P5LL0BgbK z6~G9!bq0Fa`{GY_VXL2M1Jy9s1H`cSy;`IJ4zfC3s&StXP{U&FC}l6|JXqMHH~J+# zbJizLTx>`H1U4wBMDb=uYhatYRqHVyRMeTbvFDiwKF;wbqXdvr;d=g@>)+e6@Gr)V z`knp(_p4N9(020FwoDO-G>+FQUo%gGp4o1UF{@kLc_U?}Tuli^Z9U z9=7Z^WFPL;qe1r}&0|hk#)``F1gEykMvqBzb2qm{y3BpM(=v_gUtgDINK=(E2ovY^2?GB-EwnubL_~`(0sHgEQ|0dp7&3F`cuhI9(-W?+V$&x{^`$s>T44x z&RDLoNEK5Yg#-!-#ClSQ;oKzv80+l8a*Da7=~&ZmYbBf@hExf|;m_p=?RjifBI-%( zZ?5NS^(>1ei}9NsdB%C}qdZ-#-hgQJZ8tdzwJKBwCS-8LDF~oo%n@>>@c>3_9?J9? zl`iAN0~hBil2q8CEAOym5cI~t_FDi0RW)fb*_6;XfPqY~o7zFl$vL8b!hWz5bJ*KB z6F?sL+=rdC;&ebN$C|C8WuBY|Lq=81fr`2=^Dg(MBwv_WsO(o;@q7R^$AzS7CW`K-y6za^w2M@)9j=CB^1c*nBNRwjFuB#$B zueF)6C)JsOa!vG^F+?+DpO=pf_Itd8_`RjXKZoYFF< zy|)77Gc+QZ`Wh8Ao=f(08ThKW%0x;=CBGDED~?9z+$Hbgjl#7BMdNfR#~6JaNhQm5N0pP}-J(BLq*u-1_4D81M6q%S<%t;@Kx-u4Sz&%q1Gmw1P(-{mdQ=@V& zHb_!ZvJt>m2@AxVnN13R0JV!$geP>SsRLM`xC5TQ9#cZd9}YA+}^x z@qi5X=wy~C#W}q5>S)@}XTUNuJ_C?5r@GR{A+zOs%mAPBUUMDy0h>HFT*lQ=miEC0 zfs~+(jg1Q2n6VJrmHHaIIYai`&)A5G*?I#3;5!`3j(rtslV|ea{(Z^DP3x0>z57TN zJvuf^Y!D-goxqA&Ah(&yT6;Xo@#IY_P4(Mu#%1Z)x;SymPl4<#+KqJB=7;3Kmo|- z@BnC`t2wxL@ASR<_WkC`wo@OfsH*6#MYbGPjM~nCzyj!e)V5t>m$Quz_5k|;1OW$t zJa2fWXY095`ohd z;{-VJ`L;RF-sGJJW;TsX2rEKG9c)?sU@tWoGlr-#MGUSEY^RLh&ReI!I0fD~C(F~F z0`h6^@)B##HUnmd03R|iGj?2VfPcndJuj~DCc~j&fSFT-qJlO6o*vQZ*?YV&V-7%- z{=6we4kX$j(FY(_+r1_!y^TVQP@v)6L$S0J8dU_!s@5D$lF0kw5ci z95J8FD?9F;+TFi*PqKc)>v13H`-q+qob5(PC5=kIU2)bt=f{qvp#Jc~561>-*38*) zKi95%J=wPXjku@Jz4$`hSK4V%xE!F&{RWU1Kk{hOu6ui%3Rqk^VtC8LKYi$tE2m%e zS5v3YezpMQbNXjpob&;ZKmo{abCb3BmTMuJu>FngpF4Ww$S1W}57gpSj?EYqFJ8`8 zZ`wQ9U;-nB5dwtRV4Z%^AvpH3ey^XiJRma$7%Ce8`X@6Lzq1+W+rM9^8SBK3Nj~8? zR>nus3&u{$M9;^Y2PfIE^Hyg^E9PT0F&h%XWl&$jvTs_rDAeJ!1yhDS*6EcHr*MSB zdpOfHAD>gE8V|jiVobICagRKR*~KG0mYN$Yk+W zfE;q6$VSfFJueH!&zO%KIjjv=YD?#jXW;1JgON{s)8-A~xOeo>Vco0ENzcX}k;}Wf zsv^sWo-%djfs+^h2z~nXO;)a6mF(QJJNfX3KOCD1OdOF^MG03XE3;RhUcDoE$x}}} zDfRX))vunGELgO#<;Oq%(L>kWyx=d!jhnWt0Oa?21t{9PP$f_R@>|?FRMlEMhYOhQ zp?Z@R?@P5vcLP{pH!QR)Yz82wK6GhCt0qxXo<2lWkU{ZiKfB_hz)*UQcVI&~QY_(R+o2Bx7 zWX}SOaKsYJW}YnE0Qcg>i-Tzc!l*N`FCr(vfWKd4!kr~>S|uIKG;{Vc8_tqgl~Qwh zT+H9Blrh6n*+jY6g*O6b@H)hqgC)P@F6VM=w8@v_qQ!C4Jh#i*u?f z(zLDX*1n#M7&$D8RYal|&3De6Imr-h4x%o$?xi;u+*h2mHVL>795|R_FJlTU3=R7tx8`$oddxPeA(@l$-R=@JZ?>?dPF#J(E^pJ$|4UlL#%W=zg4F?J09xMh$KgWZFq2hR!iENGKvhjlX8vH2 zd^hT9voxHDtlA7fme;Srh|nIKxV%9C00CJ8Q#f>yR749hplzEn>S`8mlAJKF0G}+b zHqVCXmvoNA4g=&Y)Q68AiTTqW;Zmrp*|-pA%c4#Hv`ODq85`Wrek(fJh%<(4Kqgfq zV{*)`9kgJ@uw&-Vz2d$(L5k}c$6O>Yx8-^A+3j(C#3pBeoYy`CKx(c4uL@q5s$?1T z0WxI5>yz?E=6n~;U?YQ!d-m=TG3m&IO#=6b=c}e(-qz~#od9ykF$3h1oYWRzoI0tc z9^;ImwyrvM@=O+3*O{;>ROCAfILe_>GJ>y)ZEOGO@ucNW@iE5 zj+V>3oLQWa4X?DrHP{uOc;bn$-LkOHP`ocJ+3NCAdl}>H?6@Ulh&yBE>Id~yR(3E2 z8nJN!vK_dX3o2w}4;aJJnTJ*5v}bk>(4ko%yf?1~_k9HnEz3v>BCqAVjoRZvj>rtq z=R0J;0q`*=HGI7v$RO7qoi^3k;wnV5>&&K*-@{O7gp5J+`PdqQmoaW6#o759+vPmD6eK``Y zXmf+C8f7;oNBCp18*kLyG40qlf#fGIE_tc-SaZ`;|NHO%{+|sQIr1sZ@2wMpcll+s z7+@iR_eKH*AfH8!TEyz4?wz8=^b1;8@6^K8n}wIfoki7b(4b~DuS1Af=m0|s7LbtN z?D(uI=bR1ld~T^hgs>9lzGlI+O0ub?ISMv#9st1Dop}qu@>l^euHlvMa5&;KDt3dU zQ%DB!%50S$Yuj;!=;%7Y%`wJ+;gV%bqb-0KH7s^f$JnxQ@sXF`r`nbP03ZNKL_t)^ zne$Hpx#Ve`fpdHNnX2QClX67MLbz!6xaQ^EHR1alC98lAOb}6Ieq4g z02$=wm}AT8t)1FZZ)-rU}651)v8oP zd@t(usDgE7@gcL~6ItaX+gkzT5?co#GZjAHIY+cJV}+JPP|Cens=C3L4O~JJ$1UW* zIDP*e`^|WqV5V9rO2Z8DHh}!L|A4dmgB;%?lN~o?+sWN9n%f3BFz%N*v6P zS!C?WGPH%ifS7Ovn<^M`tJM2?h2b|7#)Z}d(+L^Vq!RC`j9$zWXF1x5(6^mCJC?q@ zym|MYJxi}&u;6cRyYtQmb^nf>@4tcK{6Yd3n*`qW-}A*b;kTL(V65MV3zR;l1?IC_ zU`K25)Y?;11{lMx@{BGI#0FdzJyJ8`S$xYaw}iURX(7*GeD9DMo0%C@2%iBE+mu_F z>OBClovK*$VI{Vio>97xY*;!_E#l=&0SIDaxt6&`I!S?-lSzcrR_D!&;G$e=W5A0= z9U#V$jK$e?lY8|!?b!@y(mtccjqD8) zn**G=09nS*y+V&0max%<;)p*KxPc|hs}8P z>eWeKZ9KcF;Kg&#JS$Vnl~ERwQokt2-6@vTk( zl4n`(RJiV!SE?z&NB{%WiU0ryz!+oC;-sAt(w@LncZz(=VloteXci#gSq+E*X0WG7 zohV?5SmVsr?C_ct6jDH@kN^P527q{HWZGv=BBG5`&b z+1aWi;*~Z0HW+_v0GhqTVdgagVLNyM5I7!jxTIl>ANK7O(UJq>V&1f4hFr33XMl_o zUD&F#SZAxO4RZcWY%#WDZwiR@#(v6qT+8$1d&RTDz2mo%)1B1A;f0>XA-|cI^_%_! z=H7ZUV~tEUzX;<}Utvo=nPw!zb{xq{bPq2bIwZoB0OJW0#-|BNva*n55Yq)}TP6jB zC$Ii?-2l36Ffd?{yyKHCv>v_H!3?n{ftH{_JH^qi7+zoyUQ1far^>Hrp0z8ox=ES@Z=EK&wp zGi6>mhma7GX|U)z)XARC`Dg5%s;u*XOk8nz0jqCUk^&T9t864H6h6bjSUBuy%s2zE zbbX~3eE=LFg29mAxsA-swHaRRbeFN?CX zR$<3IsZ9YJinBe0of-1k0GZ9e(W6a~MT)tzfq>luWNq2Ku>HQYk;>)94)BzNZ>U+b zDp3I#fR+9nR~~cD06S`1g$g|da1H>?@ykhRj8Ly6*Q8#WDlVl$vbIifQnyBMUSL z!LD_zmXCwdYM$D$bH|=ZlPCZEwR7ftyRl!tO$8`_0FkJea!8;6E2m0 z5cPvIme2JrTWN1@045lt)T|D53TB8mc9t0|#*?MS^nKtJc^^_dF8u*aII|s7icDk) zIA1Y-Tx=9VEiKz{*yi;(gq*X~pOHpWZJ}Q0xjAvNEf^}#Vccg)!sCx;3YH$d9{s!b=&b40^zE}k)(Kbww&oEe+tAn^4Su2Xk4&^m)$CPj-6- zWVF2OH$@ljJ*av?*P^+4e1irlO-q16C8+==^<)101+6u! z*J-RnTPL10DL?}aow0F*A#+ftmI;u%xf=rH!e$>+>tHSb*`O6#ELSuDIRHJpmQxap>wqMzg|M=+zFh53J1HDJ+4 zfpLIx36wJ^TjO`oAVFhZ2NrOlA@jw$S+-)uW<6!*X;aSls%m=QD`9d`8sGHDQ%`=aB?LiYdH~^10(Hc4Y?;k zt~C-dOy}Uze{1M4c&D$>Co@auBf}K=j7iZcU1*R1N3;J1WX2h$Xyu_&8kF2+{*6{g zsuAt%DR8UyrCY-*E3r%StQa^T#P}%T$ZM-ipa9z{1rPyz+ZE6?e*DA;hT_Fo80(R; zZsf>zG-Lxp(6CG-X-{E(F2@Wq27^`rsA!snFEnHWvT1|48uKhbMj#i$2(_Fs+n%fg z8(2?%2EKc=cKoQk8Rwok5(dZ1lrCfiqDSxKq@ zIVyJ9yiSDtXdVB^2~7kh(huCl&<5JZT9RqH%1M`?gc-lIV|R|N4CEh25MFVsYv7Uw6r~MIB`LHW z7&|9RIiQTO7#z6|;GoZp6=uo(j5#!)qWKv(dIIDD@;hU$jzA_cT+EIDA;5#V8ZFzj z$Y$c^<_KSB0pxr@LN&IE4|9L`a!WbT!2&**{cGjKq;caTZ}b5!z-x;`@sVfKwFM+-h__8D39ON0DaHmMz-S|dL_o)N;e#ycMg0lLU0P(t2;&qdw7C-L zOuJ}S)<)=)>u2*Dpv?=Qb|D7<**UwBC#*CVM-%fLKAV~H*}2Yu2!M>%hp8H0sX;WC z#_V;0=4jx6VXJhNNtihZKd^oaKs&4>KyTKIF9prdIp>0~1V97EIYA&uz!>K32s|Pp zIFP-&hV1@OXe0o+L?An*3eDK&*APksxJ^q5_pM&Jss>Y{su2#H3k{e>fLSUnO3+gT zKM9ya<5b!j&xPiUfwl-lTe+tCOqDm%((I?TFwp1qROrjIoLBB>^~jgDIbP#;NmYE{ z%XJV0X-w<~@{tiFST}=Zso)+=@Kq{Y1;|k`F8Sz9M@;770w_Ub794HzXC4p`84vqr zj&h*aty#B0?L2$J$tV4-G8F*jRr|}}+V{07@P4Ae&m16&i4GDYIzu4xOENY7f|$r8 z0q{Uq;qtk-*-zUO^YeEO1_CUc(+Pm^;x_|&UKF7j_EE#>>Dp{U1&}eBT1y8YF+Bo| zwBdYL2WPpG7yk~^X^FOW&FawRC}L8ML2Q~Bt<~@x+M*Z;{%4=#8#%ZdH_zEyu5r*L z0dkly6Cihirhrv|MG8>o#`RHbWBHP$^39$iAL}vUKd1j_q-e%e*|IQE)4vx$-mVB@ z19HxDcA*sjB<7&hhIXGk2OAV*2CxxXk3az335X))4FLuE@&bUE3kqyRnbC481{yc7 zsFtO108TsuA2RdGDPf}piU4wVQ#BTZF0Hv&rqj@nEw~w!nP2)(;1vQI+chJU8BvpF-lk|Nu$HU&Pw6!@6}WHE}v#2}B?fe}A1K>4f~#OY#^ zgB?w6GqV|=wMv6f;71AMGV_74SUZN%0!aD3d~asvJ$>KTb!LVaeUS!&iQ2(j1jqmc zfHGhdxx^*4#=&3Q=U_FMF`7xX1Xu{Dg#il>1u*#@u)uGOc5G8M0Z0yTGXOQmyxX`7 zAe*lB^<`zE5d*M(QIZt!qfG_>Cnt-fq)#miq)C^RfmR z1uX=^uJ@cPbj5Q@g)Z9U9_YaFme2w7GG=RNiFOQKU6vFV0PD+s*jiXCfN5Y_wqkjh ztO0KV#B^qG>u3RVOPP6bs+TnEeR|p8z}hX^u+7$X$1v8=dWrhhJN<;l1a(nt=7t+? zP(J(E09BttWx);KcKDK0JKgq)z7HXwMD^QLZcW*OlgpnnMGHBT0Up@KM zlfNRL@>}|?ouj-@li$Ah{YHVG89){TVXQ~13fJ|Lz<*1h&ldw43iEUQV4D_mG%FLD zO>r5J`OScAkaIPx-9Rm^3~S$g)smZw%H}@ase}XrGdKXqJ`@1P3LwJ-UAr3ahWYz@ z`ag=47MOi8ulw{SOp*YUfh-ug01gIAJ7~xFpUFAKR2!9?O3@73Y}TyKFqW$*40a&~Mt6;AB^T81KRVj9Xe-po;H9Y$yD?g>c z26H4P>tb%tS~8j{_hHHmKcjrP6nVfr>yw-C)K9#fQ3xvGCQv^tKv@v;_~IS+Yf7Pd`<;0qEFmP~Q|7E; z0a9ql@hUqu{Mtp(=xJTmLSND7^P0)mXMb|c9b-}cIzrxezx&-N_;T50m$jyS#*chw6x_R2hXuiBVu3I*iyjn>?P%scP?MH^ug07PyVY@ z&p6{r^|4AsZ@=0U_yAJiX9AGL5Du4F@mxhz|CToT&0+wfC5d+sJY!8JYe9QtaK(IU zhT~{b`)hMF^ZshUds}B&!{J07m?v$asi7@$QWMwIDJsD@s{$4oZLF)lv7G+(Fm69280cSBzc#%yi&) zXh4b(dB$6%iBlLwg)OSO*#eU&&_cFzYOguBS>L0rCCioukORno`l+W+ZjIA;4aiZt zvL`8xMEuCXzdqb3u=u!grCZU-ee>e z2ym%{u#?K3R?*#C>L4@5VPCxi3z?Ik;nuCYM2BS?H?04+lTSPC%d*D2sOz`vZI85n zZ&Tp?NP!PLAd4{!m6`TzG4 zn^TIUwE;qy7dd;F)0`YxZ4IXh!c9|g24tdh1DMsOBc0=SwTU)7S7uxM#z7<{#Xo5MzAk#T{mJ{wJlglYXDRT3 z24rpO!7{6!CGh!_80XK6v7R8U>M++k&S^baliC|FXY*gAuq4xPcOW=;L_Atk`5LABv~Tqy0BI?aq5jY;JW zRTb;-IXXk_b`Y7F zc{Z8%w(Bx5QIgYwK+r_MR7X}r!%{2UrhlTM`JL)q_=^Ey{PN3Iu4vtS^UYNxH3vu( zz;e1+)=)#UE#tQ7*{NjE6<5G<|&--3w$y;Xo5!bqt( zP5%+%hD$(W9Dn(je;GwrZoc)_s$v&{8^VL4#KRA60i#!97Yju3A-f8iElV8X=-7n3 z2l;Ga5!xt#aO)edzy9h8C!F}dK79Fw-|FZXvE)6=RofkFQ(!+SaPSagKReW4w}~O) z^qVBV>K)Rw?hw;CS->+0Fm^OBfMgSM2I2gGc_|kSG=+&lJ7ZKW^0>s0c02! zzDyV!X)-od(;o*!`4~V)U)yZRHGCIZPtl59P$T+|xfOr1nDI&la=r1!8xdX2n9tCG z2?YE2umPLDttlHEvyft@YcnpuWPf5e%~<)Uw8gVHsN>XfSO+HH(Bu?t%x|0~#Jf%2 zo`WWH_gwjR1Jbsw0#5}#*;MU_V;8zGpi-gBLI$SuS9CA}QP60QxC%Ht0^vjnU!mpJ z1who`o-||&cW#GqAY6@`Fg_}t@%ss)u?Ad`(UyzkEAMH~WI%Qs?nhp~TU0SD){=q) zSvSsESH-OG%YW;e-;ChB-~8?0j`35ZB;pK|mmJ;c10V6=r? z%vcQy_IuWm%8FvPmdG{hrELO8_-6q={Ih7sqts5M3@M0=F;TcAK(`=*gV-|oHwCLK zFws8kZSCAxnQY4`PxPHvKC~fdQ=*l*hhQs8WZL(MKtW_R&l#xxF&<2?UJp$`wuYRA z6Ze~OFn*5BWIpK+G!O!ITc&+AS>qB2pi3!Fxjz7MWm2xrX!hRV1hB!foXnDY;;Uc% zYU_7?_jg+-PMQ?YBDjxvhzRKd%)K3Q5l1m1#1=qy9=zA`PHE_o2hCjKuP^gz>lN!5 zw?N68-}&lmuPsr#|Mroqrv25CM~-cquHOqN((XgQQQ!j!$lB~$QYKuVed0QjRU>pKT z@gaL|h$fGI=nLir?f6Sy`cms-%0<3Gb**KY8wvM<4aKmtH#cF0I97{l*R34{B53U8cYX z4v@9UsZo8N0QvW2I=oIBeS|=xgUyU~oHY@fI-7G~=Ft4!+Offh>l_VgiQbaFnbLs* zat6Bm8D7um}&_xiC1G+FTqDeVODOcyBf8-JmQC=yQ1M*cvP!ag#+~Zgv z8Ye)BX_k91`ICEmyiBPP43_+*S*WooGQOkqq?jy0QkW(2Svu$m#!n{`r`zR z4L!U%_`?DN>y9?|Bzy!-5+FA-OBq>4<<20?qGE!=y+rm+6%UUaT%V5<(*x_C> zBNi`QxMlAAx1X4D)>(h7(y7m={dOwUy9^}l=KF^NA1FW;6BtNYOldH`E~fU&`u9;{ zDjjHA&NmK5MtVn4v1&~saA$XNWDtZwH19XF&(G|isp)!32D#i{7&m}SdJ5lDa~N$s z4p$KKj`5HpqcKNOhX9r?pB*4LeB`KLaxO!>V_OAir1gY<9SuxO{rR8FXi=+~vv6U= z_)O!3B@W}UubDhmytJ&$`TO`6vXw6kzj z`)*4BA0}n5;R=weeSl!V-&>lOfBL6?in;mJr#{s>O=(!HF$%;uMJd3v0mxkvl0KDS zG}>mqaYgVRbX6_!>;lR{FVDpv?;}BRu{dB+(f4cDu3vliC6`?Gms&3~)#s{4Y5Uct z!26g29~eLejJ3&65|jL-f^9x4W^uYU?*Pnx_&I%g6O6?SJv1&KJ`jAPO2IJ$4sa>V zKeUN*qLRPo-N2W@U~eG5KkLO>O!l`%`N~C$BcO{hUV7=J(I1}!Y(Pdsfguw~?b47i zK>%gc7)<%c)?EUSL*s!AML=0Cjqj%~&WvcXem=MXr?oC_t z?`UCwLgX74K(7i+2Vvbta(rlwLS}%D|O+Yr# z?dH$Ur8PBPG~>MPS80t=v5OdmTW-0fb=kD3F}9(HS0!0ZuU-MUXz1Qk>>+56FccPs z66J0|!SM~AZ$Ox}&9!`n=5ajbnl(FT&7L*?h%v{0W%@^_|AU@CUwvsG)wn;*rG3wP zh5{c5Ko;{supcKa>n8c%enp%5JZW!3#3(!R(Sv4`nd!m+{POp`G4>n{>T7$_QVupC z^L+XOki9Q z!0f56L_3(00ZyKaCXM<3%yZ7}x~?$s@NxQ8zT3J{_2j42@mt(WN=b2R{JKWJWC7WT46S|MK*gJ7T>p>vdZ9u@=o2*4Alch312 z#^qb3F*~SjApYK7SV>-kUiVp3w&f=mCaE;|E=+?K{Oh&XUTb~rYhR1?b@Q#agupPk z9KUEF&TfKkG%x90o*!re-K`}XkgX+WK=#m_O2;!?1{SS($?|2J=gyh?qzZ=ojq<-A z()Fu#O}n(_dj?+G9obh3yzc?Ifbnr+kXNdL)aS$uKP>a~2o?V5@Ien|=%M))jkl+u zu00XY4AqR&jC)_7v#%4BHFleQVOlUW(vM!%xw~kZlsBZFG_SgdMT+*$8nT0!VESW@ zJW7B#p|y20npdR_^8BF$T1kt+cZXI;pwY;Y!vmBFU>Y}ZLS5Q2YhyNFM@Lv)3R-r1 z^pigG=W?F_F@K}w-`^@my+r_AY2JrLG;f}}Fr${JUW1GoeQ$v5`+EZ9(9#MZ=XU(8 z0B@DhWXuRL1kT~B=imhZfkPKY3P8gYTTIp)N|2Z>D!W-uO4M^buf+sySICjFSa1*S z0YD#37?brSmrkvM%VgfR$vEaZ`Oov(%IhYBp;OFiS4`=T1-It;QTXf;L@1-ly*J%* zb67GswJNMmY+rHHtj_&_KLE~{u|OceA=HISW7No< zufF>Fs>Mqd-+l4L7ynPiH9W6zv`>ZFS0>ZG{yjs1_cb7ksSFWQ9Vdoyg|xj-X`_Bv z(bS_9H9Wva$r(stI8IM8bB?@9ZFmE9_DyCfKQncnXY-~tIX~}U&8mH<24ol)zBSC6 zue~}u0ON`)t_V|d_yMWpRNl>uT^rbahpC}ij~qR!Vz8YR(?dhrxl`s)Xc+#pJAQ%{AJgvxBVD+tWPB49vnS{CwN2%08(vIax@*B?G)``fci$oF$^nDUF& zCu{ygWHy)Gf5(e2zcg3Z-6@yN*R=QNw6)}e#fjR_J=hd@Ujni=B?WZH$d7cqw5_Z0 z8w;S$QWW(FNzMaY+yJm;lVKH(S z0n-Nr2U4v7<)K9CmdI%C!$cjvT`_IXM+6NO-*Go>T;s^J-V;3yU_2Kfw#js-G`%Kh z$8!pB0tC6$pR@%9(<1|Z6Oe6!N0TIl46{AY0sM&# zShZ$#q<`Id>nB>HL@xsLe59n)y?PpV6Oi-Tu@$5n?TV&b17R&NR6;942*pswjvp7b z(vLZgK)?Z^p=ZleQ%K61xIgm_Eu&bC3bQzcFP}Q){`#GFeHVU)QFTHm zAjUaRVB7&iGXQ5m_IK7cv!w0cEam5SOp}(}t*yb3tzDxjB?(Nudj*2R{s z^5bhxpj}uLl3?I{X8&>s09xM`sL{~3%gHSPZRSHECw)Cd9bH%-?Zsk?b{ods!p{`h(~d96FJ6!Cm?JM(HaWGFi?iJm4c5P zc#|1$1_17LAq|+1wPM;qLU)vGPrl@)d9_EzS-$LTA{>26|7gR2vUKs12)5z(H~~qZ zigsy0?sj}4K%O*Y`UNO)|B*+H3DdDbMHdDDE|Z3aRtp%zIH42tJzZ%pkwT`!6Sj$o z4(L$ul|CCNOnWpuOzHzWsvsz@5!nws@IcVwR@HR|448kP=EQSZCp^Q#iPO3QPzoUP zd$z#vZ`!eT%x_K!0+11!Sa+ZJ`P(Bm8=r2_qojZJw$YoG1Yc(hOD-0Z0oi*4leGmJ z+V9j{6P1r3z+AH5BDgELe0o~%2K^==6X3@jY~IqT`R7>1Qn5>ESf)u1w1cKTU)v_^ zs`Rb)q1KA_<*xhgyYHQ&k3HtUUw!q}|I{uR(pLy*U-w?3!21S}#T+nGpCCqmv$U>H ztzEa~Olfe##SjLdSwubNa&nPD*%EeBE6yf1`(+J$S@ZIJfEUalqG_e+@qF40Q+5f; zVNz)yATcO8Iy7raS^Eo6Lc=bxvT?LtI&>fdg~x)1K_AeL(bfoVA=;Pz8B{}aDgiVx zp7hxo3m^j^A9eH*V)WyqG$i94C}z8Yz^jFeO8U+GFz>>I0ga0<{jd(H9~J>vXiGbH zR0Sd24uM$siYXuh-HtwXY&;h*hGrIgOdA(1v9?7U&=o4VVTl z=N9A7eel5tRlj>mOAJ4{O{_8b?qAR^>X}!XJid2n*_(cF z-@Q-BdhrLUD?UTdX$N@q=jLfY>!4HM{RGIzY}&Bts&yOI{=3yHR!`l~00Tk%zPVwP zHg;&nW@wrD*tE-g24GXv8iX06nTQ#dqfs5@X^;h+_znR8#!?66s2!dOlLWYVuIowL zw3tn({%n6>Ef6%4Hu&BJ7((NcR);AVFvh=&KaWEVa`{dJGJae$)Mzi2UhI^n_r{yA zh52~Qm{C=s3cW~;dPf08>({Ie)A+)L3u@~E!C$8fkets9U3cuPfYXuRm>#WBGdCD1 z0U96oi0_zxhlVOG$>&j9n6d=|LB)N~TJWAU;=b&bJpppIq8Ol|IokfCk3Je2|Hp5> zDSYmZypHs+;xG3Rm!W+Ms2nxywbksq!QWsE`176T5}}6tUqJc#8$aIq*!9;d?P*)( zyO+zrCgnW=vI7#c_Uhm+ukpP0U3;3sEf!YkAA$gYY|94gmi%j%+Kk{b1WccotWM>% zm;12~=t;8T;N`Lv4SC%YTu<$F_U4PyG zlCU~Y*S3#o?90YzU-O=z!21G_#dwBo-?;tq&K;e2qr?HRDvVjpn^X?%x%hI1q%m;|OsfR!`?`vJ2?0MoGP)u5ASJOi@(otdYD zWo$NuQKE%xkamo37bXoO1B@wS$;;0S=3BtGsil|(0OH&8-fEqC(#h(7<(uO-Qk{tK z9jXEqT(fA=!Wai_QL`B)9BoO14dy8*w@=dV2GvMy*<6{T(T)LseuMeauc(8aOt=xL zt^YkoS%5J^$0A{iLVUN6+sIYA!hb2@hA3Z~sckBCyS6wW{CxNO-;0x-e(@K7F~*G$ z2mlXO>CvE@D^Mv~J^bO)ki%tCPKk0fG?lvy{ItjSJc~8O`yc@fa}lXcy8r1J&$eWW z)j=K?v_Aj&&nw+%YhA7sx?0%lO+)sYf=t;u!?Pp0Sy9{$&Z1xR+dv=JYitM#XvkPT zXoq(zO#$_o=X6Y`-A>W2+$E+z zt`r?&vF+X;{_rQqO_=z%mtTJQ_qFa;?Bfz?U*4v`yGDV1Qte{73O2VnWgZ&;cE%JFchC zp@X`DnGpe7+OoM7W)_TA3^r>iHBbU>MH_4avbFMfmZDjC2PDyq0SWxE_>YewRi9UjRAC}fA-U&=`UZgv^8|!0w*aP~BHG)c2&;8{2)+avkiIxgbgayF!IY4>QjMtId^?AxZOhTGoH|t9Y z0?ZN8(889L!6itJwgJ4KzWh?;08_x__kQp9;smD9qIHNx2u7q*0a%4DnO+t!^4j+2 z+Nz;E>;Sk_+A|9z1b0P|7X1<2#yD}4tXa1<*2~D@BjSGcV?M&uf>rKU(?UQyTQ*l! zyI7C>)n@CWA=iH7RA9tw!*s}&0txB66bQHesTt2aaMtN({`KWoUG=1{Yn!eQIp=OS zxIYxwSAMoXZS40w+GxXD+gelBZCL$lo40PeO(1)$q-h1_R$2w`b)ISo)~Z3dm}{G+ zI{Wnu&N(eAYtPo2xjyo9^@524urMEA+bM?TfTRq@nQ6dq-QT7^8Fq^HAunb(Iyo=Y zrgzT$b*c_vyh!F#DqLM4fQaCtqW#xQu{^ETG6^=qlv<*-LpxH0D;nA0!PVgn&|>bJ zbL!KgFwt7m8?SU13RK|R<(Uz5MKG6wwg9c~eeZh_=tEU0BC}!M6wgDm>2>FnS z+=hmH4)8^TEJrtH+UGelQF<%Cw66=;5xv%scW&R>D=l@#`pl*B*ESUr30Fojt@@NF1Etp$0*wU#o{dF<`vUxklrNg-n`-~wd+$|h z&*spOIfEL3DBL0(HsR8oy#R7ezno(Y?aO+hz(@400AMp8d0>g4r-u0^jd7WTG@sM# zcnZ5`qCch5SG^C*1T_T*_iLMi>adt#`7t1eo2mGaYXKwWG3WK+y@@~*77N8S$Stzt zu_qo|uz2B;yRNzZ`mZP={B7OSE~~lUoVb1Cp`yUP^0PzLFPOwo0mRwbWOrzz-X;z4 zL~W`LHY+AGAK3?k%o2U>AR9NBql1nLBeHhDeLg4H+HGc>Fif8r>}XNvI9r<~kJM4v zHgWnlgA5FpeufrNf?uLvMWcsPG%F-|VjM&>Y{<|E=7MPveamr(6sF(^L~CGNiw_uW zxLZ(Hr9y={+T);aVWt)!Arh<&XH`i5P50^gb%%_3wHsV_QQ>Pfn5%THM zH)s=ivDA&ufUG|HeB;QwEjiRYGosN2#sR(y7KWL5qkMWW+%>CKhvv&QjAN1lx)|>| zMa4RBYon|Kt5&WJEtfKq^aHJ$peMkazX5}!*$b?B4#EQIEg(V9Mx=h>JBBU}L}M;D7ys)9s!j<|;^@EvY;{S=h9qI( zFbRJlrGVL=?zIVx2vXW44fe-B{&DMphaQf2flo?H$7Jj^bRd8nz)PlA$&-#X z*{CEom~x$^QWo@CDa!|Ihu}P}w?Nx%Z`iHCI&7TRT!V7ChCG9?)|49Otd$UOQ{Hw@ zfNVi0TN)4u2{vOMv|e}pWabM?UU}`+Z(MlcMPE_;!^>?gc|TF2ecK_Uz`pRaL((a2 zJ~;Hr(ztFBAbd(D(=%lz9-_@Jd>zmYfYCZF%?INy0LupF-_|tZ`}`84Fk{H?e1^#w zoDI}49bVRsv!qW@3D+BJT^z!`T>6-`<8B(V``n;xm?3RKEZ|Q75*h^ME~%I_K`AF! zUU{V$YGnl=@)->{Qic#ZN^uZAJJOtf1{fCb4!`dfX>|(ZA(EKqZtkqK9>6&mqW}i2 z179J`Zks@8^pQtI4QCO!HSzcp1E{Db1%O0-WA%x`4-q*%cxdz|{LT12)jywY%x9Zi zn~STd@il|FeEq&GV8%s1prcLJ1Ee7mVNQ5jt+_+H0^Wc1H-8=eZwnk)DdHU95?KzA zyA0$`(b4^`=dYNqEf8Ak$M+n*bOADbvP;9)v7QKmqdX*l{EcsYJMxgxlCg@|ZDPRN zR}IZ zHmeT_6KglproetuU|;yzem1dhw`ucDl>hM-Ny?wq;pS({Cp1hT(vhP{v+uZOfW0(h zZI+*#CNnd?Y|@VFFyWOA4+D0}jx}>@&mkZv$`(f8ibXJk(3A=g0#cZ)YvI6*s1c0Q zjak72lV(MG0U!d%D5t0>>$A^3J1TVLNL!v^K_JYg1z7Ccc7Ti-*q|_33n(?#B}*5D zcDrirnuxNVHS6UF?mA-B=+-HdPivhp;rP}F)xAdBA0+@DsrRkhs+?0aWz2*`dn1sz z+EiE*R0cI zKq><3rcImHnkXv-f=!1G1j$k7S-|1@y>0L;CGgL&VEAS?j(DO@~@(yU&u5rkRJZT3F4sd_+3vl^%%H=E4kzH*9| zqOMmx@bH88PdWR%FUW=R(|%c7?T54}aF8glxBYsMn(g_q+L%WRj6c@7ZsYIBgLJMK z)-VBHXvW!RWYcvwEqD(-?Foo|xfw%d5ZQFc_W&W^*#~S!5sbH({2X2E(`d|;bJ3D) z5^b7Cdjn)MNVEphP5@+>9Vtj?OfbmI{2bI(`_7A|?3~l=QzzGSy8vai%5ahbg@%mJ zl6FR@#&wtg#oP$WnmFFa?gLEEp2qPsJ%NYrBtt zY>*4nb@_9ek@sEf3B4F2f*R`@mjv_5cdSp|=`TWruQg43+n)9OOMtTVB7|V-To+4M z2IMS62PhXo4?wnci2K-=B?xoJ%X zJ3<@ridD;&|L1Kxc3dbh7^2PHfd*<*GRz^E7zeW_KklCB+GO}bTSP5Kv*)_NwdyvjPBKcqbne6SkH!hD&`9sT z_rBH>Pdw2&|NQggWG^C}$BW)*#5U(Q&HsJTkTX5KJ`8|f|Mb^FDBt1UU|o=Qh|7ll zLI=KwHcm(6+08uZ++H_Y#Zk;!j}mYId0rwf{X8_*+YaqhubkSkO(tKbUJwKYh&jlM z?_sJgiI}z1Jqi&j2UxkotLj=#3Bh!UmIOc&;A4%;5!DtFcsAxtUi76lLpqp^-@^>Z z-}cs;m8->z<_LDe}~5J)H#DI0?%WQJr<=!uf6u# zN_f$W>lic4-x0w<#}a#BI$JohE5!Hn41=;`4u%Y@>Z4<-_B!G^*ZpP=uw2ZY_fBiZ zj2WSoPMLPJ#LQ&0l{ly#HfWvOy4F z&f}ro=KPvY@m_`7*XC~kIm)WyRwz;6Za&f{knUbXlux3 zC_EF;10a?!U*3|GAIBhu53zu(!5~tZO2Cmp&(GmEYb*xjK?;gltBC4XUVXU=PLe+u zX1GJ+LLj232in>o<;n7nP*V9{D^u@ERczwAip|$RxrUe>#Jh_s?#54Q8cm2->Zmes&t7#q8$zxAY-rEc}KOb zF;PyEfB=BF0+)q=Et{*u2dFG%Nua;O001BWNkl^2IDdq zJH;)ctTn#KwN?MIXgvM&)1i$LS7MQUA%0qJR)GeFZ8fb7$?!n#A8g8u5bjRMGB>%Dra z1=CvKD>UI=0D0^7ojdQl|A#M(8b0bTKJzP|`4?SZod?=}wJGo(qQJWb$l6fYe@|Pw zc=0DYH*ETJ=jP5+IMWy~HdBuhjoMiD5jm);sRbMeJu7V#vtRWTZ*&(*uusvxS?Bnc zi$gnsS!C^)-(a{lyJx1;{A}Rz7@B}=Z4B)Qb2T}>XvlykuZYyODLtjAn349>p0ywV zSyeMzZ>s17L0#66c`oTqw1p|UVyLBbr?eODKkTqUp-I0r@9oec$Ldt4A;YQ@q0nq< zEqzzIp(V`Tx#fH}sA!k0H3SRZzyJO3hah#{dFRz8 zf9ULfqapg4*)QK)e{*zs4(M`Rf#=A;N1ie5bHdcDS6_*kfy*wN7TPC%ZG?xbuDYsq zrsz(ZPfwNxf44tYh*%#oS=;r%Gn(rZApttlH#FsFM}M0{Uw(tui~%=>1L2Avrn?rO zgozNqOHFWqIo6N_Vh1F;53xsTmqbdhR`(re$`rojGE;9Ub`F~;My(QcD8{i}MPB9=dxjSV3CFatImo&eHg z>1N(5497t(m@3gcID!xJFsVtdn3PSfJj;H~+~*AV9%JN~s{hYFJEOH~bycZror1jh zeX!`xVG0~XU(vh@%AyEH70o&ze9eoOEsY=}z|0KObl|>`BSu$RQYn$y8$Awi8h5|F z5!B@fUIVhtpagZ9{;WOd{P^RKhtPv?!F@h9(wdqJtngdYV$z(;9LVLh0YDk#A|kl> zprI4m9M%TDizsjT-ifL{>D0-sb&5|wSfC^+*HAX~taHxp0;5EQ0|8_nV?fT4<%?S1`fvXDM zss)cCz-Oxjg68NWj>7e@^`3k0dG72p&-}BSZ@cYo-P76c>#qI4HU$oV0`CeSYoi?_ zY5yi|kl$9m@7b!cJXiqM!N!jAcO{i10yM-h0XLtRlmnys>XY3QeeyF5C;`N!FagXU z0HvH{V-skA6lPFql9=xt$Yq~1rcWQIw>ROT*@w6u(_CRt0P)tQm(U%V7_tAPD!NG4Oquvk@d#uWHSEYi{ec*I%ueo_xwM+M|xD>QXZXfNA5# zDy;=!q$(`3z4gW$Z$v$70GU^HUFHAd`7xh^s=^=cYk_YM>?Fz~zxXrsgj)*cn;^^HDM4QLeOE$H1b*%M@#BxLSg~s5KYZ?UpZg056ARi}^1iH&_O%C_0*4%s zwRuKKg1$`V&i^dny;O{ID4QB>k4?+w0gz!-)~uSxE1H=beEOS6!EjZRn3pviw_)uV zu!LD{=+qH|(v0on;$8#@m}E}}$oJIOY!0k7b^$UP2hT+#BA^RqNdB=+r#{ZmK$r8Q zvzgI=U}kB?M!?Lf70X+*XT8#TYwnxD*vNzB{doBX@gFk>RUUSgezjA-Rh6n*0T?Hq zd{SHoAiw|-9snY&9Z^U{QP$Cy5;g9&_s5jlmwB$~myD6n#pOPoQ(jv?O4<`+0*LX^ z62*+47SPFpAat~roXxpBD}#kUXWy{Ru?7p?-3Pm3Sm*fdq2cp0e-gB(FUQC%EK^L- zAJ+wyyObIj*PeFzGW=G-3o~Qt!G5NQ~F{>F%G4gV<#49B%-*o5{KWZwBPN=4~c-RQ&q& z8)MzhnLBs$GfzMD)UCIC@(<5E_sk#bp7wdkeO(;w>kc{v4k;jOLmjRS@^i|k{Y`Du z8?~`V4^i|kn-vDm=7Vv%RAn3@A>U(;M9qxG+C`HYW~%ihJvV>%Mz&@Xj8}kMnQqI0 z5P(YL-&Q7S2c9^+!ps#WW9>LIxIF<-kAN(G2;;*~i+K>{#c$S5j5SY{tS9JU7Pk$Pqe90x3 zgodm#by^EmX-_N=Kl;&+Vod-r(4Ipt5NPe^w#y>Y?Rp6K+7nl4YRG<;EkBM8fHwHJ z5jpaM%MN zGrpWr09`h2)X8SlQs2CJ#}6NRX#Uuvj{b`qZoB2q_Ib$%9b?)J>;nZ386az;50okM z3~l7k$n<)L`Zz&Muj5FayG!5)4A9kn>@SLg+f}F{`&~2mW+vPlgKskGCLkCLt>ri} z**>fsNS1S0ZN4PR+QB$5B$vvhoouSy7eJ0{OXVW`ae%~2FTE5@4?spU0vOStc^PD! zMq}ZC-)s(d0Fgl?0=NYBXvoh#^|XA$>q3K}@)rI{0GV-h%}JF*e1w3j($wA#!QfPB zXcnZP6<`hxpcQ?L1Y2JF2n_qMhT~G^G0(N5i}@~V#|Behj}I9O4dWzWij*R1SMxi< z5OZP8I4lUFxqZjb)N9q+u&p0D>k@yZ?Rs*?fP?gjh$39gL2MhaB%w|C#eT{S+Mg0+J|t1(sl1^T}{ zYu5T#UYT{zr*FUgzfGJx`8nO!E)=q_8?Jr*L7~7tZrAPn1;uN%@UGD+YPG zz;+;;`RF5$ihNZLM(|OG)>K1dD96j0=>~5vK~?)=mg_4p8%P0UHh6$kF{9JJd}2~C zqTSHmJMSzA;M$^~Bd)0l(c5q?4dIU;cPZ|(H;uHFC{TKF&t3oiEg25mHd1f>1&hd+$yU{cChchJbu)E2%B z$Od7?>9i*UvVEcMH^2M*Vw;j}+2MJtAJz<31qy3C|NQeoXS80=b*xE2hP8FH=a*l8 zxeg*^-nrK4g5fGCfn)nB2sHuO;0hqSeG4L3Z5SVW#3y_O9ZE491Rd^s^2sM-Y`8X9 zBU~Rj?cUoZ*emvUaRo7F>@_s!u;!HDuJDzVbzRZ8s{lv_Wb+B1&V~<}*ap_J*7c5u z9(dr*)6P2ck8Zv7)_>J~8~eJ>+Sh$>DWJ8lrSR@X-XCN(8JY`ijF->p<6?-vqRnug zHrr4!p$;@X&iQ2{v2g)BGdq|Jj0z1jzxrzGY%=H!=)0LWi$BlLjvQ5)tYI!}X!kAB zu#!L!+NYw2VN}jlcD^+Cb&JeSOec@0>3_5^f~k)7To?i{;Y?mklzg9oHiE5+@L(+} zrxsc3=bFeR*8TWL*9l0MELzxlapnsuaI!T_pkoxwMHj_Xr7o8qO4(T zbLY;h%%pNDpv{FJS@-+IDVxUeA!k4~?fW{9eck@e`S!N5PttyVn^bMyAF2Lh{{6uZ zeh>mr2pNUGjMHFj-?6O^23}hr@_4dE$3l~R(LBe2VgUZJV~-0B6Q3;FF>MnhWq@_D z3johc|@Xwz1kU<+dAYfs# zwjjav5`0!KUcT&`pZ)A-zo@><*%unMuWeJ{U{T;u0P-+x=Bp*`{+>3%C1NIr>vIRp zAI-$ay|LMBreec8>J%w%7$r>=`1SlW5 zXwznO&_xlbQc#zfWq&Q|EMV32mS)9gYsaodZ9sJp(ohLhXvYA~l{!QMArL`?F*qkS zG}#hW-DLizuj$?t*lZ=SaK^jA8TwM`ifClYV**%!ag@a@>3^J?997>Gt)34Kaa_Uh zlJ~8;7m*${g6dtxv~C~mzRhs20Pc@JVRI}7PUvDk9cL3$iV!9SbD~c^>dxSnP2Q%l+sqm=-vKz7JqhZ1<>i-JZ_jy4 zTFR~f*pp8?H3TI<8&DoRSOGXiE5V<=T0s2lv(JWB{E1I|A~fpo7fX9~fe7dq^htp1 zgAej}`$J3aY5rp#N|Z1l=epCLUkg^u?<(a{Km72+0cOzDmIlTEDA+>49Oo1uuCun- zbT`<1ZSbaD2SsuIG4u>!PTD!ooUdwUXvokM&6s{f5T1kuo&ha~A3n01kK9qrYcwYW zq`j#CyQx#BRw+ceLx2EvI%FNTC(ilCp*S z1@OiSgYbbsf>1k9hisS`ai8}buA?R(XJLGAfb6wDa^&ckTStxKj!`wXRa>|3`0B6x z>aToJpuI%Dw+n^rZGp6ZKd2NqXn?FuipV=w8}ZZn`@A;QN%|X*>-Sn)2@^3nuzFbo z&1N?<(){kv);xOCfV0NvYfMpZY-`}wgmSK~wSmmcvzG09=`Vfp_#7E-jkh=Op+sTM zBlhzE5kL{MB>rB^!;ao22+rn9ihG2nEM}9nVFG2UK2$u0s8)Qsz9Qn$Gs4yUZoIulDD<-Zt9Y1NYn)_hGJfM6oq%+TtDq zXt%Zty@yF)u>it-9JbLc5z5+D$;QwqM~xU6fJ96H?~9f!4nI5=5DLDaHHO;(GDsk@ ziQ6s^ujehBs+bD^j({%m)M=kUF#AojUpw3eg-+epWG}&Xd5!bg=3ao(dz5j%_Uh~q z?k1mcde8~;wYB5?jKRvLSgv*U@PiLVSyF^Qimyy5g-rl-+(cggjGOiEG&MA1TPf@Y zs05)(gXWb5Bd-Pj=7@G5Ai_8_AKM;zTPDSCTam93l!OmnE~1NRSdEMOEW#*%{2H7SOU&ypD;S;10&}ZG!vsW12;1Z zV9{_YVWNt}CRoPlH{7@Io%vyUe&_9Z(FV^TpA|nOnh?*hUmWH&fBwQ?`uqknMUx{3 z7E>u>Hz0Qf(R9_4Hly@hnpRnJk884@U4gGoGYjiT{;inygN`ALFmYAE5!2b_F&&79 zIh{W8JKv$r5tQ`&)6Yg~5q}6B4j#%TYOe{;TL!ugwQH*d?|`e!IfflTK76u2U+_SmxWq2!_*(qBD+TFkNfmQ5GENN%TEJ2dPK6Hvn}C zi6H1~6<}6X)w*6;C<9*Cc2Ha@T&TPTR_JZ^7H^%P}6F7uJT; zsvdppvBk$vnE2?cd=~kRH#Jw;p=k`J)YjXf{XH(DyK_N>K2rNSP^mY@TQS zZNbHKXFO(-3}xr8t|Ayp^eEzj5g-TVA_MWo$EWp?XY3p z`qm?lJknYxZ5hi5=|ZO}#q1abcLgnU|4{XX&zrVXAl5wPjCSpFU7@*q>Zzw{&?yL^gutmy(sn?bwD+;k`yZ@Y~)1$v@DzXP%seweBS#&?LZ{kj(TY5E(G z!I+L1jP0X?@wn!#nJSy8Hw`&6m*&8l0NNX%n$fa>d(z(evSfM^1p0Dc-F7;6784zR zFb)3D*6@L5t3eb?DUqxJY%)o6&;x*M#u>m+f`ObC63hxFFYSZZt1r(A(;*d+0DZI@ zG%L5uGpwCeKEs`%2`yc|EVLj@jJ%&LGq-7H?HvHhU{Ep6t~}vv!bV5{EHUQ-h}MWO zSqCteei-zf=S)AdR^0>;7npIWOcuJqguXKtQj9+Ok*mVw3z+dcOdCM9X5Cyn24sIf zNCi{8hUqVUVde-Rv1NnzqsCN+EIj(ik18L$0Q3x587}y_3tPi=rm%%S{Hc*(z)>&NjY(BJL~M~$n0yB__~qi;+);e@}LI(_;-OQ>9?v9*24 zePv?p>-v=f2Lq5tsE1c+BmGBhoM~FzLkz|?0p}nMfH|T_#e{e_vo>Hgwc1`a&0ff2 zA5y+AYqEUKCP_0~x1WK<-}Q9{ntjjr)uwToJYncC2ta`EeL@aE$-grIquD`EYsdqO z6X~PB3y9J3(GN_x$tEugiT}lO%1Xs*}8<_1*7& zH$ao?2!bMY1#Qj&P|(;prY`<~@3saJeXym(wB#N%baH?JF8?l^iCKGw_}&}JZOx-oW@n&LQ8@MEvy12j+t;UBwFWE z(Qf9CqNt&-{l9}sKK%XiDL?u2Q?1|mt>12qzrq^2YMqM~FZ})`ANug0NlSh~^xE9lJ>I^qO@aQTK)(XA7Cz3eDcVGz z*T%VBoA(%PepUXf@^sA@*sRVgG~n1&-2~z$AohiEQ`MjR` zkTt*zBt2bgQ+zOc$>L~-ak7fL5CaSWV?dcUiO2@{ z(Ch&NUTClMGc@ILD2IVAw0a_liy##KY?)bI0~=u^&X68h2}%ZA+5j}^E8p{c{*FZ` zNI=E&psRz|008>MJ7eTU`VB`}PXEZ2tz(ZqrWS;tFYP$D7XiuI75(7zZgBJ2>VGp9A8OBc05YcV;Ug&f*cBPfSOFeDncyq?C^0|t7a(4= zF8hETy&qBY5^^qps5p|JVXmXoFhXP`7c2PDRLB~bD2 zRcqJ8n9<}3hP(g%2P3NeqKhtSU48Y{ad-u702I*A789Nyg+q!!hS{+mQc4_v}XE~{Z zW(XI>`XHtdw84))NEQX?{LlaRPZ7D#8Pv{WcM+S|D<$wV3-i@JsMdYn|K7J2`aEa0 zaySnhy0KohE_S{3)|;#Jm~T%$ZSvntI_421M24-y55Mf*foSZJ>@izgnC(zv+;ASm1U+ZU?(YarJ0p#3|2(Bq$+~d3z zK(>Y${;&kdFi-%%zG3KKaO2(nW9|V^oC6AN`3?=4acwQk&dir!ovNRe=IoM$FgLVJ z02%-EmJOZ3NJr_Qdrs{E*!bOTjgWs6?e)P29}WQdr918jO$c!08W^gD0Dz70UKExE z0Yrm|^Eeh~@?!-wa z{rQC_opi6xf?ag{TXRFkVU2v-Z?q z{n*#%G(o;MfZt8?tq0XZizR@Gdn^#R$b_YT7^pQXv|?KVpakZyTvP%8v~+La zz!w)FU;Jct4fyWO6+XT#W_ycG$z4HALM~)6n zIl!l+0o5l2iCM2K$NwQbAQ13up9>uRcxk@$9a=&^w11vYL^8fkszm`J05bgnfbE~R z0ALfgqoxhqk`D(b001BWNkl{vNpg#X#&&4;QwDS#Y^-z*gmfexUo^RC$;FKy0*!;TiN4qxLcb~K z;yu9HAV@EOvjNEAS1vwvTP8v?EJ0<^!df6!4(9Oh{_gLBcE9|~zZ|}HtP9KumAv@e zAArofV!2o=O8^=!0uoiYCTgAFE4DUX3%Yhgl=W#Lk@bUM$kCGI!gKDok7;CFo6DKw zc6BjNeBQcMWo{c9viFDEYyz_9j_a~DM}6;HzhUD8ih%#q$!DJVr0%Pd_}i~G1r8Af z`U{Z9NDKJ9nB4EH9Nw{FZXGV5Z{W@2>1Ogxd8CJE%(XDkY_BKn*d{w)o3#VJv&lM- zsp%u;I-4c=4W?}qv;$1S&sl(--yKi{9qk+D+NOp~j#>1nm_2K41l=bz^vajFsrX-E zMgZRHs;~qDoOs;0h{|22;2Iby8W!f?cNWZ#w4kvQ#z!3KQp3(?*yhi3O0a zu#RALJz@lpVwz_hfCG7^0YJrSU^?1F3y_-0M(UIDkkNPnX3cM&}u#bf421v1vqRHZ=e z0FWKb*#KhtY~OE`UX=xfcLXR3wgAXeip7T9dCI)nq|Z8n_EoGvRm8@YsJss|Ap3i- zCDWW|SkTe?&gCnYzd3Z!&_6kK%9MZ6I;sKz+OIYR4iN?RV>@>5nHGA7nA+(&edf=! zp{`c7r-6}=%cwCr#n^WIQl_DoNRYoMQm0es$$VM?}5yoh_(19m(ll zo(t&3vjezW)v<^Gvdxq>@tTQ->05|`rVIF?5i>^aL(``{G*v)C=E(4G5=jn7^TI;F zvwTLc*Fc!;?c*$ga`tC(pDhsx8;ch#3_mgVpdAvxg{hi7KtR_y=bsmJ9X5PK^k;NA zG{R|7J*~SCc*>gLcMDv!&A-DHB*BOmX-5X*h$-MiE(vsYb^QI`|9#wZ+ikanPZ_O~ zyzkm`+O1l#V$H_Qo41&4 zKNP&E-A0=NHKrUWDYW>9$!vIyq~kAYGfl=f=OX=kdUj9R=z;d7+WmWfiUGjyISO-c zfV|u9GTHGQgAI%%{DS!C#8~-*$#6{sQDHI^z`?M?lw5qt+!G8I^IXyNtTj3~t~ST! zXxU=+$HZ9&&!B}C4Ov-dp>1Qb21G-v6JuK&WNMl5`-M9K#=J0RiS$qHL{6*>vxs9oCrb|FoYIVCM8GBCdU^ zm3{2c$eMJdeaVMwi-Lh3!DaNwQNiFz?E;hmShOxc6Z+dU9%f=`arRj{AKn_2&C?DV zG9Ypt?E=UE5OWLgQx=ooj#m}4IGDUj`2iS%c{USaKN7F4ESBbEnS85rAfvTpEVzIi^8@f>|Pefsnmzs=d0t-}SdkB3j}2720X zQ$?soiORR|LfFK&w0FUw%$8G zZC}xU6zBtd?YS{+f}<3S@p&!k|D?@+B*8OCwbl-M+aw1Cko!oNY&PYVW)ygDT5+?_ zT!-ct08%2S%{+4<0)Qt#u>?7x!NF90{&S8Hb$+&e@U&qcWsbNu!-;%Oa#vHHcg46X z4cS328^m+~5cd^RE1KQ*O6^x+{c2%=K6fBGR~+#P=tt%Ys8a&&7w!94(NB%sS_sWFn?n>tUuT zu@zo7b+%v$^zw11-V<0FaHZfTL6E?Q>`VpLt?6$-&K8WUA!k6&CTxSTEeiA*8u6U9 zt5?rEe9Y)Snl$O;Z?(L(IYuv~(^g*ElFCv~X$2 z)>dn+JVojHyX~UC%T!tjV!WF+b_PHKyu1)5cs^?rKkq1+kb|k00~{QwZPUA%I^Vm@ zqRVxLkC#9u&EFygg#pL_NSLJcd;s}knQSrfxj__e*`8U=a^2IS-Gf()W zSvSldf(Os8=BEpg^WM$t#k8yG8?hA?Ap1R1-9gnoj@eI8#iWS4iJzVy+lfHe77PB)J|8 z!q=cw0HoQ5nY`0YnyFV=qpSN{Ol~=)$Io#@F6~AU3jH}Bl}+w)n6v{J+r&!0_|DAU zL0mai1SVugV#Z=^z`igG3VGaIYxA_VP=CkuXpfiy0ZK|bqAg!@-L(->jn6X*e~1wx zM9@Di-Qavea&XBQcv?=Bd^n0$Z-w8O_cQkBFaolF|1`$T`;j!o#Cd+eetwDYz! z!8H=LJcrCF;7q&YCQgXlUrhecp8g>GZ~y~ye8NeS!gLJt-?6nS6yv##59KIHYwKAk zpgh%r^1c&0_0M(}lCQJ(@!|!mqCQ z1cK6j_`@Hze(r(`LreA=-6=tlymju`Au9o6rN{}c4Cm!zP6wC)-+9G!?UTs7{=$DA ze&p?S)xYfeX$sa}gMN2^Y@r}P(L%D;^sa@A7S0|w@wopqdGa|w5?$KoB=2nzw14jx z3LGdP50(V`5gk(gN7^74op|Dj9cQ0=PM06A0m%Dm5<8F)8l0N`B!d}!ao|qYit6i= zPcQq3od;JtXjmYdAE*noVeP0s(7iH6V*A z4j(z9){ZJHQJ@fjnxgCST+nx324^%`(=v~n)1GK=Ye|*j8TRc4v(?HCbEm-AeppAV zyR4@Dzb->+I{27HG}(#c#)lajOMo?Ew`G8;I$TwQ8d##h0br~jTSQAt{b+M&qFWWP z1r5nP)_$mRs&x--M(~{Sy)k7|(h}2l=Y}es$G~o3!0VHL+rOS&7(5fRccep!7OwVY zK=vB&oS|t_Gn(s2gF;wv(3t6NH%>O&?@f3Pfk|_Yh8*T-(Fs~?RE)xtPd?c?V#KI$ zfgG#21dgUuB$?vps|sOp57vNkk_exp{~8lTV4&U7l0F8#UE0-A{*|?5YYoU2Y&>sS zc*}dk!VlLCRs}a`givFv5bJ;ahV{!wj2``^DO1k+vaVZkAiSu3Z<_*rrNDs#^1xSS z&b;QeH{Sfi0fPozApcm$Ip>|*t&E*bV&P>x$eM9;(B6>NfHUJan3)0YMzG@Zv^kp1 z>YBkB2vu5FXvnt67y#{~NAU2;P1g1S z474wVpkoyM92L+s4nIGDPv8;nYS_8kJbSRTIkZ5486aLHzyNGJb#}4M;s7zJPMG?k zZ3L4kdL1npGdIu0oXsCtYz@_dRR(CUo6w9)A zDn3AK1is+%pA-eDgTCx?;Yxi*m?CQXO-0LNy2hW3far_?o2PYj^xQJpcUl zbKZLE4+ji5>^w>R9cP_$cAXlNeN;UGvQ3l+Jc>O$0A^tZW8bYATW<6A^aj`8b{=i`5^eAFeaN*&7i!+dWuJ*MiO z06C(G3zKvncBDR0EW|aDODc-fW5`3!Ai?K4GPf{W7B9YFv@)J=|2o$)W=zPuBTxXw zXvB;O^E|)Nuj6#uQ_#BX1jiHr8ezgz(3o8f0rnbW2vnMD0C|(XixQeLc{`sOKqg(s z*#;pPs`r?)p*#L&uE9OPInx$cyiUEILJL+O9p&xREY=P8Y}CAkn?u49f?clD3=IsZ ztSRoLoaWcQ_O&pVUvtehA%NNKVePmXQ_2v?qmN+@HKD9Kx$1HQ#OE1^frPNbdzhW4zzR7qSsaCDF$Wlb3Z=| zE%Z13EuqF~bF7i$#*f>vVdI7eMvNH!UsdI8rmor2S6Z~MYg1rjb>oXDNP1PerH2F zZNq^=HlK2xQ=e$dCPvaiT(21>Z;jXhLq9WPMf>pm_8SIR70trT$9?B|n5>yH&qHg( ze9HGHjGquGDl>ojLTECov{t2A3Fx_pl9S|9YU9Y!h(?niC7yYc#rk~L88`UuGJRWHDDh;X+00kn19<`98uWxdsKd$NJd2{ux90?x6UrE)WY8PX4-nyAVXs&4a#WF>^-~RTuqlPza z<4eYZKL?^zf4@Obn7&LHf)%sUmr=ri#Up7&Vy zHJ!P~ zfNUWmSES1Q2av7tn!#F&HBfXE?TRtEM5pK5)(hU9H|+T!0vPQ!(uc&@Z7L2yL%}@; zV$W{`u$7wCw8?W8$o#wkK$a$r&;kHEHO<;8&lx80j-wO>^aRpjwub&_siZ)S8a1Yl zy7xSK430T)+Lfd2S#R`dz1rt9DNw8~(>;~27K zX-|9A!lE@^<~Rfp9a=I+(dFO#=dT5QF_WLGs%4bx#D{DUbXr{ShmsnFR-Cn4`a;1G zgeda8p&ix**02vxfgaGwLI{1%0!h7Qig4mJg)qlw4(o8?ohXGma>OnPjw_ZdUig(0 zCY}11+6VLdi)Xc;)22Xg6gXf&p8fL6m;UspFaC*`&SgsA@0f7>#5$cI7)z-HbT9!q z0HinnGy=Q+gHagZ44@8I@K`)n#uW2bG-JjWL2;^~4Ipe2 z(4u|Q27TZ@v{i#LnlW=$2Yu;YG-)(sKz!i9!F7Ik22%RLvwVakzZvlPK7^1Gr$AsG z&&(RKV-BF9ea<`+^DhU6&?lSC2{MCjJkx;OSO2kvhwuvv(D@sz+-m5>ffL{U`ZvNN zaQ^w{N3j{^g-GidA8wEyg8xFGD?xPGY|lKS-SfOl6zhOcipiQ+24wRBTOGV!^4|4l z+K+%tX~;g0Job(RO+9n-+_&f6f80^W{>dq)pFTtPY;8kHn*s-u0tXDpZ@=;OdCxri z#FqvP95h|22_46c8(SB22=l8pT`<~|_SByPGLzmDDBI@=voK&dBG;hocQZnQJ=n-O z^0}ve+y9qM#W^aL-`zKZg>y)A5RaKz9tY2~57D6FGkWdY4HIE`8OXWE#WE~pz^ud9 zS)#qUFZ{U5kDW1NMr+oque4<02*w$~OS%s2*e574k6~gg!h*G4Gefsy|2*?z({cE{ zOTKM3$MU>kV%`S9?$4}(=-j6Bo;^Rl2VW(AS>}mC6xN1aoQChAyUTU*IW#VTGFozI zu^hc9|E43|t)1}>(+~fofS-E-TC5I4T}SS*g1M}D(?*oZEW#3PQ$PhjHh+u{Kmt6O zKc1yj{yI*f3CR501uLMd)8Z^70Lb)_Gph~AUJtAngQ|hnYn*}`XzI{`s%*F^9DUym zcI;Kq?O`)uU5NW-O^ABgvcBB&gCEG3{9??_4IjTTXhR?xW^3lu78M>>3&X{t76LRb z63r3gf$p-%MQ-vqStZc$SFc{#4Up~f@%r<6$)M~#7Hdm@9L0ImAKsxO^y2h0J!8lG z1q)sqI`r^ASJeF1b$#1x-Ji_6{jA+6a6o{}(-f_H`UCgf_r;;Z4!=>%d;pBi2ff=T z6dRzQiQn{@nwguK+UyI{ff>RqZCbTPO#dn^EZBQ6e={UY?$$1Hdp5~(mqEh-VSk{R zi_P7Rh|c91vle0ok^!D}=(j=8=|%v9^GMAw&CGcY*TK9hA6o?iWS;dNn6)1YSUyK{3zqgrs1;NchnuLt@+#HLMwjK{;e zatwi^yYZJsP2^3LdjeCsO{dHQf&%aO#Y3AstP&7B?_Nh<$94^{o-N4P(y+M*EclRp zcC^jy)+|kDYl}ReKKZO@uIFBWnKAG(-TLH1M&6Xn?fI@Nf00YAef7MAJv8zW%J;tN z>gkbgb(q#KM|ax&ky(SsU4y1L2d6zT9?acu$z+Wmo}j#oFTS{S!o;fI(1{mT3&&k} zy?MQ6fwJZk5+1_(rFplTDWdAtKk>F*61tXmZd`xYMHgT8SK1G6>ly7LA^ptD+mGv_ zzyaf=7WRq%^6h{5<6(n`{`?tdo-qh%-Db`(o0YZ>xS?KVttZo(8La)rfD;?m+MBge zZ_wt34G=B9Py=gI0I)gP?-39b;9i-W?QiDU!AwdZS>*JVeB&rLn9S2=%mxRB?0_Dd zfa#B;x2-kXoX+*GT9wCaP~{l_5^efGhtO`{n%wd!mc*jh9x3s7d1uECu(9)msf!Q=`c8dv}o(umM#O%M9+xwgB& zVC{7SBlbFpx%S})#gEBvaeA2mIRp=lhiB2Y&mcAc0A!ed`S*s-s>ZYni$E_v1F8W; za^=KY*;S>wWk9x&V?l@OBG8WXGyKsd@)|$}0Qnw4#HBO6=JI;Mj9FTHQkrJ=9vUYl=j zWUi-O_TehXPSy(U&FN2e-_+oqEIb|;may2XGFe;TVSdOb$IYO5-n?k>!bi_P|DrF+ z=l_^!+m5#0>!N61u)h>IV4Tz@IOd`I?)!hX?`r+3q~D=v$WdrPj3=c1gAB;cfmhm9 zSGtllK{l&F(f3#b%G#v?!BL+X9J6Lv14oI-In5X{iZ>K$vpXgcB$3hQn8c;Ad6D_`3 zwYU*3h!(~y>cAX>k}U?j+vn~%3Qb*rOq<*E$2Ar-4CH)=#fRhnA}Fn#nzcx$JUPlY zj#^ahZ)@j(1JA@PU9Xvv*K9$p7Q_^(W&zT)#;|F9Fg5uPQNOOnOG3AaOSp}fNTo{f)I7CImHV4zVN~ek<)$NIcJ3+S;s19y}1Se zbTmEu{HE#Jt|@%|rZ4*i!3;pw9@+8MTXW}3JpP3LChO5R^vw1d$$eTF?Thw@0{sEV z!)MNz@xL!xwD|W=ojiFoj0wh22begju@Aj#YN0*d(%i7#aBMzD7W18hjnEVggrS|5 z`n634kU`Q6B?EN^@enjhnh^{!Yr~n58$c`wWM)t^#Zp{9-&eHQP0CJJV_p$FsIE+qkJF7{rZ#bV{^*m1 z3utSA<1^_u@%%EMS$pSuM`3Rg5SYeM;N$Ii(axYjhegiu(Z?PWpkO~eba(q;0I&7Y6Ce}COo`Ti`PR21@0r3u0CMaNX{Ef}=brYYgVI<}ws=4%>Vp%E z*r8~A&bdbTaay5;QTN|_jelo%N$iV~hn&li#<}Bi10eM2Z|-BoK6NfJjCha)0)l)VdgS3?m^a;Y zQ)mh>P17*6xn2&kH*I*QUDu{I9c&IZop+X!h=4Ws94_tBf>I2!1gTXiscF>|jjKs( zqLlF|^1Y8(v=7*tVHR3w)6vQi0Z#!CG&={!m2sMhyRJ7H8sDuE&7OVsSsi4*GR)H# zUUWeOD)Dm8HySl#vLFz^Pyjivu_ho}L#7>s73PhX^Sl|C0oB5%0hu-dQ^!1HP2cOo zYbXQ}BF9Ph(H^l+nP+15&mi7hue<%bVFC+$#x7R&54FYzYCYZiz3+#m;e4GY7A9-J zP^m^y$*-=4zB`jJAVdFf^%TJg?G-I~-rPCim!^Uj^s_~b^=3;<24wFazvsdrwxGDS zIrJy@Ss@WEf*EbDz;@?vU;yaIy$|dv)}lQHUC@l zY#&*&Y{1xi>pS1pZfngo*PP=&%72U@fg&mVn!i}s zYs2zh2CxGF$O4Qt>loY-DzXe^A#ofDQ8u}b8J|bzS9*s4E4H9qkO#2PG32^-@C!s1 zS-)Zua}3p?M)1l@fS^gNx@1nUFiCp?kRN&MQP1tX?z-!eJm_G>=(;maLL!iqav}xD z-K^GqNu@yra{3-)?l8-id&C&snkD7L&ZqgHFi0}L2_SPUe;wL5a;(8hRlb)1i zMWEwZN{f^^z9-itV8$aUL~_*S8n1)UwB89yxOexMb&LW4Nr}{@dGqJG>zr%D)z5v` zIkB`9$BhA5?rJ}|#gILA9e{?n_zm|`fSzHxM+|pm4v_!LIa%ufvOFT1bFFvXi#VPi zuP@xdFwdDou31W3yifH1L5fmrD`F*Q?RT%DX5(J^y5g!UEpIy1ZAbZ03e+)F z_KcDej+4w;LR{o{D_1Ocg#u*~g^aZ#9)%Q`Y^6Syp$bi*7_e8x%C|gZ{~B{*`y{>o z)s4H1H2Agi&p-c%cKtcF^;--?xx*zh@a6$IogTG%#mYbF?(X_*l}RLu6i_H3({e3) zgGPcUz6r+zV+`Zgd(2W!(1bApl0Vg<&URPDR%on6`@{svqTh%Rrq^n5 zhc%$MsbZ#LL93KuCSDkXeg=%ASevdtRy-JopNH=e4>J%|tV|#%fZ@9;j1Uu-6i-G_ ziA5?Ft-E|JKbTnD0}nmuEbHs9zdmv6g<>U{c@OOzV__^I&$Hs10J83fk3Rwt#s?q+ z+>8MQAyX>?&{Pc&xDm6SNFV^?^> zLi9CYJ3=mPS)1ZT>)H>zKQ+pL(?dt3M5=I55JkrlNZRWvlM2X_TJ_@dtNs3? zL@;i##kn4SlkwDrdmx#UQNV2dyC=;Q8#RG(h1ROCd6NlK9&uf7+Pt;h=IkLOrv0O> zvo-de9NRjFqHp;OylFsgI&fg>GtWHpKgUfz<@ZXgB0K3Z5NtAwI|yW*XejHLs~XC! z#QU*@s_!YLC}5UrRTeUW4WX~{l`5H;sktmSdJyt4Kx%xjtYd4+t+;S4a+|pz3vAlB z@Q8$Sb}UoJmJ89rzyyMwk?rE5BZ+Z}N zeu-bpLdU(o-8>0g!+GbO=V6%*8#b^){kSSbBJM)QT}~$?6de1Dl`XwT!zTSkbFOY+ z%nM*4QeM1AiWEb?eRVuh4*LheK9pi>o!tYZGJ3&=ybtTpE> z8P+!sN?+dfi(jTLeD6g`KV};v1x;Le0hC_{kOx`&c0QHXm&t_`IGCPd32_^#gLf;@iKPq*gddm%jRt(hL8By4}R!_|J#n4BX_;! zaFjdXn*wB8*wzpE<%JtJuK&{XQ>R~SqNkwLge(iWq%3LQC&42y%?kobQ%_+8Y2tES z$}KBF5DWI$lH~s-R*M#ZWOE@@u#hGE<-W$9hgDNf&s(|!89)fkWd&(GoJ-)P@x&Ic z#w4YHJXQg|fY>d(@F#0&D52nU5-Ji2i~xNEj-Mxh1tm4TI0Z4!zy@YaoI_*f`>|!F zdBPRRJa8|tB6!G+4q#!w;g+LcE~Ol=zwyS5g^1OV?NtzaR`-*+R!D&HDR!)R#5&^q z+!wxwz>{m0IZbH@4P1>rp@P<*DiFaKBJ7XTU179htg^FfwuHVr9wBp5Gi2;~e= z!`h@Y<$H`MWi1GkoM{w;&@@6k1nq-kiO|eGwfoj)_djj-^_Rc=rQaXYpI8GZV~k&l z!Lg2YR8}Nmh4|6k-I>~9q(mB}a9?MgI>TMpxT0evncw(2Ra1*_keJ&cFBs#|8sKZJ z6=K%UuYIwjyQAyz>ug$USm1@D|O$n+4?Rr=Nc0LrsSo|6=Csxid_t z=9QEt#SaS1x{#aHfsG>a{4-XoHglq>CJSEa4btl6#$!{7r5ppDK$6yb2=PJ_Qv3!0 zlBLXV)q#gGsS=YcRK_8~PfP^TdE7FL1wgQ@0Zhj1ZpD!H#BUIWam-k*(O7s55|Vrn zH2(NIvC@%o1&2Dl`kuxpK;~Qs9RBp+{{WMUqNqxjV$N85l&%Dj5ta~ouDjue;Id9q zWyI{wSfoLLkaa98R$&3o9p6Lpj8(&%xe)_j-h+4@C)QG;5ET?AE^1jvtRT1i!ubJY zYFqd8^f@4NtyuUfN`r7#tXu@2*ptAq+$|sCm>ic!d1=y4l7-2f!V>0K5V-&>icz3& zQh|$WA(kA^cMQnP8C|oa82CO20OYqmge+pEEe2$M$C_0~F99;|GbSf}+4yClI~ghD zDrNkd+XkfFv2SY?VIDkdm$jEY^vmWu#+DEFR(r+;Qbh*Exl8Gi^9ju%_UN8PDM z^IBg6#JWYq-~#YxTmOooir~X*Y4IAb$KnEriRdNEK5lj)OION`+{hK?(LhN4>}Nmo zN>^COK32Of0e5_VRFj%>Dc;Gkb#AVK^GlI{l`N*LDu2Za5yut_oc9sZ?p`iUx?C|% z_XY$&=KQ=**Cm=1bar-U0NGfuN$+9un{9jm70*26tx+jTkN1+Fi#Ogt62*?|uBkF* zl8^`0xo~BM*f9+_nCok=z1CgfxVBm6WhF^9FeyU-vK|6tc{AJ^iwckU_aY0KmmX&~ zpyhacUtOH|O!0L7ufi?>48S3NfWk7G<72Jo3=2Bs4=Y^@J^_7`A^6b{LY@n*MWG>| z|KPnj9w2j`q;zVJrz$=A=%cAyZ@txkTlS*f~y#w)9s_oO(*mJ8ow+M`_Uj!Z3=3xZ`Irmz4=sE!bw=e@BX9`XLWb_zrY4vjYwGrC!(S?d@+O}n@SA}9Nk*7`kn0PYeMIHdMT=pJL0N~|G zvEO4MOJNcq3skZ#WX8(aRh^A_Q(bIVK0~S!zvDZ6m+_+*cneQc7`WF`f@9!(&H7VX zUl^~}5XZdz_S^kjFz&f0ifv1Q6?pk|gaaSXLdIo{hvAMp?nqsE<&|DH9S?<+zhf$_ zuOq>dH5XD1ZOu@@Yo+yH=3bwD)f~wPzV?0Z`>(v}>O;p9vboQ5GjO6a@MZwH;)zEex_a;Ky`P^jar}ZwQ>PTV zWoG?d6L)ITb6Ab-AxS0gC#glUC|X()HY5)T6Kx1KO(yL{&^tw3317+Ekp$1W@mA6w1CMAXM%QcJpo(HexQbus|T5|PQZ%U)u8RtXC08+S4fSw*st_-;&e6H$uzE`TQ2Cg8{QaXsZW4hT*(MxbyCz=SIl zF9Jfo#O^x}VyjYiTmcKL>WtE8--%tJ&O{ERD?b3P_u!hB*TTDS1?7wLavcJFDYJ@$ zb1b*iO+koVtzs7+3+UvH(VEj*<@u?no=PoQvc!wTkl!m$1M{SNC*{|@JFMHR1)lNt z*e7rxP|Q%!=*LWGgnV}oHHEOj8wF&|A!5N5V>>^`U;F$E9tS_;^!Z++n|l>st6bI^ zE}w}<5(Ba;fgudV+ERaQ+f!*vdu!XbfA0fVUHZOn%vrc_wS6~NPV-m-F8BT$nt_uB zWOE6Rc<6z9{;<2f>(i4aO`LGbw5j=Sbr`nNv>iZp0b$mM0|!xLU*riOyFi6x(RVb) zCU=no0>Uy_ciOCqTgISCXBjp;@2N&~Y~A9zmPLyYiy5ujh}nRw&CatxP-GTa#{7o& zXxk?jcr2_=_%1|gBNF0_QNS-N$760GMlCQF=?mpU3WCo=05amoQYa8i99OPQfk36j zOaYwR@A#QpEtgs8Ot(x8sPtPEq43{WtX1*-_`W!{*yn&SiV&dYR&VJ0tX{pb)yDt1 zE@GA(6G81nAI={DSr)PYSxrBbhr4~}E{}Uc=z?q|S2|-C!0~^vpk)d29)Qf8t2sS_ z7fab)-u6e__|m4jgzA0%h3aKl;&++-1Gc+8nAAl$w;p z;C&*1%orLi&dYju;DHBxZG7Y-AMucZgZv4&th1F{tzYDcd%x^DSmP~6np~kE1VOK7 zDKOg8ahpheCJR}6NBc{Po8}X@wRg#~x~}VAetAo2dGYtJz5YZ0WhF=V*>7{M>k}4w zxi21T22Ki)ZE+X8_~Oc$YuCQ?*@FJ`ho{e&Q9XI`)VvC7Ea7f6G+%RFBRFEP(jXiF zlk`k;O(vDDVi%GG1mAmIx0@p%e<2PVPC&k{gLbg0c`Z;8fs8QG!nFhMajLV&0)MY5PRG^Su8tt?RJHN@`-?@I$ZG^kMY|B3leuZ@}`?C?!*& z5P5XCZ+I1$7p_H$2Ipq{F%w(lBhJA*^IO)XyU3667z&UzCa(G4zx8k4iu0g_0J1zhg@uV%3mM?c%*g1`t^^Wv1q|J&pr3T zWj2PSRaWkin}Ihm11Af}rH?#v@5TFe@B6%2!spGJIiqyy)akx)TiV-vvBS0&yI0nM zHj!JGRs+}thyk|*x`ez4BWxtakdH}D5g^--v)8@K2!v2Nlh+coDw!w(7edS9f>D z8nY~Hu7}?$9f@E_pdw#d%*=4xaE=o3KL*na3qkPWL0R67$YEv zdmPJ{vBwq5~fVNB9Gf zP#Sy=&1Idjx&pgBUI&@`99*9Q$INvEPe2UFB6Kk}&Y@O~x>r(8V?bt3rDVyY;a(jZ zUpA*9mJ?ck@fsBmvY`f*HS#fmxO@^Q=A2=dzTUSCkbL zPaAjtx>we1@6S*D$JJL~dz-DVJvl4+O(0S3r#=HG3&@ps+;RJdTbhr2*4om|ve;S? zfb8HINLq3Y6&c_vcFYOm7$l2bts2EN762yk=wL>l%*~24UYdDT^A4TAVO`ZKZX!gqAMJV&f@s-As%wH(b0WpPGWkei`f?u7A0PqC#jo1~q1_BnPGC>04w_wUJe4~ykdRxPIZxgCb4c0b9H6K~dtq-FfGo?hZfI zI19|La4sG z93?IWpRoq9wpr_dGFGy!!}hi7UVh@7a~A!tMT^c`V!uynvF0AR892!qc*B5fn;_4G z=;-_Jz3UHq`uhJk-P=3XT%GymvJR}{q*%Rgbhi%Fd?BPZg*?(U4a`kguql*^ld*z> z3u=&cITV-;bRj%l7Yu{l`1pESHpPOi2;&TgJ^`2t6a$y2`TsPN;utq@1Lr`Y<;uPtB z@WBT?UU>e67bGt5;L;aMRo9$R1^{gne1IcL3-g0=1^Bt=AONdksGMKtWL&HfEHMC6 zOk%fqvH)2?#P1Q_#PDFea{N`RR+)9&kh=Wx%iV(Y+T0<`fl#KMpe%1G13YW4nG0CZ zJSYN!GQk*Du3VYA=T~?8y7V{-ro^dR=%KL52>~+7qmkqoM`!3sj+K1xz4xZ(%$bu~VCyYWiV~$|sQIB1 zT3+5@*SnPHWWRx)834PB)5E$+UZ32XzSu({jTkIh?3v;pp@y;x$p8x3AR1e| znTrT6Kpi*Mu;XjYeqXHE{X2jZ76i|6tQ`wkY-gSka-@$ykdd%NDEs}! zRTxN6SjaqJ=W{-}n)e?(;8r!DjH?|>3qlubPsilD92+3zdO5F%Xz~BuU1|@Fm-Ap* zed}A_a@Q*3A=L>mMi?`n0J0PgeoG#-)?+;X0$!SDNI8-B#g|P`04Wig9LI8L0|AjW zfO5cG%Du{a;y-YGM+tjLl`h!nvK-}Ip?`3{?YG#o;SnDD=P`6&Z^_(Ls>G0ge}ERWT#DN#6*v@i0yxo=$K6Hh$h>);BDPkYvY z#qeV#S8H1?`l0q_w(`t*d|%nMcpN_Dk7LcU4&)_bzl(6_$Ioow_%BZFyNmNqGf;Onixjip!cs-51!SZ0bRP8v4&_;Y(QYEK-F)T-I0&qOnku5ZCAN zdE)mn-~~tqD>EY$qZt^={Ty2~Lw!DIKWBq7Ckf}11%=Q6oUsrQs%&a~CPAvMOcL-J zYcpJk=FSgqHvxg_sUPm@O$05jK>!lr#OI2|t9+!Bgdp9S#X}zNBab}dB%U+RT9D-a z+WS~-DxH|&0T>Gzp^88vEhyj8+^|F`>L2HR?0qva{vG!07*na zR3=^73gld^2gUv6`u8~u9j}-NDJRSYAW>41q?Hwgdgh!<#4dNaQsYJ53J2rY0_Ay3N(;hS$x z>U2Y@qwn?*uIVB7+z=8COWe65FyOs1SdXu@Wy_ZNy<=^9rh&;H$r=y2WR=p4<&wUq zbT7urdSJd-|A&t>;=)cJICOZ&X|rd4?Xt@*`;m<|SG_BTxhFjXCj-cZE1rJ(lAU{Y z{Ef+zMYYv+r3i9d)K2KBOx%7{;PP0Eu|0iZhqNaW`4z8?tFz~iK5F-~?E0+1!3Ikwzm2qnN6Axu$wt_$JGW>?F|SP;dEhQ^oy z<)HY)fGkUd*epVc@A5f<#mkz?Vzm2YStF@s&n!tjX8n+1DxZGFd&v1S%baoV zGZGbm$~hSKs8M6wB?u_%xUm8y3z>7HBw(=s!hoE!#)AtKKyYO%xNsSlKpJZwCOC6u z1^yj?xwc6L6v{PcjMQLe4jB(=N>XSve{n3=*A^r>du}C7%UqpQkwP(XMZoSWf}C*z zer2X`Vu_!9&Y}!>I9blp_Tq=uY9`bWeHdGH0&IB#1ju|HB`9WCi-0C&i|@MfYu8La zXssDn9s|>w`4)p&fb3&KCk$Jxq%_jiAnnmlc4 z($E3-cF2k5IoUhDvxjuG`SpfMWWc=$cQBO!%9}s>(PZof$X+?^O#rgmJTiYhUKy;{ z*Dn>;*aOHY=MIIz#vR)>{*^8CStIMm6hnG}#Dy@ds7gAdU^%&U z6)FK?2qfT?SZgukIzw6t_d`G|i$|aq1G0pygiQ>(*#LG-%bB?9Zvc=5_*^p^8DXmO zh~9$E9&CDClp^CuV8<4Ew%~Wb3N@JJl9hGL?}+DOl`uzGS!np2gNIvNkaWyqc*Ly2 zCCisNQyF5HH={7uoGb)@7@*)4zOhhuUKtbUFu00pdxP4jTlQ1HI+ zT3#0?iiNo4#`Wt{%a<;5S1tDeVLfj282>+j&$^yxiVAtH<0npVfaW;dt1h#U1;Vic zpf%0)_Ae}#A<7YWt1!@-vt7oye)C_ zh8U22F1(Cn0?5oi<5>LYV{XOXfA4+1X1?^LFS$~}aj=k`*{?7R*A?J+C_&<5rW-eJns>3c1*7lt{d|mF?y(`_-)xG`$*Io5jvu4eI#Ez9Ccjd74 zq-Nk`0C~h+ci#Dlt=l*KY4efhaWkgREJXXn5=Ph;Wb%(oGkrz{9MbSTF4muPE^-DZ z0yyL%O8|-B6>F}syILR{e_!z)fmtjFv$gMxg%XiovcDq%u9=OGo0;un#gG#ePQDf_ zR0&;mNOHii7IaFh0081DWkZce=Z!67z9&XB&$!bN9smYFs`w+XYt3~hA{j300khB_ zedyuTbE{XSZm`A@Sjbp10@!Z*9HE8~MW7B?`V;pVYZOqfG6jrzAIcNp@#|3J1TaS+ zV!4XR?D@&Xi3?ePfZzr!do8w(Ma_8;s66vKweQ=xXSah=)8R%Rt4LR37>np6mv}rz zPY=TNYIDW8aiNmtgOCOcU74{a1^kBBq=U_xGdtlqm^H^U^Xxg#CemYoO>TQa7D@zu z@`%@tl&1s)5*I4x=3em|ue^mTH^ghj3g&y>2GU%~;v3+hz&pWrJ-<4fkJqdLRmzjA z+Q*_sFSzk-iPAuV`A6}2`iaG^I6c35jaNSV@P|K~)TTGZ5vAJ|VD5J~&xruC6UJKcaf5!VNn~?T;pv*OS{ehtPKfD+*4E&9wtrLjB80lA_5 z=EAdn*3PuP>YA(F3KY|~q0wTt=8{tjN9J<0wHw3|m5ZA8nF6G2V8$Jca2K1J6cm;4 z1e{el%;Vb--vnMJzYia7a7HzRGoCp&ZTrZRrqdGfYmUWrFn6a+nCOh*_SUvkr4^{b zszrcG*<&u`l@Wo6Ibp7_jIofpzapsBRoA%Efm@t7bzS}NgnVc7#XaP=iO{ClM8eRI zE%8kJ(SV=h#;jc_mK1k#cd?C4fXw-2i3unG0l=F3h<62-uhxF0g@^ze?yVm;C}+A3 zXHkc_^~?u6RbEFUId>rydIE^8GIlw&pi#hJTYvV?K9d?VdR(GV`23kC*1qpN2zw+T zpE#_KX(2}nEAeU0$u+?0pJi4nVE_PGUY2;BAJ01^IpF&c@*kEv;BRBaZOz)Nwfl%? zg>}rix_XkPAUJq~ES>%k^B0mq+#69Q!07<{kH(jiWN{<-Hqv1Rj?tBnvd+5}S})txRj zrYiza@nW=4uk2*MQiUiNN>=xm2Z9kGQA{pmgRq3X1W*jR0?7FH*twF}1VETaT-ahfdpytFdW;_nkyzVh@4MXVH8&gJ zVUg}LtCr(&zlv>)9=A2%lkn%7Gu5vGIYwjkR4n_$S_jxF?OFje-G3}?kAa$H#`Oc* zB2x9++QAAW{RqJ1SZAGemRF79IyPW^5<-ywHH%+ZA-h`rNSe=8Enl7j_lII(T z7%SI>>z8wE+O#R7D51zuuNshNzKBQ5?X9?@)@|I%PwPvhGAV$vmc4pbATGuC*GX%A zNhxG`iQKxj*f8JIdrrc$Ywzyv^?SpbQjKZc^NdqUj$6-mK9zhNwAQ2eak7StN$;sY z{i(+ue#Ga4&Pm+oTW|fijoIA1!7?W1o^KwFU7!0dnSgeA9(j;%@{JCFk<&0`tVN)=81$cy%>l-;q}x_N#m9 zf=44;xuk`OUoD)2P?nUv8_zWgtK~eWUtYhyWBRmd4_beXhzwBFJggSZSClAZK36Q?9lf}LhzD{ z+FfaAueMoK`Vb(H6>&U3&bVj8#l)Llg3tG6*px$kU*N5CW`H>qPKd2?Sr4(*BQTcs ztn&%- zn0T>?_Lf8evSTCk)MSCz2*m=k@E|g+G?(=ymt2yvCLs<~hb&I2vYW(x>+N{1L|Ecj? zSG25QcfE%WO(Mo|J+jE$6{r=#lyhU z+1C))08Dvo0$^b+yM=6pHOME=GllAhKm1{8msxwv=lSNQf1lMg7Z??wOk^x$l+YyR z{6+z}(dM3O^wc2(Wab?&5%-OG&fZ@`DWgLIaz_H;Ze6?98&`n#n%>03 zj02S9eDmgcRzV0eXwD^92GSw@E+}#+XM}2`l%fctOzu6fpUQ3no3?D)ecrhj{OqzT zFZ*#_-KbaXIJtOo4u(&723{ACZQ~T0D|7tHXPh8CHWYZu;j1aF(0W1*7`EhNcR#HUx0l0F(``@s-7&#X$CYzY!qI@(`(NkkAU? zEbmQ>&IVK%vwl1Or0H8vwXKN59(#7Z@>AjVV?Nbe-Any+-Mv zzzT|v{o#$^d~&CGZfjd}hWMlg3jl}GH+tGT9gv@WZiSZ_96MpWpBjOtTv)l(U1_je zm=MAeSE~!Ih!G9(NAn;hNIBNLMu0ItC03Ax@f0oZUIgX~5aam#&MeBb-HWtYmjmYd z1hK5xl*MU+Wy|>On3j5Lb-m1MWarDb`{$-2<3d4T&PC8;-grnc<@(gSn8P!Vg@I1) z`M4ow?3SUCB6Y8Q-hzV1isOCG1rYFmK2v%Y#}~Pa`zK`~+?34rfzZWoY0i)~Z$-nw z{hogfP;tDguf8gEmU+MWLpmK`?D_N#!pZnzK=yl{<+}Fk2pGx#S$9Y5UTFNgEbQRk z6ALkT>rESbHnHnu09gt(*KxS9AyF*t8VSqbkwMX79eZYi#m1FQAjL=X?h15XGEax;9vdYstx;ko1@Z~3Do+@|kU2xGwsZw+A^@j8vHmeI(E6Jz_ zpUG{CAa_9;0m)ESVGPhQIK_aZjgoA96HEaZvyV5_@nZ{F{}-@jThVfJY8YJTr1X#7}au>BA`Xsk);Gl=va^VnDKSX)#d_~bd^9*LgV*dy@3$q6{&iy;JyhH z1UBzG5y~uM#)M!&FcCjp{M3_PK!Fq&;=?MMfl!y#Q_wj!s`66=g|j#|_p^iS!yZg#3-eH$nlX9VNIMSCfGg`! z@m|(vyYUzJ9@a3e1Zil%Jt3CQJeft=Z`a#n6{C8mm}1$|*4D9o>(-u*uC9*Cs;W-A z{=Zg)PuLS$7CR z>IYN)4#BEYnR4}@O~c;QYXPx}Q~+d|&w?O-J#9GtY$(8W!I8BYv+r_jab&<1krL8k zbPiqvG$I7WE=nE4!59Ij_K88*k#Zpdmue>Sdu?QAzJ~L89&8}kWD6l(W9%`=0G?f^ zTx*%T zJnh5o7q2sO5w6>0SUv{(%^Sq^Vuv4bzTB|*T4Kq>Y%w_`5bpNZfbxCU?FA= zgC8LFT;R}KS=J(!cavQ&53FLoKWs#j4{bn|wmI)v+7 zpwKR+pscLGo(p@@>5}|(ntZD2p02J@O&u-Mnj2eY8S8eMO~wfJk3dvPSZpoF?r8v7 zu}Q|=-Ie6eLX1@U7}w3c;+Wi1Pua2u^LP005eEXV0bte}-(&7dLWMH5Ow0yl0rEhf z6$LSHdf?t)c^>xENt4~X^YL45NjL{K4&SpVf3VZ>=y=RI@r)b=X3@Kj?mAh>QY={~ zxU5C&+HVSlH~lak1^YsALdW zYc{eF^gX3=NC>#qX#yt(z?ivF=OctC$6+HQ1e9m&8{PgW*e`l&wz3cd ze|$~)ty`sb3@Q>yKsyWAgeicB@Zk?q3V=xErsWlQH_YXneLTf24g)T!GmYinE0dhH%rRMg+m);3U7Rn^j`mBy<-?3bc>=Prx6)rFm|L#$vO3me7-O|`NuD!E!p-I9E%x0X~)7v+;r>DEp z)|KH{VV*i*X$=5!2yb;g6QQZ2J*jIh!kFCna_RcIvHKzRZ)0PV-$(vf6Do{CYeN+W zd5t1Um?5%|xtI4CAmd3mW&8wRFaQ11pEg%Eg-pB2{VsjjPSDlaK*wOC_IUOK9OoV`8e9b>LRKS%sPxh;342079Pm9-k}5%vwQNlEuw; z2vhLK{3?Dud}KoMQrX80U>%ps-{jNRju6m%EG&r-0lh?^w=?pd8*$1jrCs+OJ0W#xv;pHsS zP=O3ZBPgl@Si;_o=3QxRYIdb~-=4iL$58mhU&&PM3ZzP1iI3B(aVC5T?t#2C{GVRk z{U|MTmoh-cv5B)j>ch?<>=U#n&$I*F41T_*g*z=+q*T_dSQz?iE(2H?cQB zmc@@Eg-aVCBukGq-ihkL4HVtHs@{CgIrZ~zXZA=U@V zLGzJhZV-$j`Pq5XcARu^VPU^L5A+)&wY;RHtD>^9%|Q9^$ok=XN=nOi4D=6dA3JgU z-m;RCrX!7woh^qtI@~Oz%w;jN2 zfM2n9`}Q%1jvSeL=YGqnQvHbdB!yOpMj2Z2zX5*|f z8Oni8uLH8L30&48cARY?XMjICr@M?vd9>>QkiEGBfNHPlR>f;PYMd7(fb|!z@uBv$ z3}Y8yl#dOeCtk)(X-I3$^v*WdGRGwMn9zt~)_gw(u1MK_Oo)kAbKMljipuJz=AU=&7meKYf}KCdxPE8h=UaX?kV#q7bx%F<#6{08 zefIa$1$pP2;Hv|q>Hc#TDNPoeLd&Fp1VRKbc41-<@BR{Ew+?nuAp%)a0!1JEYam-iRwBne2SMKK+#Ilbepw_eE#&HQh{a!J@__z{ml;Q&rRSpwy z<6KxUvW~qXRS+`S3P&bwD!#P=?0HL;v>2cW8&#B2j8QqcxaLR=Qpy>Ci$GD_n%^=O z75V2GOBI&$3TxA-CJV6 zj5o|nI^EN68BzUxHjZxdz;u+9mb92qZz?FvYqmVP2CL1y&(`1m^2+jkCir((j~uys zbbo)-xXF{djfs_5wyReUm`nM$0=Or-18ofyn(|t{Wy|^ryLaz7tL1RZ<+f24*m@gp z)^fS6k9-F{i)G3M9j^@vSTJX?H$q^e5~yP8^BwNBI#jV%%B=z%RngQjDpv4(&0|dx zYBCEs&#by1{>Q)j{zlnmU3D2L?iPz9PqG$_oi>(Iv*cT?GL_$Z+_iyIZ3#m@YzNq= zJVoA>`My7=Os**J5JCr)$&y-U9bAQ!J$zWkDhAAkIlg$0Ed*}@!di!mQdi7H%> zLs(#F;4Cs+ZfN&xOj(wLT&W=!Rr8r`p=uM!LROA)d<=oH05JyBZ1-{O-qOb5J3}2W z8w@r6p>jkSALkd4#>6g{FF^@uY%;4a0Gnd0Y*s)JZJ*7n9OLXY=I4*nLSn(9<6}|d zdC)l#E}Tz!n;e5VREbQ1Cg1TGvsuWpsJI4%App$(mDYsYn4%E$sO1j;<$m)ymaV(0 zO?ayEmFB|34Q4q>A@TI45Y)4AnY{NNioFIvopztvtr}NbzC}iiU2w=)z`M$di+7Y& zRvswH&p%?XTk{46noYrL=`Ag7w)3@H?lBkM``fT|-zs?kFz;Tzy!z$+`%l~7eB?dp z-u{d28s``qj%4pumRA_(r!Lb+T5A_Yk9pU9WSukb+;5aBz*u>^B6~^saj%t;uasLI zv%IDFk|&Orr_2hFz!bjYXSY#p%7KPF?m|lk`q;-lma49;@%2z@3MQmL(#euARm!WD z6)19&0#HEshaFy_1z+)&M9cO3?XD=pq!xU{#qWrz?I@q^8-Dp49+ ztPBj&=)-)(%0vwKcpx~J1ekXPYHKmqqNOI;{ed-&pkd5_wCW)fCqrlu1LJ(E@yvOs ze#IZfIIt7|X{-kB``HW5O7dY1XnB5R?Mp6LI4*!(Y6avy-^Bm`AOJ~3K~!LvJ3IpX zVI>5YAF4%vL196c#R^+&-WsjC*Isiy?kZ4>+Z-AM)5_3_We=L-!Z=Ko2!g~_ zZ2QAYjs_BxyiKI#v5puUiV1(7Y8NVJWt4sn6*0Ju0{_vHtMMK?DpLZ#C8Wope4w~M zhJ=|vf(_jlAZ&6I&0f07TwviAPEG{1E zbRu_>Z!EwyxLM;O5qux5cn~Pt0!E;F%~>RGG^p6ECXH2bF?}stgN=n%wiT<5#BXB| zjDcH%Ep~lN2*@IdL7Zc;c~ub$*CJ!&fj~u=WH$$h$E;&#-V5EDvV}=}y{gv?IJX-x z0*+ow8rPz^HBpujWU7Zv44d}=>B_3|O#fcLZc@}j9_YGt>pY%pe`y2cUUPAFOc+0* zzq+!r*eV(o*)j4CA8g3CYt0`p*JeePF|W-hXUFe10o!f)sTMNs>$V*A*6P}-Bc*(t0_Hk#QO`XfG-(_p}t&kvg|4UXs^USc_2M~*yiRW6|vwnkYY;Q{n#VlF2G;KNRuiSXUN4`9I>V*4E;j%ob+#@#wL(f3oKmPqc zY_p9y)`WcVTq^`{#T8eiOt3n8kcH_~RNKKUVx{lsP!6`iwF@~T20&Hr(sxzSN{JDp?Db+DO(&_%I{2`OUTD#w)H0mhtL?l!pqi5>F*v;k>^D&Onu zYWG++r4<>IECHHKaK8N}q@H~8iS8xOJhOM!jM-~Oju^4SngG~W3(Fez9jx56VZ)f_ z_LlmBbbe8JbwyuML4mPY@(-8SR35CUt!=ETs5n$sShBCOvTRRbO-+L-292h)wV7qs zVdSQ68*{Eo(GYvj)MT5pM)H*p!O6suQfgVSL3$k{`zMRP$9R92R^+g9CWWX)HNy1v-$o93K=e>NaH={hP><7G<% zDT{Q!#)d;4j@hzlv-2hDjg8Kpc1AVID#n6cYvPTdjzY40VJ;Cq(# z=D+W-3V0YXR&Xc1ui@a~-@Eyv|2b*;^nbN|yXW1ml;*(r*fWs#wXb~ju(?EQEsZH3 z7nKRwq$Vsy3g{UciV?6l+1zM`01}JNi4UQ10f0P+m=!jVtX5BZ2(evXxM57$Kpq2f z9M>7-<_#M}8%^MyZ3V~VFCACEQQ?Nf$~amcPr#npgu$Xj&;f8NiODk>HKjL|3W4iO zv8C85&K`SwJ5@ie<}A*|KTVq(l4nTeo?;E?rvIa-gNA zt*dQpI^dGqVrSC`*4b})km5~qt<*-6;`mb#O|3H)aK*1eVA|)lH6eKzg*KE zdp1Qe5GT{7tTopSt6f`MT>5xn;lMKMzP-)XYKz_Cg2RXRkIV1RpY`g?FW<0!-MUM! zy6VbmW5eeyUi^excvoI|rFTiPllb|(M!3m=ej_gxT8d*IAr}BFxT=Q&WY#q6(NpKl zJOX$@fN9Y6R^%f;+Z|1+6V?`1m0V&hY(PS8 zGkj(q>kTewoh8v|S)50kN(=(b$Yp&r-g9(}0;br)j6qJDMC{{ii#cXSXS&H=RtL##us1aWcF))`MF!3# zRvoO;vKmJ9rqkowdOODSclV7ka^57ntrIPMYD7_9QB{6%erdjWs;&QcvEAPyTLbn~ z08pEbm7ix7sHo7;-`?KZGQ7Ti_2}WF?yeqQ`iupgb{KfK+hmtVte~)(C=72|ul}wcl;bWx(2%Ujt5Rrw9`@%8=EDj%PyNB<>wkFMQ*|W=2 zo3?E3x#*&c7tfzR=buKMGIg09BkA3ld*o&yYXoWin7WX$fTcvJBxXDpLs{T_j;mgT6waf~t9(S7Lx|*&@dn5R9X4mYq4~eZ z1#QC8rds1UkX5VC7>fi1?|Bs`ED8f##(+YELczGytiT!1E*$KA16sM&%PUF;HGk(g zC>SEBa2#u^+5Y$wk3V|dbvOQ#{Sm$=iZ*K+yP!^gpRA8KhV#^V)Ot-a-=*&;o z_jh&kLxQ#0%l z+uzG*bYNFS9Dh(4!OmA~AT{%q7gqnpDHA7rzzBmi&#zu%Z7Dap;zvySY~z-Y?#NoK zux1by)pZsQF}=<9n6bk$N*`|I?Aq4K0$`o<=Y%P{2w$^K#7}u%{LAatxs?yuia*@e zUYtZqa*!!}U$Ukk?`RW_M4k+0d#COA&IQ30jT_ox*l;HRW%l;P7hmkkG-FbIbSd4) z3u4IHzXEH;k-dVQoeyFozo&79%O)&yn-}_abDrm)U(-8p!NL^_=gseyR>eBpW<0Mmd3&F06ecz8{*{pO?)gE zsDN^^IbTaKp;DO(k6KfS_j||( z2DJHpX<4xgIj@^-^DQfddG=#izuU(jeY9=qlBM_FeB+H@KJ|<>Av#v>Ma&8J@k66 zQe)lMZG7dG8;VMc{(8pLQ>X3RwmtReV-KgMPM+exg@@=GYd8UGn>AWvoP^e9y(Zg1;My}a%f-*3dNy$h6C<0=$V zT~+J*OflZr>*eZ2Xrrp|lVk>fI>;ks>z=|OufFg5;Ly7fP0(&W_PBaNAIq#i%E zF|$9U>}PxG0AZIkVasz45!w=UC((HzO>W%0sejD)acd_`n*7gGrp>t5zT5IPT3)%K zyp3icZ|PG{JyBj-eui!48e4#Q4TlqUE}Agy_#lh8RvSnU%BjtE5g!YXv%xq9)fk*( zH?XWd7P*+iVw>uCv6alm;NhDh#DoQC9_O_Urnu&h!8H*Ot!!-xUZ=+3myrBfZ_GLhb z!N_!;7Ht3TKT%>G$9R6lidl!64*%t;(@woEzdv1T4M_4=3Rg7rABBV$JS)Vj|GWGTr2a@um439C@Ud)u~cfS1c0EM!0##ADr;mnEr$ z7z`>0>U%SEjT0bed(vWO0OPj~T^<{!Ccm{xOwF4$+v_bL_e3<~7yxp%rz$oUXjZ|V zqKzovn{O4t+?^eia(Mu;l6UUe-Ctc@x2bw~&DW<-KkW|tUgPoZY3}oP=M3ci;6J{% za@_ba=AoWYYYfK{YqFh(M$BR(7n#kW7_nlJF_31vdb6i7CVIsda}0uV5wTHa!Aa8< z(DB(hmvJ(LqI<-y+!-U_+hyvvh4I0k_1`N(!mjYIBm zj?vNFN2%oV5!21BN0NIsw^W3|f2%a!ypOCBF z)!TzkvaLUz_wAW;=KR?9*MWEE3d>#f@n#_JAHMi^D<)4qrSyGQT{+AUdAOxK5VOiR zVV*}$GVV@aj4ZYQa53RZ)>eF?7^H{#JpOJBxB_OynmCWZB?iLSg&n)AbzawmZLDHF z3mm2KYIAvP$v17H-6}o{Ajhuk`1f)v3*Zp|@#ijtg7OfLNA7e93hzKePhZ>Ea@&g> z=4nuYJSJfiyWNIz>mzKG(!_PBE_YdZ!p7wxVI#$d_u8$1!NU(ecx1=!-T(W#o38!( z{Q2kXuyf^7m5#S_-l3mw-Ma3SUEB72q_nv79|Bkdy98q!^jY+5ihul-f=L$aMW0H(|V|CD9~< zhf24SZp9uXl!Ky4a}M{AVWC6JGHX>bCAmdMojvR`3V85ctBLLw^2^V^nEJ#gKH=kM zT=F1sZIVYrc>@K=)aVuY^($Aon3qS26}!tYwqmtTXb+&PU(Gz zZlE`LS$Y5SumA7G#%gT7{`%_+hL5VB(bLvBX8X?V72pakBdbo3(GqnoX^pZ*-{=@# z>sCsvUs=%7RAo8F1Sf%?taSY*CU)_C05dLBugw*YUDmVWvO16FR|lZxIEo?jeO@d5 z3!#L&S|A*I05m7rUIC8H`DDcdeF9Hevf0jblo=dwA26Ht_LqvE<@oRv~S+3OUe7ecfR+fQzlG&^{jIj6$L|Y(72l2lIa4|`kVzx}vXu>4+Pts4VV>QcOr2{JX#C&fVq%jL8$%P|^-HT(owsq*rcchAHvPhJ6DAD*#V_x)C7$o3F4ii&vvFDH8!3?WZ-iGA4q{ z+7)HHR#(2QlAjp{>4S$G+pHbq-E-!g{*CJ4!*iXVenAZC_8{ z$IQL-hgP|3vH?>8Aj~3*U7>>rOTp!PEYKA=4)wW!ON?y+ZVbw<5Cm}2vEtWyFLqJM z#mjp!AxxI4&Kq0dvYun5L*GMd&S=4QOjYUObAh8a|4=b*DFp7uVx!we<$PGM2oPBn z*>jZ1gAQ}7bdiipEu@g>cRIJm=d5o8WN06!FaXa=iDDexEp7dG-+S-&(#pzz`Pi+u z{y40KU-!Dp9sg}S1GX;mtbTd@GfzJGf&II7eSH2IXUsRnvHJe|@6VfN9i-S>7hQBg zY9ypCbJ^0!0v7)uWi*(gaE}GZc!mJv#AS`fnRJ^1kXehYVJvX^GVj>A(}`Vk=FIZ~ z9#TAEbjt(gY;ChM84uM3@rad_m1f4_<1wJ*pDG3N9_MGDP!{-y-~GM=`b{7HkTc1p z*mjs}KK80*%Q9Hj?jZ|uz=Go$Qdjajs}XJr17l>bA8KyywBtW9YtEd188>d?68l}! zJ}vji%|J8*YQM-^BfC4hZ!IY+`6DAbMRLLSyuCG0O=BQUAy5xDi-~etvi)C69VKgung$Cg-v>)9p{eQZco|ur9S!J zKINn`DF*GM{WjUK#o9>+KZn`_YV9?Z-4JZ6WaL*ZdsPHjN@3Z-aFQeYH`O_wZKcy zavSSB*}xrJ#4%VauB-Tv07&Olt!e-?RsgbrS&iV`ofa6)Y$5~$LPBlfAd#qPM4UPW ziAC;U&f}kGS8O%BsuVy<1U{kUx_uUP(+jj@@>2borj5bf)66 zFq5s8wsnyz@z1o5NlAKQ@nW}_r%s*j=Rz@N|Dhx+T$BKN;T{p}b00J1F4^l?{p3VTdC!&`xU6Mta6LUeX8q$r zH@_oxDcNoduEsw7{kE3Y z&zR;p*)~%^j-wT~1fnr84mGF80&0QCP!@9babg8PpA7}b+WawNn*R%s;~Zt3*QyF; z+C&no646TJF2$6ki392)k4PA3Eb8+rA){ED#uFF(h?N_;!BGf~2gtI%<(5|Z8Sjhb zDT~{grXf{>&kHPuOqvJRhR{ajzqPlg`=isROqsrT@!}%t-d|=w*=O7&Eaa-{+DwXGKV&T_p00bQt${OCZWIl!}Dbt%3wn0tB#%&&q`ykCpj}tyc*Wfh(?ZZTOhD7SC@s5Dy}dsW3ti zeA${jE^DlR&cidxMV#L8^6KZ?pI)-${!6aB@@wyV-}~0sd2@yDPjpegOTK4oD*w>7 zZPR~z+ijoh>+ZX`y|aBxSxIT(fBWx$l-jm?duoEkdPf@B3n#Ud%fh0gE^LHMN9aOD z+}4#>tJoz#?lq;f$UHrGaHK##{`li5OTTnQ_^PX}qGMHJ9h-}qy}=qzvK$7d^eL8H zYWd5Q^&KD&DSkw?;~5wIk^lAU-$QY=`((8@?@V~M=rhaU9yKx^fF^WF17`KzAebV zu?2XcEfp(?o4B1~%QRcyXIsM=;IrQfuugO^+27OoV+9~v5r|#h0%M+KMJhh4;u-O= z7(0pkXt)5D+|(RXK#V|;+d5+vhdIffmw4l9UX+fJt#Al@1<>)l#(=K>3xpZJj^)3h zeWTdfUN-4yJlomT2FR-1#b;Q^>KJ9$oPKuc^20B_@WM|&eA7+eoWE$%7CTn1O4rFQ z*mv;nY^{~NxO(-%NAAD>PxkHEb9G@sQO)mt8GFe*RY_i#=8FwKo+sl4TeyNLm?~DG`%Oe z)!X*HV}@!hqvAHOPMkE7*?0frJD&Cg@C)cWjU6olreewQaq{r8u@_CD=i0j3%^mOQ zSP3APgxr6*#|@CJWaplSS*K0^-kkZT|DdF#dTVa4y@NN*NnTnE$OJuRn49P?ZDHLQ zT-ZlT(}ferV$Qa5W1!0hy`jc7XmLm2oefMw{Wb!3;E6z3X)wH@^QDzx?I@ z=<4d3H+SxwB0?e;Uv_C~(&WiWyfswp0tvO|cpq>h4x9nxz^Vq2dkp*l*<>#yTnl;@ zTPVeqWZ2fY$Z2-N-uH62nWhp+aUUw?`98DzKy^X7u(@2w0%REpgqi?kT+es@><)`T zcY4Jx9w@D(St)dt4amMHLl0zG$UT;CoTOtJP**{7u;19@TefU#K4tQxI~FZG z^V{V$^)K33a=FOwf_?KwE^$!XZ(C^f7DM^C3G7eXrkG~0iIfaZXNat@p+Gsd-WW(m za}8Ep3~KuSP!_mAmPIZ=j9s^~fCn=wqszg1)L274FQf|{muG|kwPpch{&?-(YyyEx zmA+yS%(l>vH`y@|4t1Pt>o$8%;^Sw}t zvZAiG_8Xu6>_;EW%NyBtyz9w*{_cnbShN5DAOJ~3K~$XqTSs)Dnzrhxr~Z#87C-f| z^768p1q;tiS(QJlsAZ)KXu@J!&@ESEPix%?kckQ7vX&>wJ+=mnqzD1n?7acAJVkDN z=9y=_Y8PvjLL~fgY+1^l_C&{H)^}iE(>;zjGKEDPe9hsL?VWPq4uA|>`iaLLPi@}1 z#S4UZ+?hOL17x02UNzo$k6~Hsd%mYku~!V)Gbw`1k%fH3l#y50t?R5CQUAnQ3l@ES z?8J%iHFDvhckgx@^2)OTxzse$_t+x*D_ckx+kz>Pizfz(7?k40J`}Kuj1dE2Y{|)b zjNMxT58hK!f1K7MFct$+$37-lN*Ms4!~fNy5I|! zx#yho?aQyfKG!%sCmddP22jwgebKOIH*Wm>haY_Sb6wqC;}*T=?7S7-XOdkhO%{koG-js4M2IS?!5En?l`!nV5lUQJ7>f~u|0o}@5HLZnO# z2F~ZQ!T=ROCjCi(oPAO5~YvJl_epmR6VJxfFn-bby z6d>~*DcbJ#_59t0l?|Xtj^rCq(qW1sAt=Wb458~3Oz5O$c48@eMKCd%ZSS+bYlqdj zQl0chPO57A9`*K+!E;6o7_c;DdBgfwQ}^C~U+T&$uS|`$v?)@aI0sgHET6QuJcb?8 zx5NpE(AC}Z>P6>W@RgbK=ih19n#=h=?uvVNePIwF z2Vfa)&lj2|`wzB|Pi4is25R7_;u(BT%wb$aEKt{4$@>dMDD)kHn&L3ZiDj{?I}yLN zIHwi;DeSX6!X9f(-eViL&jM7Y#12@v$UA=x0(GF2%PAV>cDNO27vRR?npM4 zeo_&5-<}0hR25oh3{J)isf!02m=b-ykpr+JBsg|9yILtua&N^zc`V?LJqcQ3v8Nz= z+37e#9WMr8JQ#AR=~--V5oA<5nAb+|>a!Mi9WTG|(v}^&w*TTi=biU+6GRY9a_+Nt z*WN#=tF^UPwsz^#%gvqqHzP-lSa7iMaN+x}zs}>lr0{`)-XA%n2LYHo*zev@r87zM zOWG5f6>311Z^WqVI4!Pg_Ss!`-Q@*8+AM8qg!N#C2@U9KZ@PgH;>Rf4MaJ%SKrXLH zQIFckLC$cv+Wx+zN?2i`xw>r}2lgItHusVxOH!8hml|#4E>-wzG8a1!_KzoIpv;@A z8cv40r`-tgVqoTZ?{WF)ab$>Hl&wXnx3MKMq=XvX=?$AVZoB&OtN(f4!i7JvvE_1+ zPihsubAL1xAeY@dr+jlw)SO$tqiVLh*NqJAYceEk@ z*n<3`QTfFMb%xPZ_PY|ZaPuI3kdF(QgU#e_a&}6xi`8H85*?Gvfbs`-T^NB9i9(5($KsE_iCHc50 z-^hT@j!=Ndm0olC8bA(&c&$QJiI*#JML+rElTPd^E3fqYWEj_gKkJ-*#GVCs0sKmn zNyCSa@E+xWFa=AB%=O)e(jCZ}W|AlS)`msZuvIHoIe~1amFm3q+G|twqednf8uq7( zc1e}HB>8}>2D!00e^HR2gob2f@Ovy|moGLJuP9bhnzBxMsnsvMu#=kYo@*Q)OApzMI&^+5z|6&VjfoZixY>2LogdC*87b+)N3d=cIlmg*S+jzTo z?@sOAyVp0BT)}32rj00N-kWrvxuDv1Zr|D1+}^UMqO4+bRaM3M+L~cIMvfV|*W$R1 zw$T6y<>?irdQ&y+J?-`8pdLMtUwB%3YukdBj@IcmwqZudD!1PhnAHmVAtPoTKfQh_DGx3G+-|I-j24m?w+2$&O=rrsQJi| z{e3+H+Y8HzHds#QtJZ6F^Mw~)NE^6hfVoF*22NlG@KD`<`|W2x@zfK4J!RVTORXYR zskxE!-fz|=sXv95Pwb>Fv8|yUhJE0<@Lj!$s~PW=xvOzm!?K3np_&06i?uz5XKK~T zHK}dews~3=?&~woIK#V5IV;;-)!tCT_8`BhHcPs`ex&c?n5V)2v1}7%HCgV&dLeQ? z^58=mo{H^u-|u?Mcq=EUwFt$IqtI!v)#aBt5w(8 zR9aB5YeHS!0n2GZVT3*O$cb5sN3{etFulmR`3Rau#ebGcjFHoLTD;?DwPKQuN$ zl;9tL)t-`#%6C0a(OmMJpWI)%%-ERI0Yv-lyIivw^1b|y@9|?hmGMve`mFGgKm2>V zXP=qF!mhwRZfS0@a>D(lEv34wh<~SjuiO4Q3eyG6roK1XcaGH8*YBvWso7aSW=!L0 zr=8Ypic6~BEH z1pDHpT9<{B|4W zP)@?MieZqwP?Eix7d?%swH`7w1UQoowh{3Sf7}m%#x>(JgJv#%)w3G}X9zSPW zTZaQHfGp+OUGKpyPUouF?G7OGyT_TCKR<7BbN!pR z6}g|j17~0;Kqi6jihT|H|DWAEcb{5OR_=>kculO84MS~O>kQ)-F(fI3yjh(6 z#&qnh8&=nBi*8qOVc}LQ{I$WHP%jsi7Hu~x8So`Q)5)Lx<_#C4KvTEhR@h=6W-g~W z25^_!c+R$lg??4 zw|_lWmZ-bC1K{k;D=h5hFnI$OzqN2RaaN%fjrtgEc3sJ*19x;4KdzrD7+wyUtbu*b&KV?C~WhZhy~R+o?OOASkP z+p%-qW!`}s__uLMwq`4D|IhDTv-IgDf8O2SyI}6zxdos4)Tf+j%|o4;06Hp3i}>WF zX}gbdIr2gbnf=(?GdLwtd=H+jJ*anl!jrYinp*&z3l=PJOSZhC)c0~twdE+A0+2S> zvh7Y+#*GE;p{zLGOsv;k=?1I-{8LXo6`EMgbWpA|b~bw-r2?6U5}o8ww>c3Mc_+fB z0NF!ORuN3zEKkb{fK1P5WK2axr5h^W`~LTPTAG_)`m?|M>pwTE|LNbx{mY&6?K=b6 zENfm*-hcSeUv#&%-(m}{+O5D4t06`U5VH{7jcprj*N&aa-yN{edM$p_VO!upQE|bx z;4ZLvSLUV7``)1*K0BiD&0a?>z`^-%?U>m5{fV{n_2i_Fa~_k-eQ~0A;vg%a%!B`P$e1cE{db*H4-_vGOAy`ABNUj2S6g+X<^b zc#^2t6_=+4c;oO)zgewa^;?wR)236pLApUeLK^9gMFHuOX2}Jl8>Er$j-|UBMV8z} zx)G&8Si0lg&-ZV5&(CwNnd?6D%yZ^>?wP42?C~+*)*gF(&6@G{Av18&ED$j+IFDOy zr#@TI4t)4^KH^oBoCv8K_zxg_^kAd5$YhIG`OCEB_%~PbJMMQBqxVX@KI}!8|}}eCqH{usvqhcEMU zXl~GRCs_EhMnTRaep8T_d3fAA6MSJcfnmKiZ%2dmR5xtT*BWUs$fU1n*AeaP{doCSN(-_9@GBbxAtoX-G7EKccHnN?~iI*I(c!)c1nF|ZdjyUZ(ycS;HNr= zz^i$$1h6T6)tiP5e#@C#XEHrKOlO@o1F_yu%u#JCuHEAp9HyNuicpJB4ajjv2E{zOH44yTJGvvv%TFGo+Rq_L zz2+eVjZs8+R$W~?Dvp<aK64b+;8?QJrNQY@K{lFg#v4LY9PLfg zJpsP=nFIIpCl|av@XR{hz2Kb3(JRHEsFUQ>u39G`_n%8wq*#rH>k$=^0&>>|nX5rI%UYwZF7y_ZUnxHb4>Wbn42TKTiAs z|GA4ifPL5+p%?nQD68{!#VK44zqDFKcIf%Z%X{4e@R0oVEAyVI=XB6&(Zg}zewLX2 z=~!*`n(M}yV90ro-EpkDbnnGU@LHqgmY2x7kJXNE#=UNgqT1sEC`GD}!g#t?B{*wm zb;gm0vMN?tJgMz73yqw+(O`RB-Ee5;3~Gpb`VNVI{vGUEgPK?g#iHNyU}g?>Eb%dw ztuTd)o5!12Uq>g-xb4(v9M4Dj8{N?YUxj9*=Z{lI~EY2z2Yt|N(@aCr4a_iIgE+jo?Do&YZ=JYLd=FK?eatV+d&Hy>1>+7%Tu>tG5)t?x_8aKD7FY6_B!dk zfW7C=A9?t6w7s}zBz$*e+C zctVF?jn$Nwi?zZ24ic)3B+$YKJK%$|?0~b=Sfh-_Mz`tZDqP;q!7*dy$?C82VS3Nu z^pAro1a&(eN*50O=9c@V2mz*%T-t#{ynJ?|$NY+6|w59*NZJFo83uLZ&@5?|YQws)4f zk)UB`mQP?Y7KnPf5y~QXh}KGHu4WqYoIzkI2#WQOfQe;zY#(0q8gnH zL3aM0V^@&f=X7^I&}KHE-}{mSm0b8QODSQ!Veh! zRE3*)z0voeqlvM!W0Q^_?*S;x>_!l8YaJ9&Zab$C)5=4c&c7+1>&`bIzH|@9jHFhL z+r*-x@jTzxs;BJ%NV@Q=63sA{c&Xy(Gu|yaL}KPADP8f^tjsTLOnWWH&uTrSxEr=_ zXXv_M2%$DGdaYkf_`}xvy!Q<6P^9%fv5EbEEg9kwIY1g3lTDz{BX|?&v3B8d21hv_CBGHL8h` zUd|_u*2d{RiL6aM{J;g$I_2`1Vo&(}Ez|jESKw>wxce^~|Cj&uvF5tRlvKTt1*09c zepY0jrJX-&d>JKi$UlC#Hbu|8$-*4T{@Y*PMfhdBi&CSO_`Z`S5;#gdO)dKMCJs=u zT077O*@w^}Wx6~O*OeEO#?3w&4=UoW1R)lNs9{|vYTMz)jg6Aa(d6yr>m0BeJ~vvO zIgR?g_i+ZH`~-9azG6C&a8rl)?}*7-L(caexa=_@ZC9nBudA!4pY=G(?Bf5FAksNO znL^>I&Q}Gj1tL+^P;7>!?NAZgS`yzlJBg;P^!j=@9%X2{oE6x;vX3Q3PWhSXpfc^V zP3Tp;z9VI|@bY^jeHh|ZuqeT8S1S4%7X7zBjx^K0i3J#A&zXXUCY*#8D0n{io(vtQ z)nR%O1v_a^Qb=Z{4EdZz$bMQOfy&Um{4Kd6SBk1L*ujukF=o|GbjXGrR^ag-hUIXC z0@6?sEOkZ7xjcpCKNP;i+VvmjAv5k+yk%)HH%_2DK0f|655sZLq2;DDlI`fw!+P5M zvsh-PAqVbbo}FL^6r_m@#N=236yL$0_TGQjZ)DSm!^>VNv%OqrTFXYWsxa z#jW36+(RI6;P^f3S}W^ghT14=ub7`htc)1LAjci-=T8O&;pZ9nMIb6Iw4b|l;GG~7 z3nRT$&}0ZG&(d3B_&8?$SEDoORj(c)HM72ZT#3TYeU3uEyF!PRm3~5vzET1NECu=g zg!zjfuS?@#TuW8l&(BZk<7PZ$dAqF{1#{ZTth*?e+L(p)z2BAm7DQR3LnjBBn5kz;iGEWIXzj;w$;6r zc6iV*yP0g0#p6})GDc_&0k%p&Lw6pGzRlC~iSRSm#ZKdhUjiQnGV3-)cuRjAllC-L z(RB6h^!9c(z|QU^z|C!wh1}Tx;e-}#NO;=AmiDTRIm$9&KXY^@hU$--sP!a6xdv0j za?A%P8=peG(;SGw>$Tj7kYq%{5y|2!_K0^`pIj;luowk$Y*Oc>k_05mmSv$rowG4i zTe=YYhz9<>AY~<9>P0q40)CcG(xtJ)N;#twz$zRo{+DK~K;ESho5SoP)ynB=*+kBn zpgUpNx{V9%<9 znVI2KB#RKm%`H*jcyz$>;P9wtK!8SceNBzJ*$C|4p=r`BI?)gP^;^72=J!g6xqIwq zwuJc?d6Jkt-FzmU40IDyOxDB#eTg5Az9MP}5>z7MftJqMT?b)AX`ay|r+-4*91C=O zsH1)jhBdg0GJ1rNO0kMlOX4B(Nf#{}0? zXo%OYv78vsIj=Wr2(UA~!B(n-6-x6(JnrVY;uK#{?;E5m>QK`Adg{jkO)Se|y4PMe z5jz0peiYC1ah{hjzgEqmCscv4*z}9gp8D`edV{#z9lS(?^o|-{kUu^wwhj3yyY$71 z#SnvroyvI?h&b@jWO`xK)6-Hwb@gNQ??v?WO5lZzj7mO26`5xkS%L!f0#h>nobH3B zuvKMMS9yP1)pBIz;v3?u$~KpfZ56*fdE2>%&1bvMnJV&>?+3^eu|l<`G}K!)1Z+LX zW4;|&EmUTQCCVE_SdUp{aq)qt*6STr4b6LfK9p>Exb|@piKx!TLTY#j`zI;Fla`~~ zXy3WUeQg|Caq(tY87>4UK%HK36AR3bw6}F$$W7)YgJHtTt#18~YND;1?mfY4E6Y!U zWi|8}ki-MMG#nJQ(eh>zKiXIsbjCq@s`bS$H~(tqg+%R9l4IqmsJq?-MYMnS3D9?Q zslRY=`xDVO?oRpLws7^psj|V<%`#x@674TteAsa#z}h)0CB61YfSUEYdyrU0bm^?0 zVf42XfKUu!mzGikgYAdO5-hCIEM_$)rcx03(R>f8e>|eBNhYtXh|@XG&&psUYPtp0 z;fPd4KbnkYf@3$dc?0 zk?$L9fkZHW*2w52e|ontgZMduZAblZ1E-kDfbb@XmkUsR7!vpL527}Y&$8jouJ`W5 z5O%C%6bHW-F7*Nb;=D6VyS2^~Q*N=)9>NkEXzZkHT6LBt5E6dkeow0LcV+J2AacXE z{KXb=Dg(-Xk+CwvOxg@~xZ*W^l?PvVU@*D@b2G_>jg__4nYoo$&A3a|)sxxQ<7i<* zO-jaYxg@lQam>uVN<*%%3KQ{39OmI}1fPbSU9Y;* z;Ax{<<>ZW<`GCvrERonG&Vv+Px5E-@k|bCqQN7w$J?2);4wY~?zZ8UDxxi#ne=ehI zsedYi)89YNzpTx!cx)`r2{nWA6q=vJ+{V zH(bv@y21Ou6UB#CP0VU-NRokgS+{YPRZPD!X>($cme?vko>{>ig;z<9%uWct%K4Lw zS+id@9(DZ1j%U>`H>H~b6%{k;9)lRsgs;j$*~r>enaQ3wRnAInx=&29&54t?{Nuo8 zu*BQ93<@S45)6XVEM}@+6lqQ@xHa5p7LlUzHU^6>LG$t=)Sy3pnXo^I0DoA%u=ICAJRSPw0&t~28x8nYeJ zEZMcb>!AFg0AZPvysUWg>cImf(0rV;Ujv1}TiD#eAjUc<)fV&$j~RQISE+AqP3vbW zB#J)BzOy(6dS?S@TQ#t}5yr|ra7%Q6PEL-BlI3>c(@CW?=hW%^IX(RL&v!O5yh1Bd zNW8wR$JK7JB%-&)=Wv-6aS=vmMiRJY;(CI>gZy_~PXNIJbE~s9U>hqphh@sa#|CZ;?<^EL=h_fVgY;QOA`sT6#5~jMyTh`$9GGTtdLy9# zl(X_QJygS%Ux1BMP@tlYxx4WK-g|+lfazh*ie-Q1Y0bXnccP=;6fa6BAyC}B_@D2| zBYbb19Qli_d`|Q6$@*&W({K2A)%%8n$c$E`SOE z|6QFB3$Pi+nZ2|9=6p-1WJT^(Z)HE{=-?vwrBtW8eZg*tzen<6Q*htv1!50`3*pm> zM?{Oo!VbNd<9LBe>nwXQF)@;fzx}o@Plr~-f7`!Fzt4O+yJQEGu01NKfQNY0x_?@y1+FgipVjeuekG85@G32~N$aum3J_y?Bd5|(K z{WgO7oIlZwF`t&gj!W1pH0gp+IEI!|{O$bgZ;$V!0P}WC6z^6SlQ0ngwpj`>2-_vr zEQP5EOOhUC4*I;ll-}|CVJA4yF0<$US67SOKm1YCj|(#x%vg@vThcR9ef>nqb1f8~ z>1w&-u&`$4Se%r86_4gDNp1Aq@OL+@CRolzuZoM?Y-F7P9)mm_$2;A(zD_UCho2nu zL5P|Da?JII#i_HL1+ZnV?w|a-wRiRY?HdIZ?#@wz7Sl*P2h>cLnt7q6C7EAI$SgKs zrSYRMSTFAHr@NZ^y(|VxbT$Or7X=qW(dLsR-_SZ-CPhOmex*?e>_~zfa3+wx&_ zF@lvo4~Dz+b};xiLD0@%@Y0+18ujE+9o8*@{w}j0<=l(|Xuqy_5b2+V9U&5<1Q_g6 z&==(VPvR-Cuff~XON{oKi{vRS?qfz*00tW&uq4p*7(|17D=5gctHD1kAFHLgX+m^m zV1})x*##R|t!z+crtGf0GvabT1Ja^FFGVC8s?3kC7F_On`zzYoyfP0_LT`G#PK;@2 zs>n2T;FEL%YIYywg3`YjFIHpeQlc>EO{}fi1$x8R?&FLKUye2$0X?$^^-RSpb;2>9 ziTHCVX-9-hiLqyKmu1m;g*^B{TE(zQ=?I6%$$Cd(0s8rk9J}sC$*E6VoGkdnFu`#p z>euAtU=0I z%4u1akFkFQMtd69kx%gE&i@q*fujFylhc|-11Pr49t-=LxNv+n8jfd5orra2 z!pfp8@Lqm&qt1m6;3|2^S=GfVZ&eA%UpNwPU!#&hHFsp-GP+4vHnV z++;U~JYVcXJ0+t%kKe{MhAQw_*pcieaVCv5QlVSv#_(iF7EJ7Y9CHc)awiJ;_;^VX z$3`#{v@B0b4LJ?G6J3%t)tPON@Yq*L-N-ekMr4hAc*O-W{{euGOelEChbPg0oBuI) z{xB@*J9r z%Kt>tq!GTdGZ58{g4m7_3B{3-!R|s4{*d|Kc7%xbGZqJ9<_p~+&i^!Mqj4c2z{Oco nFb(^khFF<9gsK1UMr;zOkn+sD>_m7XA(pD5mO{OpMcDrVbo2vi literal 0 HcmV?d00001 diff --git a/priv/static/images/meow.png b/priv/static/images/meow.png new file mode 100644 index 0000000000000000000000000000000000000000..e5352734f348c127dcd7c341f3d5024d4c0e8579 GIT binary patch literal 102069 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�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 literal 0 HcmV?d00001 diff --git a/priv/static/images/miau.jpg b/priv/static/images/miau.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b0b50bb205c5ad84749675b977ab19ff77760ab GIT binary patch literal 55115 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 z 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 literal 0 HcmV?d00001 diff --git a/priv/static/images/rawr.png b/priv/static/images/rawr.png new file mode 100644 index 0000000000000000000000000000000000000000..3a70b2e3a8ce9c1069d1e58fb8df9b5130f44281 GIT binary patch literal 135358 zcmc$FRaDzc7cWpKp+!s4;uL6cE$&{l#oaY{aEDS{ODPV;-QBe~!QC~u1=kzC({mp0 zx^MR(D=Ys@ezR@%Y)gouyd>Hy!dGx`aA?v}Vqf9l;Lo35fS0f*gVQUaaByUB(qh8O zuDS;;$SFEkPAhJCR|NWm%sVY_-mAlx7l~(PONG1#mh@E^@xB{$wrc1LiJPr#*7ZuM z**dDp;rbIYqY8DWnxpH_6$?#86!L!$@JIZDY(2{IZI=V$arD5i+xZ*u2OO8{vG(ri zu*dPT&&^WM74O4ODtkl(KOr(q0PL+@B}!;crS047-_Or)?}c|xsh+?5-?LCSKeBU* z`jCq6|1AOVx4!rnKnRNrGe8%Slcn~5c>i0I(d+ULI_%R21VsPQuvO|F-2e6@JHJN% z7ac*|R|wM`Yq5J)S)M}Sx3N`|`LzdPAs0T46v5T)!t|NDe_2@4>Se&q6D z8t>ozv=L!D;K6@QdGpVclRbbogTS_7TafV1AMYR|pT8SZ`N0^GUfiBF{tH$?2@}kL z3)iKZQ2UVoFSoCsaH9XmwqiJJTf7aO2!5)yi7+N%*!rJ@uuXEDdyU%uqKSvV(7r5B z&no{#DK8ycyx~J!_ zNIs*$)cLh>picY2=({RXNl)D5qqHhqon^A2z^a#_iQel!z;#5 zxc|^+7lM^A9pD{uMcDP1Ktu%bFc?!~%k#79f0_FD%+zNW-b=#2OjSQKbyyM+@h?+v zp5@|LXH@pDT>e7HRIv=Qe_*1cOKxV*`t#xMxACuG%ng1&Fd^gwT(ZKy>w5XjwOt%c z6W(zv?dslt_a%da!JhK}vnh=2P&jy+bLI`)j?{35zn1xv9U&tl{`@d%_^&a^;vp{Q zI}is5=o}drQ~qm!t}kE|x51yRkN*{?kbWcVK)@D>{a+T*MF~|;w=!=F@2EXC;j{gZ z%4fuQA{hNL=oYB>&!n}V3#~>-$SFkWbkj28!oCR;rv*1{0=lDyse;&FqQaKEk$@>L zz}DM}|F7~~pOu&9LBNahS9u07{mWc$_fG#kv7yK?p!J6MirBvd{|E6L27)Co;@AW;_f{%-cUkIA;HmJn>AJg$MAnhXHw9{N+Q`5=>t0 zKuI#dLyZxx+FxlRB21t^uXB+x6#lEL|Idp~8nJ@C;mY1M)}P#wDgFo`dHTJ+BL3Gt zD#&3^bgej9F0lc!E{K^wj~&}YD_RYOVA94vGCUyvEA35~w_v&{6N3BaGnpdlv;B7I zg!BL9`zIevid0WH0Jy)$FBBdo2E+QWilD#Z{{fR!%Vrw_{J-|Y^6XDhU05#v#XJMN zMaq!ONcizYf(-XR;lWVFVX!`UFMNN9!3j@)(lv-WTl_ZDJmSHpFlRJQvf=(SF7A{k z5{CJK_1OU&1ok+GV)%vE1Fg(zF7s!gv$N_(b7C4gCUasBVj3o1;^JT9m6h$#A!oje zc|R(QjWazn+cGoPf3^tNV5E5*j@d?akX^6efx9C=W5ZY&Z$7Trw+I%JSd1eu;G72~ z^Uu>zQ=7)i$uXoPBqgzN2yopTO zsiyinCTh;@o6^RHSL~Ka-XQg0q@29m5kt`jkLjLyVEWbUMm4_#_ly+Du)s4j^`S8H zZVRt8j@-q4c~_L1WC^44Gd^ThRgI}>(M-NQqdi>nmkcGJw4eO8RRT-3womKe9$BoYn!&TE0bRk{_TpJ z(bb?N%_N1S=#w8MMqwpxT24+E*q7l?UR=QspFM$wkwU9AlrRz>=hs5%5d6X<$tHT< z9lVm=rHdf4tuqVu%)#0(KFcm{t!-=^0JIV*abvKX_2Gy>=499UL$GOnu$h7DFNc9_ z5xl}6@3xroY8wHFZ+(RCL*j_59oh`*N)Fk1!XC|q1@OFC zkkxFERr8%yxb@}L7s?Cet*B>Lo{I)MrW4z$-6F8_sV#P^y)e?4k&&?wPR5B3&&dAf zuw0S>Fg@ZJ0AHL17Wad68s$<#I;!#fyMCs^MHG&P0ut@yBgYnp~W`Y>`4w z_`P_a`Lg+1vnfgS&7-&f+%VthV#?&q%$-?ESA&^6*2xi;<0C!`IfB2W`s%G;M#o2X zmnPHdtgH=1Gc(Ay+=iz(owI6w`R}#5s4Mfcq7~1Mf!>An@-&xH|9!9qvGu+Cg#R%M z#ghJr%<%n^`F#1uHkI#i92T1tD+3N}K5DA(jVQCE^`08KJt4UaYScAT9MUFEDqodM zMC0QLPT$>V)i);YrP>kD_y~c@Y^|UyiBU49M;4>wA_mn<7B^teyjP6bU>^hrI#E4)X>f|LRGwb_4G>SGb z``J~RfYZ5n{ad3B)9NXd3gL( z!|gKbF0l+3U~d5A*jl8iw)fH7|V|&Ptiy!0qYRfueH+If;>0g09+M76+Nw0 zW=qwK!|CNb6x(C-W7AQjf=B71JH<$(&6!(=(0=e7aSHu{9YOK@m|A`TMf zWHen`7nr$qs_|&}b<4f3yLR!haCbKd8(%IO_$uhG%PY7N1>Q%YSgjJ`d`Uh|+*y0k z#O%wRdUdZ|g-aGJ^^VivkLRtCw3=FcUUx=8RnSYeKT+XmvB-kDYBS}%%Xhg3XLz6P zUw;Cx#?_OuNW!$*91e55p6_5TLyYXTyOu>>+tkn)>Cx_P!_jVDdMPIbomQ)-o8f!| zuq>K*#JtwLnnFFwbVPQC^*eSBIydi_*6(+{H)TxKd{W+)ofLD2go&dg7||edvLZs7 zHV>qR9SLy41i530wA-jBsS4yr;C5g(_|iPrjSc5#YH>lq zt*M*al->d}#=@c(9*T9!bLbln=ck70{_8U~M+y^sIg8jSS+vF0VQ$=tmDr_d?(nju z_vW0bWtnEPYejO-DF>5w{ixgoCY9L0O5x(KD<3)`v;eVA3fGo+49`JIx7JGrQunk; zC`4)_p3HAf`@1Fc?najy3!zlfE5}!TykXqS>@MI9qWf*?Zr9s|lsTPW5;G~vGb%J3 zwF>O+yk>=!mG>z(6Pz=X%HGSeCqA~&g?%nqEV2qqc?fUggt)isEwPw8OE@XCjJnUg z**Mx}LYs>{A8#Q0WUEs}YBVrs>!`%>KKP?1H4v#%_y>+yof+1VyP(20BzY4_H7!9; z?(UP*BTk0{L~kEzhIQuI)5ubml>u_aX&{s_U}Mo0a6tl-M+@yl*Pl&mOssVU#g46E z6@8ugHDr~ZIK+&qdHBUz1kLmzW^63x>@1WfIr*JWU1sL3aMO0T${kYhcVq-Ltmj~K zY&bMWR|7G8l}8Rc@54~gzUBUMt=ZL4B>&x|s>tHZitD#{ZDJDH8hfO4>4{%@TEcc^ zE?W@bCSjh?iNuaKdK5HkwaNzQM#}GFMy31E*k5p}OvyRHFIFnVH;opO<(8FbWD}3+ zOPUJJ*YAaf*G?O+HQz{QSsX+-U4;BuqVe*A1OhFKNOrA~FWh1YTdhG~F#ZWlo>MwK z2|J^mB5Ziit=vD1yv_%+lF5Y0j}|H>TZP2D&dP_24Qv_}mL`>^!%5k05;94FreYsT zcx^wA09Wxu)~2e@pd(%-0ckLc>;xy(m}^TBqUqT9^`BM`q+F6I3BE7e$B7wnimo?& z!Q2wN{Bo|!#eb(<{p3Rx1via+3SlZo(P7SQV9&_(^d~-jAeXUGq)zHesJasw^TTsi z`*`(1)fEYg`K+*F{Uc{8uhX6=+x&u{zMmN=&3&(6;7By+#|;!h^X`-NIoLEhWv>9} z<_2=tjrHdE>P@-uBhWjebc@0%&BTEzyI-S_uv>P3@V&Od3!za@^bpab@o_gfE8k$9 z@784YmV?kC{3_F72Zl5jX}2s)w0WNNx!Dait%bCGbKt}0uL3ttGMfw58)$7YExk3c zE5q(NPuWPu0vH2+CteX9HCXRYmk8QVT+A$)gil)d#ABa-vhDES418xJrD+Pb^Z#~m z=C(d?+=^MChwcjv(7o2mbx9s=ti=hPDyI%6)@vJ|A~PG>6@39o8Rb4n6z$y0h@4B^ zalvUdAUd0H`!$zV=s*NY_*=T+Ztn?748H3SahYGu)*a1m!%>2du5K5Sg;HV=_`O75_y}4GZUn*6p&gB&1j=A_8rNh&27aXkef! zN}c!GTT9Y-s=KXAX!Q*&o%Rm#4L2yYK@3mW7OXlmdp0$5q~JfK+`h4FDe(I5MPoBgu1}!Xl^6KJrScZqfz(QQP*o z=p@3uLWUW$V#7y`itlV3hpW!zcsaYZfJLL){0ljbd?%t&0+RlCKxW$f-n>Ui*&@X1 z5rS6Mr_$E=wA;PMgaCh6XQX#A$khBYL$7-{SSb__{w_$udJ3#08F_#5fFXE>ErZ9T zYc8hS>TzX5bLKRo0}(@a%W`W(nUkF`|3hMD+M!pLn*otNo2ovTp@VBK#NZEeR_nkA z#}erH45l+)!4cMhN07(1k{eGNg0%ypwj&hb1QHfbhq1YWZBu8W`KM9;5RxG#2(g=V zFYBpkfo%UMU+5`Ms__}mrnJ5hbpCV45SfaE@DZl#Q#n^Tfc8geCGFWTz%#bw-?eLW_if&1xp{^s{*^h@C8QhJ~bO6 z0gM#W9Pufm8fuJQa=<3eIukJK|@j5n28;fd+ zwHcY7_&0U~ZH>lh``;pel>~Xtjf3MfY1H5m(QXP$XtU`mRY@94g=HXoY2>yV^jxIl zf#)~jEcR-OFGxB7s3ug=H80L;InWcnZ`f-MLJm)LWWMpbeXIznK=Au23X3Twk6c3z zXM#Hi;;Gme&fL=y18gfHCKA-Z@NnFy$ne^cM2;f2g<5NsD1lpZg7?(}4nwxBH`~US z2Xjcn6QRX;p}n#+tXEnV-%ZYfhIZYs-Iu>cD+nuv5+3goVKssWf$NxUh;ZO8OZbW+ z=N5;V#AGR#YNw%N4GncY>KWm^w|S?m)m@@5r~!O7K2LZa$G}g=iXmR&MooV0R4@u3 zeh3r1kfT8i|6ORsUnQH>JT0~UNrt~^j5f7|b={o9u&{=3C+<>X&NohIsnR42Pc{Sh z&Rs_C+t53P!&k%OQQ@QH-0sl|$ivOP9G*6&w!{$ZMucTBXBXtfnsO7rtzZ2p2@X+j zl@v_R1f>3ftK6fTSa9^9cFMJzaG->oN6;#N0@x4>)r|cD^lAIs_TZBW$o8PTA?td` z@wWFZu)*><>9w>`p+CPP_w`u;cXYIj0`@;qp72IU*>Gg;u#Pk5G?$_po>t~&8TG$r zYK}gbZRM{xXQxSUSq3Sv+AcR|*S0cpeB_+OyN$u?1J{FiFmH=q{^4#@z>z&-%@OUS zu(zA^p7bI98c(n+Xh!7m;j^v>7#Yr?q)#Uxk|0f#`__E#ZH90a#CMbc8{4adACT6S zYH*deviy|U@GTx}au{1Y-k08jZga|)v2J3~#G=rX@jM`%C7 zVOUysRm}Oh;m*^7*1sp%jd<8IK8D8_TIMc07^$7!~_$j&gx4hrVK_-a-nm3pB2 zXa>r8gs%wnyw)MFXEbwg86VDE6yG~g!CC%U>FmAaW-&tH7{l+O>fJbW)+r2;Cp@H^ z9ey`CnN7S+W?k)4{(aITVv>reoSI^PY!oFwE1c29*gCR{8sItCbCa_6_!Y5V4&q~9 zQM()59(T*16zLJgfdh|_s4CD^>rfJNA{mZ(#NMfCoULdyvW3Yeh8~i^fsTesja*W9 z1XnqFFIjl!M(ZL}>ZW)> zbGc5BOp8+0bJi`a^XAd9M}<%`?PTKToWql>aay`sb}9z$=HlJ}ZCjwIn8Mo!0%%?l z8Crlma5|*elhIloMTp%Yy}BWCZdQ-^?1@swcE5J!M_%aa0wJtQ&d3DwUh#M<_z$cU zu+S4~9eRat|HSs%eL?@rLd$5yvDnfer7EQMyb?*Mf!Qtci-NpO?=1|hqF89rq{g6Rh0F#RyM^7F-3qH5 zVfQ?-Phds3)J_Lix{RfTk?#l^~ z;Zc!{pCZ7Pt&@!oA*S;yE@0{Ava%8B@9eZZ-|U4xh-uo+SNGE;+Y1;+ZcC@zG8Gyc zE88HNIL+QCH9Kp?e7Q+J#n_nwwCFo1;O+0LJT}OlK<>sQdwWxSb8?^!Qpu;v%c^%X zW^RJ~KB9}uw9~)8D)V-}4N5*d%owjy=U2z`S1CiH(#&o`e&>Hz94U{mC1D*-V?DG| zG1x{T>@cyHu1jx9NO@v^Ib{YrEe(EOn)aZ?R}}?3B41BZwXnj+z6n zZvLH;Qgqo7@hc4geVja#_>HD5|1bocn4a=(=L(7vz5$Xw_Y`1>`^4O!h?&B^F-S}n zk4JHKmAiTjW$}xW%obJZD`+2LH%V~JGBMyW6KZ8biLEwR_859K#9%Kjnozx=%r7R~m? zZxjlXQ9?CxbylpiPqHLrITLd^yQJ#1#T97>>BfH-7oTagh!=0PE!|GW%3qrQFyEk4 zEtWD(k}#jXFxEF8%_@~vQhNQxBC+g54HDhBD0Y->5v6vAoJ4aDo%x~1mR=C)vAmf! zb4JCUVymgP*iqyqtSu8S+Ua@2dPo;5gy5%zbdX`lnG^+Wz~jTL-?8lFkcnrkY43JZ za%KW6tIgcon>cOxRB(*S@Dny@b3ADpW!S!inZNDJJr)R1qFw6uG^3`4<`VKj(4&{c z4se)L*P?7NI65$z{Gd@&CYd#pfW?O)Y1Ov|d8xukQY2YH>VD2FT@F{BZjwV)$aInY zBrU6#VZM=icW=)@kTD>Vx>bBgt{ zHNIV_*>9S>_^lL;KVAl8_?##HioRvkYZsA9my=qKSrqs&x#S%$CATR_i3gyMWcJ zmiy6J+M`#*$Z|sDbd+HEmC=vR~cv03$Q$VD{kyosq4?Dm)BTJux zMs4wuT#pA5s(w*-zwK7lG(NQ{s+Qdp03RX9`U_S!_1njcfzChdDQ6B2^qkcdlU+|% z1v0c!uM-3GjnN$@8|qZ?^k*y4N!a}kXRPaKI?n}`S|cjbb^~DL4adfJ6~BA}d>=+f z%FioFnGLUnq4q0QnvNTf4|jv+aE4f8%gb*g(3P5EqaxtQmFGQ{e*LO-18K6qeBu!} zM|=0_{q!;4uE1=n<+qv(5}k;^5hnor^n0z~FKrB{+IuJwSvf0IZ~a{Z&>A@c_B4Yd)cMg}u(l4Cl|U1Y8~Xk9-%CN{?ASGdeDA z!f$4{dP|~1kjk;-(EKtU_%COT`ZGkA`kkf`aGvN@`Z3|i>O>`@>MxhZEKGDGxU#v= z64icGL1v0l({0aMmEj-{%Ydg>Vc75B=FmWY_Cc6`MeJ&3VZ<=)?%LeDc zx$QjBxA<2R_%xUwsGp1eyEeFEy5Z(~9_Xar#}(K#KD8w^PTwqM<1n$3xVblfn(Nfr z=oAtsX%IO0!O?pShkScmGn~wsyyBU7XV!2@ILK|AK4tOVr*FaCVR>l!QpAO2iYh)= zUOxrl4Bm#Qndgn z9cmZZr?b@k#Qj%PCTy|10g;KsXMv;Aq{?WnN5~kZL8DlmTo`^uM$^TQb5%{Pi<9H$ z8d@{pus@vO*NFf2EY8y=0=)*=nmltc9&^oYkqkE{!3?6Ag_X(ys$h zUq+CTy&Ky1xICzEC4Yqhx7aO!bS#P_I3!RRz+9` ziN6(f;uSn4Tx)C?L-gS=E=JhDvjEtpJr7tDL;EP|l%I+Hw|jj;ZrTf)(7*gX?Kh4r zsO6E7>7vIVcdTtZ*@K zSGOgoTA0$uR>tDPbg0KEZe&S3R3gMStz%H}V!Culq0axJpj;#gzhSMRHvg8_mJve4 z@ny|++gDcncAz7EMH{$waT6fVOcAu#StWmVgF`hkVE4`3JI+r<&_zdbvU&Q?%}{`$uUE#eg7K!nn*=twwI?vE}*?x*oF&?@T!*|(Ki1~T-x)ABxyCv^oAAyX0 zj<|!fLnVT;RlyO5Q7Uco70lZEoq?4ZC)&9}b%YX*bW!jMK$Y)9YnSGS8ae|}6-c`p zu%Nugt`!mf@zUHS%qtrA7^J1!WVc1cioG-4<8(a^8P>9^_j2x~kyZcguYE56%D@>quJ)7IVb?Cs{C5+ z@X$+zDzyN{P7nSZkT#Q)gXPo4O94;LWS4Ij78O771u9l*-x5%QWuuGVpFGqcfo3kY zKIG)B<8m1n^;0sK;*;MteK9hc&PSWiGT7e5IRoHRT5pYX$F!w&gMG7ud%_m))(2L5 z0cgG_6N0}6um|Ei{OAd3c1y3=kMb70Uxy0)J0-wBd}X=$)kS~BFP)K&>F&EmYHC%< zv@#(}G+#TM1g81yq;xe%a&rqP;GTPK~;5skT7TF}Jv~ z6Qy(b+_Y1!=KNM9-3}>SSPau$S2W1(%vu7;M4(V>Gg;xaQq~)b-f>;=9SQ@BW4uQ3 zo7??2Z`dON{I(qJ=aB@D_l*Z`8KQ*Fx?Iui%4zv9&-!U%B}v@6`xEjnzrUU!fy7?QK|rPN*sMv?8?X540*ats>*i2CGTQC8 zA>=}vD2Z3%eV=y+l6P*11S^3l8t5*%O05aLJYY$sVPHksNyY>pHL&{!-YYV}X>V@^ z_Y%E%*7TyC@abHBb6Y-8>;2(bl?PCDVpM0g!b$2IUdAA8=bckx%?k%pYk(>voO)yO ziQo!h2ju707Ra{NC>uR(TY%eR*lEUlxv=jc&A^rZ(cpRhBJ{c3j-88yaA~A#zulcE z7aMDo4z#q;F!G*YRiI;I;}P7(5WFvcl8fU6APlFF-m2i9^hCk>cS>zrY%4xb5B+Q- zd>ejtoJ)>M8Qe1BxzZ$@4CyaKAo<0`<hig@{O!QRC33SvzZzON zd55e>2EO}PMQw4Qw{D*>z7f%}v~2*`jg~R19vO>A;PMnYbXy!FZ$f6n`>SMP{WVb-tReV3Ry46n-Tfv76UcCU&5y=W)5gin&Yn(W zTz$kCX18LBwSUgib}_A`W38JEJBH(^DEYVL`XtNof5c7^%y&D33LTQ7umdEvD}}-W;48QSF(PnXFTZ7D1=8oLPJhNMv?;g-yKHw z+P`+7v?O+*zPite*FDR>5D&w}`TCp83Mba>^bcMO)*u?^;wpo3&Z&XB>fBgj?u}aF z4WXXv5Narvxt3uKB> zSe&~L{jyhfDIVRglcPfLLInJp){UH8P~K;Sn{$wj)L5E?%at|oRZDZ{ZFKgb1-UNC z&=>1@Hw`yScQqaZy%mk8jT z6=rcwZ9M~j5i2ltM#C*nn3Ha|^gpq%23AM+pkbb?ItSE-LF4WP$ikTp69^(krAf{AO=fYm$drbT!t}n-!jnP+;%ki^lwmrCyNVZvOFy<t)BUFmfOzcFPGY zb!_ZMRl{Tbz!m%O)h`TqLLD$QJry;>IVD(cJ~pmb;~FNpk*-3fxCgrt<8L|jlMYtA z^M}V$ib?SWuD<($9tOz`0NV!8bkWW05pt_O|F$vkRE&(FP|OJpR359MSG-ZL=prF$?U3@0y=J6h}ug;0a}3O@z?Dr#rl)>rs!1S0qEVa3$m zu8P-7+9zXF(TW`M{_5Di_mc+oT*El;86ZaSX z$&_Ka5bd^Q?*^;Z0@%dRLl_>@?N62HyCOQAV-~r`{%%$TKOb1K>+bpS`GV{kcCo*i zV>5enH@7n<&K`=o5yh=RXDQKZTi$oidicr=3u4SeJ_{4{0kBJ@;H+^n{}e|C_PKuc zF+@#VDFOmhs_RKa*5L_2%)ipa2bzEF&h&$2k1)e2W(eZ<#ftBT8|zGHZ6@jA`FL2y9|i^WVUrus?`sC8>x!GcWho=$xsaIiF7kNZv zKAZtZ)NZ`^N`$rZ-rHH@I$Ge*@r8v%0YmEQ_-|KpaWm?XxiBa|2ENUd|6LlT9PIZe>N^2N92FVWN1uW^Ry6#Z&-r3_Hz+$PItsew5SG zY(cg&K@-o`xci={piy8EO$7>3PrVPX#u6AE6<^j23mxw3Wmprj&>!~~?-MY=CCXi` zZblNK_8P&HB)!qawcM8ivdM!6Ol^42J5TG_;zr0 zb$$CzCT6f3Aa6hnEdo9aNTw4h7$Mh|PtLpJIC?dpvPOa3+H^YAV{&i5(08yPYQ42hZR+SCsAR71 zy2?x;{l;LT5NO_W79PVTZcHYQur@kR4gr?6O#5sWQ1@aq18`S(0^mN1$eZL6XAX;& zW4_!Fawg%H17UiAlOuGrMnbDsJ$j6nfH*tGpCKTN;qe1PDfCrfL(kHr zBW+5ydWz8;f~u%yDq*AYWj>3{7$~8V03k;wLMd{o37Q3_=GT1DvV6y_O{1hbo*kQ` zJcR~_W(-n+l!IDYPxG6w_*^+VT6)6N{SVz;Zj|3FdcSU8p0jGPxqi#?e`|05K?j`` zce(y0;MYcUAVVx~5_gaxD%eEW`;FL6WUqRo?e(~ZXdITOiOPjk?*Vv4z3nkjuo84z zTFB%@{|U1`;5mg7VK&O=4D^i=-AJ4;6L4C;K26`-+q3j-k0R{U#I$wxk zB#M+rW6Ye=Pt=U|kDPu*_!wK~A3%f0mRN3fXs8<`?t0D`~9VSg>krIDSF8q+Mh!}Q>b`(wp1RQ_t zi*B*ArKQ6n|4Q!PrM+KpncBdp>}b|LO*hfl#ABsBU3PPl;{liX;6FF3WL?GcxDdg) zETX@d!FkCLUIc4#;K6L9=xP~fY2XmKskE)_7%z&H_Y!3yUu(3s>FV&R*#TjlEVMC6 z^D67znn%{J+gpjJjG(ty2+xn zLDEMnE^1^wB#7b&;HTg!_)08-4>}_}Aal$)kp5uEU~^io&)YN67!*-F*M^8(Onp|x zTVZx{Mya~LRGJ8zmwVc7#Gw<=;0J9xH!%*h<1UqnTJ0Dt5EuBXuX`#vbDVW6cv z)Jb|oK70m2!xJ}CNqHS6QTAcOUe0X10rDVRDY!HBCg)VaK_Aa^b%hROwEpv?U#Jk{`GlK_+dy z=m6-%9D7O>`@NbfN5+BwA)U6$b(GPhMoX7_z2^okM7e579zRhlhAGJ6CojC-d=I? zA|#;V8u7O3l5+r30Q~2MH|E#pRSQHx9J#5nI6~IW79+*q=MP$Ki*!bKB+!&xu+^fF8>}4UcX)5Z36E0Vb;}Z|fS{qOp z#-|j`vU!+YX&K@004x>lMdU=Ny|t6#Aw=dId1MapP^nvEDO(Lf3JAI!NK!URZ^M!j zJD_l?!!>RN-3)&8N!BX@q&Bn{v4pur=NJ#sGd8b`PrJL%Rpz8y?y7n5GvqT3y@ zyrXgiWu<3_zc|SnTE8$oW~1j)STW_hM}uGqO*Wmzx6n04sT*1nTaFNU&fRg_O4dB*a%Bg~+YKfN-;-l|>Sr`nGBIIMvqRU+Jx{^2>|4AUT|0UaVWe&s$ znBtgphfgdsK-BUx9S*~TkON-`Et2}O$c{<6YOO>@v zNfQos^PH5!*@~{=!-$9r3rlUIq}=HR5Ab)C0GtzFA}p)&&-tvx^L!p^zf-gXWLNe1 z`Fo=pJP?M=d1d0+6NhV5FGcQ@(mK#1w5cDIXykb#ua|OeKxtoZ6JmjHgW3gdniQE< z0uXv>!p!6Ca$a)2@>Iem_(Sj^IGWK4^73{m-@wDw`>0c#l&xbu#^N+5QXCOM4Ig&W z=ull{T?`O|?dm#VeJ}ZN&&SRF37KMF=|tcWmZsNEUW(uYJ0$snvY&XuV;*xy7?{!0kWFzPEOY3NDNbxgX62^;l5aW!8ofi zKMdwkb8jf9bGR5=vwFr5?VI~igawAX_MzFU(_6*q%3w|vFXU}88_FaU^-jV;KL&A#(>#b zx~M=Qg_?>=tV*rStEo+Gj}glR(G<)NU$&b^JQHep=jT(EL(U|lSNZAj0PM7Lv<#}6 z4EsIq?P**=ZA}=&j>9RIo*&8c5F#@VG&n(D$5oIV?LGzt$imRd1y@>oS9LXQFc2?+Fixu{&E=YE~+EvFd@g;a5)%N zUoa^zkXs=OX6jclV?$%7LE3#YVjH@oQ99mlAB_V zw*p03;0q9B1oTxL7$4YbICsW=4VH3vUu00q&b4I^P1>d|?JzqO-#X4)4VOY)=eJ*1 zSG6b^r<{AY|87w&O30TPzM#?v5veBhJF3QubhcmdHaX!y)dQrkm%;&?sg&Tepz|ROIBs8n14= z&k`1hc`2QzEw9|{<_hC{M!%>)wM^K|(o(@ISL#}1cHGZ#B2j)%LfLD0%HCv|`ugy^d8X3yl=b2$UG-5*wbDJdg;c6mMHo-^bXwWbiz|X;* zS2GVhuth4B9#qoAoe9bBS5olmvAAN1`^I2CDC+*OK351 z$tJ_JEuo6-JPF@G>Vg5fE9wxOD=7`7Q+ygtN~fC=924*bZuO4;YkYqULLMlk{;9y7 zzWi;`#5I-PMWlUBL7qssljY#arY2I;M`Fcnu%_5fp%|pzq)m4c1OY9~%vNsEJr=eW z?8eLW?YQaab=H4?{a+4NsAvnd)n#E^%4|>*yzHYC^jLQtk;G-xU1Ti-M#c^9LPSQLM} z^`s3O=;>D2Sa_j9>*<!bSQGyolMptz^Z0#t~O5-BDT7;~9qmKc4SAyZ_WGNIZLDO7{Yc3MU4 zd5%dEfS&lKuebgcy;60pW&S(j965vHv!p`lTFifE0eC731RC+;`yJX{juyY<+eezB zxq(PJ{At|=*+e3eGV=Y2HYmvQsc4S?!T1ijSg)6++EGhL4V7`YPlN%ACnOsp_1Zyp z-CPGTpz>E_=F#6qxG_tI4mvdmIj?DTBCZmmJ{6~=_q@o)x_m|C7#~VpnQ+n?I)2^4 zDsts3-u2aOA2w^Xq^-Ad0xd~RO+IX#Oe2*fQ>1vV`u0V%Ce>O9UZQD{tek;uy`ahI zNo;wb8YF8KrA(a6K)&UNBNrOjpCP_;n1ws0$ZD#e})di z8i(j7+H-kBxMx%k0CXKE9$lcwgKJLzP$~%{si_T*BDrjgvVlnt+ zn@v}gKH--4preMCno^IaduQI*T22#v3V@cm?H<#>NyO3;%kdkYZW#4YyY=oPrF(gP z8PIVMZdS_3jE^Lm)i@jzp~8|OVF67G&y~6ETUfQ;md~IqqmQ6b$T`YyBgTLa0W>`( z)`VRz(5giEU*Rg7@a3f1msUGzFuXS}7*F3rVI5FIF%AXoRv{8Wfu^F2(OVwN zP!i5N5!JU6ZtEd5+A>S!2H$`dnDFldZCxB4n-xzGGxPZKk*&AUm%QD?yw*V1+C#w|bt0fIva65QPh?jg7bcXth%-~@Mf zcefB+8gCqeyVKC7-`_-k{V{ z)e1qqzIiSJLP4}uiK$%DBVG0um3YKRMwGN%`ulclbGN-~XJ((f?qyh>mo6rOSOnCb&v+ zGoD+sgfyh(`eCoK@_V+d?w+SPj%tx;E@NIze1fs-E+@`|-(cjPe@r#!+uytwGFObO zuCbo$`ZcjFOqhw~HGC^7ij@~0B54@7y;V=)X9Av55q(-~yzz-8W$8S~@%^pm*vZUq z{^nJ`04g(zFn+}s_{LwlxWFyU1##sv9SVnF>VVKz-_nlQ3B zsZ<1F;Zw1ypOo&N8{irR8nuk>v>N?R=LVe^j$Y%NcIsX)+f(!vC&@$+I$*rtR*oKeL8LIX${k%)H9cAP82dVhDb{i{`d&2BNA};w;z0H}O#v`lM*x^6AB_|^h#(9)(uODj+WH(y)U#)FTJ1%Y98=hZS zMpK|F(*4)G&aMA!)(8H`@fRk^U5CzFLM}v|O7{x2X7Nv}9sMicf-aU@1)=Ajy(ghk zy>7)S`8p*fTU=s_#FXGRWW@tEYGV9UaaWJ;gQr>6AP#X!(ght9_I>fW0GpFUWt%jx zx0nr(>ITn1C6C|+*8ud-%o@dglb=#>q-DjXbvz=AHCtYbGoz#~u4&l2v=&-knsaSS z9Q-St;T*~Fd008?L6N{t$X{`{1-V`krRr9MC0?QtC_95TT|m1Yoh6E1Q*rN=0s*n zjmSou%bFz`*ws>V{`y*9|7L}Ap|_p;jZ#(qzYA-2y+{7uMs%x@+~+c1h4fhDG7$xG z?ihqh>Bco=O6T)C@F615iK833pP4=XU?QV%AS~Y-Ieq;@qwAo=vvH`CCmU)kb&Ckv zbDcjTrT!BfowL@kfEJ&}!Sw}eF^rX{K)Un5Z^(qjy8A8$GpwN$XxOdM6VkP7ltL>w zFS^yfZPjqv*x0zPbZG^)+D=;|YOQVEl*_nJ(_7f0)E~*dmn!lL_a=YqO~_8{Ml~>Z zz-N=qb(P9#G?LAfTsGtd)=x{gGUsa|e=y-A;%;t4}tXfEOQd{7ed!sI2`) z7n1Tv^l4lZ@%K4~$qO#2n&ocXkks0}nk_~|Kq!)If;T-S!d3pL#BN#eQUcIzgLFuVUmm3w%6>6%E?@n zs7qIbFL@}`ho0-@9#ed4uC`kxS8VtM!hFop<^(-V$qg3HGqnL(<2w*z3Ax;GIzBFA z)L_gNP`NG^9m1@il>khTcZ23#PjHaAL}*R&<)^uT9=^Es($Afu>o5NPxv%|!ceQ0l zIgdiysEG3aB^@a^C7#I)2k;g!EYJj92TOkFNmg-O@93BBex16?*=g1O=1YWg=IDR2 zZn%9nZuHuai1aC}Zpz%R|M$X5BN3N51Lg4@!FI!#*bt4M!&-kzA?LwcvdD8 z{U>r98_QFR6+xg#N&ZRx+$$a0!Jq32w9u^9)u5-Y%oF=b5v)1S=SBJM3LuJ_%e_*A zQS8`#TJ_IqsH04Lm(=)|N6zEu+%_9f0M2(l4Mh*}GqevxX9&HJIz)Hd5yIiQ7+pKJ zZQ!Oq5mP%yH``6W*B9du2beIvv2ln7H1uBZie4wgy_RQZJ_`JAnQ+@i2kQpaBd|e% z$LW>PHT5>%o%V<_35~KhcQJI?6UGQ9Oz}t zR_<7%G9+D%m)7p%tx3n3OeM8LMl5GrE6E2G_@tZ!bp;6@%p5%=QOOR`U6XIC1Bu~0 zfQe0p>Co)8YFx6vROp-&}BnRYLl3L+;0r7NeXBokrre>NEmqPG5|aTHSbm8nHB z4A!d*iL1hy7Uz%J)$mkYr^6Inp)VsVy<@%mx#l%6pic231q;ust);w}pXl^L)PMgr zebeVHLi9Pp!@vdYnBu9){w?XXfl$YEgeXg-EH=qy?DJ2^!V(zE~ zKcB?6{zUmIrMFMYFvE^b%;35;yzlRKV6*g5iPO;rMpCmpprq-dSN%|2tjD|-_IoJ9 zz+y~caaHHl<#@fRuSWwPdhPU zRz2Go&wcaRF{j(qC8EupMFK%rU=bbh!-yfAP4tPBUxOI0lPQyqfY~pA>kG5Qfqp_8 zal;5re;V$@F0Cqx;5peBm7~r6{`^LZ;)l~G(TDy`*qpxcZExsV3-`Yv*)NZYyKtb_ zYr16(zw`6MoBQd*Rcl;Ktfu6eLJEs~&t0`64GM%p(SN+8y`Vobsk*kqcKVAI9%VSs zX^d*c+&0ZDu0}s*aB#e?(p+tWjYB*^u6I$VFdM6+GHXxM_`O8@hc5+(9{ZOy);h%a zukQN^-fh5W%Ol%|Va7&sSdv5+$JND3^D6hA#<*77AROo8oQkOZP3wcrIichT|idt*M`$L{w0jvaUr1S0SC4j_Ncrd zSfsc-YP$HUbCsIfYD!H$14A!eL-HKn`V6`yJ&5GgQ!#bLTO1e>9s$C-#eSaZ+`Jb- z6=p{LuepN%@2=`oVo72CiUpDNydR!ed-?Ul^0E0;wcOiE zkAG+H5J<5sq_jHS;hgw(OEo`^|Mg6c@law67TJ<)`)HW^;#LtR@jK09ChNbs6|PKB z&@QDxlNouuh_st^i9F2JjRmJe;zlh^?S4FQ;1gfD@d*3%F2J=q?PF+3vL0M+kDZ0} zH#w>9+$V6hA(T|ch^RPSTn6b=GZQn@=^+G7@|!!lQ$L=)ht{xu`E=^yDc1>!Ej=3m zlNv18vJhq(0*Ayi33VzP^m<+@njEZG^eYK!A9ETUq=pzH$(XKlqo%pBOxZLg)v1w! zr($DcUm&X+SFxMe609kKFZFRzuw;st@2Zim|6w-Nh5=S@uY#?18_$_^D%oqsG_vEG zHQM`9h91Jb<7nCEHt`H1M))!L^Pg$Hv5$J{i0~G13kaNMnD^e{%dCd}B+ktI4bxS} z?Ke*jK&?7k_PS4W!rpKYq`YpA}vgkMs%bcM4tHlvPAJ|p@s_X=ST z-Tb^C)&G~Q3-&Aj6W-g?SiKI8swK@8kO=?!S4d`EMC(Y~kGG2{%nbT%78hiABtB7h$Gqr44YsbVTupWN3 zuSNBm2g56omi0_OlqInXLn{43AIa*2sdQ!O(OqnG^y|63=lY$X^r70TyYBNzjFdha zto*A*9Ah7*5f8G1r%ou26S~84oP|1`q?Mc6fY*EsV z0CBZDEs_&aG6a}qhoh4yNw6)(M?QT2%jG}Ib+fVI`U{`o>d-wD5jBd%5y+C^lC9yh z6J$o!dxK_BtgeF>A*)DZJZ?|+FwH;fIwoBGPE;8F?=!!v|4Y|!mNrEi!f&%|*J>l7 zP}KH+EXIB#V8L{q4gOv9qp>)w{6hOiBm6{@4L{Bl5j>ah$s}x(#)J3Zrle|_^UUzL zWC;tueG^Qe0EnZw@{yES^uu^lEtf>`&9CX?jv+6bu8-oB6o67YBuM0C5jT|;Wm1fa za!zGd*5g2?L+=Z3$TaJyX!nO*hW|DXL%Ul2#QPuRJv|V6LC@!vR|J&6Swjsby^baI zE^_}}XBCygPU0^pXgGJuKE!_!#Z6mE=0C46MqbSf$W-0h5MK^L$+;~5YGk|fuU_wJ z#_fhz@mpHx*>Y4ijw{WAMBgMh1`J!>n*?X_^Cgo|aey@mk%_ppPEz3tg7*dV=aQ`+ zrP7D!TzLO>K5pe{@v|U|kbRU^pc4u5mpEj2fG=k!c+z}vlkz|DAJN>?UB<`|`ITa* zxiB_?_2EaOAtW65_u({()C*FSC#FNJoXvmsNr^-YRRab!16yS?>nQ`LG;oMSw2p~g z<+X$2+j;c|I?T+C{jkz6+oi9tCrX1PYHG_X2McDjbad`ecpa7i`7%kq&t6IYWxUb2 zRz{f?O4D=ZEMNca74>O4AY_cjx6qsW4L3)B(R%?$*Rj7(q`U@1UD(~9IKKv`Wm8S9 z`+Bs~3Vw%f0#`oXU~hW8U^>7@{G?(yWx;<>rLJ0>D)xPtMGBv3uM*Oy5wU44%-b9vtJMGgr(EA=}SI+vZYM zKA=1P5;~={Z9nKVzZS7T(bN*K!{s8`G>4VGaJKsN2Y-8beXE9|Ouu8Y)W4 zXELJF!l7FT*n;`YMm@7=h!m{t%Os9+h3!<5KTmJd6Rm;kKl~T1ia&dICWw5(YQNSu z$>20w_J2?%Znj5E_CTz3W8U~?OShDhvm=+C>>Q@L&zyDv=Q1&1O9!qBY%6F@9zr65 z`f9RcNz^p-@$H#M0jM0gOhZF)Fjh=O)7IFt@$!(J6O7^(m4Ug6i~68VR8kw^FfSo}*j4m2f#xOo#MFhG#49elZk~=BV)G{(i{!mW`66#);t0^>1NyI6) z`KF=QXye}CydzDg0^X+`?t(l)&OmK)uO%c7ZXbtI4IOjmM3c%qhWfBYO>~8IE7P6U z;o11Ow#7{!7KfF5@1Jj^FtXXGEO6dcYf}*+{n(>k6GmS{U1!YG3GEb!7dJeG`xm0` zIwa)Fz-)ryEqVB*)Kz$ehaiX(!v84-AAXX6D#)2_j!_otx8gcZb3pAfq41<|N?+tG zTTj!*PN_11zyOty*s&Fql$_h~fij+6#eeNmb(-uzu5#aR$TGV^KNTdJI@&dasx1*z zu#S&b%UaUp13?<{W5G0}@%PScXFPi{)(pn6HM+l(Qb>LM)}-29@#;PNeUlQlqa1;K zZO>yLjYW@R^jhqo&YYQV6s`vo4i0q^>@{c*%o1YLx4c9O;!pi9R;jlt!;YuzTNajY ztGzF)yY<85avRqvtzN=jDqvzF_cMoih5?ObuZTEOrUz%e3`BO=L{9WfFQXn%jbjB%8TepQ$%T1 ziogEDWUcrkS>4=g0Z3rQb`A`PzMc-7(dhchii>w~}bHtDQ=N^Vb?Mq#| zF?mQERQBtg1jY@!x{IU#ODg4g=boWO|gsR)tA zVf$Xjd2=Hy=pl43)6BhKpg_pn^uPfNmwBU{RxiDD?ALQ3PJ zx{h)58{od}yy#g~$jcG29WwI$$$3Zx<(c=-#v0LwGR-J8j)l9WLD#;V5huqzD zhGQKu8{|mmFk+JwkdHhcK!f-QQ5%98I1IoGx*F{hDA8gCZhTEv;6K$T#3;-vGm(zn z?uB@tp02NJT0D`$is6-dZU0)`RH?t(SK)QZC}^VcW4>cj844frQ?dfXxQNtSA@sXT zB5bZr7_AV2!9e?)RM4df7+nf4go-n}yI>t_DYd}}tXm0QdN0}6sE_y24OTWO1l{+C zq0oBNMmX+NNKmw`7}Cb&3PHcalKpzypUxZu*J_$Qd|+7&gK>RGXxX=U@itL!`$jQ> zO&1n>Il_Wk_M5MNau>g8*;!Rpw)VB@$VvJWKZkuLb%psdSszFGC6yH^9{Ny(bYHgm z5o+=&1lF><&g>l(YIJ<R=JKC{d5#E*F=nU?eb~9ReDFEkKPR8$- zA=NnBtwM_MSk%r*<2w!vGBrye$`yk9lVglxl$y1~%tvN%0kgH3uy z3~R~rsEOmCQG)I;rYw)smzZ6bmUzTsjpHA-EOZEPVc!{F!_kx>HvQ8Ea=ngC% zmh{K;bks94;SOYCSjcs=$Kb7_)^Upt#RtSnwR+qTAbbQfE@0%w@pZ9A7~#jLk#nswW(JlgIFzsFzjFGuoV zx-qhUyXB=V0w%b7v6{y#4QPn=oE8G?j6W5bWr^^dH z9+0I3%K0z+N-d~&l~$P31IuXdx+qr~mmZc#XuzRZ>%|XOB89t!w8njX1t8R>yS*emC2W@b$r}t}M4Ms~2l%Xg9dg zmn=rA`IQ25IbeS6QUN}xx#{JT_ z<3V%mzt&MFz9kb!u29nrSt+V-8U5vaf8M=O9vx}Rs0dUo;xmI^erLIFjwX@ua46>Sb}mZ;;Dv$ag>8UfHLpVU(E7JQ%@$4hMZ6Bb#Kf zXC2)*I4H7HY|H8yD3F2<`PCN^1wZ#3G+7HN@e6=C=zPA3o>;C|rS{^y6Ov!|TTr?? zdaMtoCtMFpszMRmsRutxia53^$BR1NT|@QT52Kl*kbTvp_>u5kvXAE)MVJ7mcud_S zSQ3lUsir${Vpm_o`0CzX8ofyDLgj(7b~2QC&)$xxB{!0$o?Wd>Kt zf%d-qmmJ=2EJFFI>-33Z)OQuf;gmtfpR%;6eYxwGhbQnlGUjFVEMFMp5ulaY*a?r? z+)JFnNu~HJUK7^t04(slhTmz&i33#gVVdEL!65}AvwAV~67N513Y}9B8 zQn;WX{qPviEudp%rfnK3p1xGHZd1+p5}9>Om*e#jI;+)VS90q;ddItAymChjexRId z23PSgJBFv9RL^Evmjn4fg+gD`_Odr&h@oMdg_{=>Y|c*MhO1|4hBX=+T~e$x^K;In zR+<6QJ^_+U*+^F5ZPc}KsL?Xx`{6enOL6DMjq3i#rE@N+m8;rrbxx%Nh6+*IRP5xN zyT)de1Q|x*WZLdY=b<8wAw}FS9mF1Z`UHsFc)hq$i@AX61;ij$SAMabKlC4dT`>i& z!2{+b_{$+i=AVp|(9`jY_+78(8D*FKH(Llo-=pgH`&8k7S5dgo^@A@DNGa~~|60^r zg$@0~0euHIB=+$AqMUm#Nbf691o&-gTDKdz!%4gTS0M zw>c#Tmfn9QG0ODo>rdHz0s^biZpewWH)rQOH(X{|_1Gj-y=V3pm%3N+L!16DZ=RFx z+3Ek#zLSs>DRNsbAH;_ zg!I|kRQO>cUYUH&v42v_Cz6e8C&JtQ0;J5{uq_~2wh^{!iWfobJsC{>Eu}!vIrs-* zPH~PP-!wLYt)Gffgwy=x-(#`i|<#WWCc6w+?>M;>xv$3O2h zaUp*#QE4jHr(S191euhBnz$Ffr_!F&26P&RS-g)f4d#ljwDLhjbTV;RtRlXTVUCdz zv;e)J;k8UpQ`55qu*<{4>YCqelg0INkyApK*%$h)txtUs%DFkdSM2{|0feCWrZRC; z9EnayudXgLRNan#Cz+!I*rKPz46lbVts6(7jh+_{tSt@3|AfGiGeXu{=sMR{c2@E* z(Vcm}QYos`Z%-lcY`1$6eu;A7>Q}0I10}olp;ZnLQg2GP_U*J@~grQP7x&)5A&BiRa)%LvQ6W4{H_(}x>qzFk#o^s!{BE< zx@nOs%KSK&InT>Y);ty@+U_!$;kfcBqp)KncG@uipE2joQ7qvsH%Xx~OypuPTTt}z zkL&7Nj8r-^ab_C*(+tIn+FSoygyZJP7bPIR+BvwUca$3>8PSn#*0HaRPI~t@W;chs zmmBe_V8Oohg1_7`ZH=mmHSmg2`Qu4#?*_LnW4k7ON-(kt3ipr{=l*jD3O3>F5G6lq zVgXP5^G=-Td1!38@73?H8fPrsSN`^cQsrzXm%p`GGX;|p9zfW5dS+v8zQGx+s>gi1 z&e)`zB42|zwp)}b`YxKYoMN|$US?D{cOarZgQ2vg-R|z3T z&1?t4_eJ`QC=?6<97A?tvKXw3{PUpD~T_&{*Rx$pf&Fsqd-TrD= z{B$st!0h~g1c;vQstaBAQ;&Zy-blDoD<2M{v7H^0{qUG&MIaVbb()5zjRE^-$b8$B z;>vmFP?2%~A2w^cO}|6c%|yC-P5+J{U3PWLRK=1GWg6E~%Y z3_|{LTz=3>8NHUt6DcXF2L-3d^$8PY-2`HYKMI77E;iR?Ts##C=_8-muJNajISu;G zXTMk#Gh8h9445lO69qr8i~d2p5kDToN5L+hsdr$)4BKZf$%j>~yXybQ&@kooZjRk) zN$V)ApSn<3fC4uk`A9{*zmF}ltMPEVd-N9!zIhL3a0gnMk}-C$dfUN(tN(jgpqXAC zQPDNK{qAZwFkqMy^!(M{-@iJt{1zLFuN@ch-c%G~O7Ow6F>wtRIndpzWdid5feLA*M zTJ!00CPW}Yk?Ie5Wlu^C=bbI1R%d?wl=@X#W|lYlKeo+Zrq-Ab>6{tD%+-~gN=MrQ zaTIJO;dj|hT--zElRzKW@pmUot#m}BvYiE!dTo75*T4?cHKlW+{K`WG`NMtHR^7|t zIEa@Y03JZxvyBXlUTXBoV3dvXXN-@_;~Oz(-%p#lQ9Cn^00O)l34>Aay+OWf7~ip` z7teZ>vPljp%4*7CG6@C!iIu&-@l=7-TPe#?YuTn95lbAv-j`n0$z#f5XV)?nkI z7u&ESHn~mNA44y(A#YqQ4dJ*hnHx}!xebZ}WZa+HRvaIi7UzA)>L`KL?+Ef}@jMk; zalIv`hRh&gq`pGdkX(C-%Wb8gAR!)i^8eN<8MapXlAB%7RLJ?toq}{hrv~1~I+9=#P7+VL%oNbn{337p&JeGZnj95o_aPT0 zGzWQ5iU0Fe)prI|cxq~EIbE)ATndVVw+08g1y|mnn=+Y*>K_xPIfgPm1P6uAk{uH& z#3Uz$?$(lvTcP!3n4(ze;6LnI{spVwsb1EC9X*-QE!ttf!~G)DuGY z`msop14_5}HWIh`^noHz!@J6-a4_<6|Hi>yb6}n6UAGc5^PB(7ns?yaY>x1KbadQH zA_Ssir0Y7FvDxhX7h*MFS{0wxLN>@j zA4pd8P|WK8S*ORv{dy)YfGb_Fc6^j%RsyfKIhcdX68Z@4J>QkyTCHx~IEKO2Cw)B* zy!Nf09()17I+vO`c?%wO%{wM;YP||A&Fdrp$4@es!YGnrn=2XhQLI_ZthrK^jzwh$ z?vxOmD4U20HhWj$zlK^yJGqThuhDBMEIPXx{32eEcCUU3I^iZWh%^-u*N(`EX)L7M zpNV$CrCo5mPyF_z2IC9RseQ0&QyZ_5mqG|4#XDIf28VTRL&soXg4+9hs%BnMvP^!&o%G@M72S?JP6G%5Xa$2J>tH&(%x5AS*(T77=up3%bR*EFPn_waFYzn$%hUc+O>H@Tkl=z5f!0FD_v^`3)=>#nP)Qx zFsTs*N{=^U5`rcqMdcLO^Eal%~2*Q(fwd zzpiih%BzU|kr(0-d+StfeK;eK7t#NAgq={Ntm1$rl8I6ocI1ushw}5~`W80v?Oinn zE=Gz;0!fJlK1ke>H441=MFmi#XQZ`xzTENpHIz5s@#`t9N@B0yAI;>KOM%y&)@z9j zRq&rYMIeNzq2aIxj|#r@1x#nYK1LZmdx7#LbM@PO+`GqWD@X`Kz208#=`wTIj=#LT z-uG^f!hanyQ_kVtrG8_T(xS9|Uh8`6;`aZ+mRhZyz878^T7z5q(M>k;etLSQhbS(u z<=3yzbi0L`WU*qbF5AD9J@W@pZF;S{(@MPKoYQkpP-{W};HrWO16vNqS5k_%A1LIq zEq2RUS=_mTzG2hpB!9k`wj%S$)k5=l9oBXcL8R}O%Nx6Vw$Vq_hbe?DnomBT2ng6n zIhVzn9(e&7XHMgt!Uj_?v2~$ZzP+>ZQ@93!ONdBSB&N#G<(iu&NKRcJv#d|6x(^PW zhbz7J-w`4&WfCts^`IZsX(A$!TT^Aq8Hs-O1M-!JYxAUG|M)57z0ZZ`tD@yQd|}k< zymMezWynF+;n)J3}sxI+g#ukRuF93~6?^R6iQ-b6Z z)^jPpfdO+o+ZTyMoDouZ@k+nr^wRaD&Z&aIa`MtL>+ijkTG)!5ZvsX8YDdyzz{8wW zk0(B$kM68no$9R=t!I$bj^bPk!;9`vNZ->FioqOg23Cbfcq5?-WHWm@Z7F?mjNCS6 zUxG!%X09%yT``yHI@9r5aF$I%i zk}!9zASQI{fcX}Oh|?r-uB`gvMbO>DULuU!$x<9)-(6b8$TW747Qh9RG!|fZl36v+ zLZR?pl4~mTPsv`7Mb-5Sv8CP$8Bl!`xI^Z>n`hL=H;yZHN>(7L{f9D9~cx)EA zCa*G-Iz4t_rb>OJOU(LhOB`!e@zG}qFQ0RQAmy{i8aoCeJ{p6P+Qy_E>r`9D0hZ+V z?W=bvkTa4R$MmZ}$E7wH#4UEW+dFM_?BpBot@g?pr<5J>Uls&SBre<&RV~NcJsC`I zg;FejF(WV0MePCww_PSOie?%!k03FpGMFVf56TFNaAa^1U&Rnxi}wKOb4?ib?^5V^ zeDl^;+`(qVKJtf=E?SK^_=*WcLYfnBaRsOo$9i zf10z@JuXDN zcACNdc9VDDK)SImf<4iLrFp6U1_udZgVtJv@X~qQnH0XKA%ZQAZy`z~ye)V|Vbami z)H0{an={0gzb^Ic=8|PV;I8v9ndhf$`)uW|F^Y>5!4nJTk)Jo@-iIdOU9DP!8+3`* zAvWbuAl{b|&K1tk9GhZO7E-Z}u3pPG5jqc9;>|iP?K_~6Ijzh7=bOj#of3PJe?tH2-6`gz4&SiVCi(>ZKrU}|j-)A*{blp8aj+10f)zCF3a)Tt|By;U7- zwn7Y88hU%vbJbZcq+S~+T{S&bl)hXVy<}@|6hiv}Gd;84?uf_3$YpUP<1S0cdu7=E z%t}Qat~x#jY~Kpcg9^meonGul&qDj=u)<4)Fqz$p9}xrqc!%)bJI<9T1z@sZ;P3PM zR9U)tdF|$BF4n$n64vOqi*j96o@`pz*Dk)UuWDV7;d7%)utFTa{W_1!Ya1qqp2ywh z96v=TWWK!ec8cCFAGG*x@P4}C6usdb<*y_~u@=*{YEP?$KBbU2I_C;z2!7!=n^dNJ zA@;o}v;G?=^87Qg1O_Qk+M{Oo@iu9r3g-rdp{3KiK*JU^zq#gBOG0c=A{{f`@z@SN zSr`4R1I)BrXT{oC{BdZ#dGw0&xh9xs1Z+7v$M>Y2J8tWL*3>@gjN6s_)?i0se4_NRdnd%amb z=N@o!gbbz-(W-ES>TuaaEPR~8rx#Gj-t{4q3KxSuy|0t0g9B3w(*ksI{56#B=3yb1 zv6DILcTcUG-Uk#UMuEoL%2V=KuTakQk@+o#xnx@ z5O<3?zJlgOH&`uwWA(M?p#31b@=BIi?{}fgh2I9KYp>^C1k`@-A8_!jjDUD`^i>wg zSl8@|UeD5qmj{CI1?FCZQ#vq35QD3T(UTbDeg@e^quI2# z!Bh`Lk*8~_J&Qqtlg{0~1A51-8f&{CPAT&hcNU(nlOv2M4=)KlOV=}jTBjHlOX2VLrYJ?UkM z$4|YQ9>D%!C3-W#iOi*r9~v&TQ3zn|!;d6VNHgZDC6>9wH{RnO$&b3qyxCA-?KVq# znLqw)El*}#q$w0cUb>d>A&&sPDOBI>Bq$}d_H_@QCx)t4HF*oMjDwH6ZtV41C(Bxvs5d^AH@ zd7ITE**@hV%!GL)(L?<7Wf|!EGf9@m8=7pk7`~khJ*w!w;&J{Ls_gLaD zA$kFPvRsCV@38E+sQ+>Qa0du9Ps=1}eUOULz-q4jUA(yX-iFL6L>$Pq>P&J%Z2#`U z`=J|o*CIc$mAPXbqahSL?Wn!rUk*k-e$h)h?6#OBET);S!xoE4wmVa}BNw*^2rgc$ z&74NlP2UQ{L69caJIHl4ZQlE~?+-l4B}n!x%SY^x4#>pHE9Hs^7Yj)UBD);ukNow! z%b?~s;M6LL=d8y(65i_Rne687u}{w@Phkl`6>2W=1RN{DLy4g# zap~8tK{D5Cu%>?)9 zTr-Kcc_ku_o;S|{$cCV(dhlQ#B|jeh7`BMqS4Rtn&jeF3D)EA-EVIG?xg7S?@nnbD z_os49FB+Xi0PE=WKOOEDw&n3@JL!IDzad7V z)w;M^zdHfzUT!$6ZP3%@lxWe{9l+?NA#hE7B8wJ#*IE$83MoUtVLUKTi^+Q+^xMgg zK@dM6z$~JRFXdk7po5K88)r8};g4>0McTWW^D+7*ZDHpzI+JNP%HP z_-yw!SLX{N!alVMxy|T^Q<$~%q9QK0hdcP@d))lcinEV3iX-g-;ZIy zIY(!@@x@}0f!z5S_Qo(K*z5`qX!OiNwWYjA=Ooa88@aFPozEAMY_J>G_!tQ$p& z{T-GLA)W&Ak7Ko{qd1##|DC+b@=wU3g!8RIHeG$sFSGurg?zrmFY8530fWRqL5o>ug6=*hlmH{ zK2Bw^#WW-`us(v)w`L6f4L?IV^U#iKHv9?Sjxxu6F+aFXaW(kMGfuUmVj8I zBf4Es3NJZa-h@E2&qn?keF|F=OQza}+F#CZuB9&7aCz{1>b^Hv1Ob3nwVv}G8*_Od zJWaCfHhOH`{5+=Eh&@y>{N&J_-5^;0D05Sn1)vlIxX|8p;ZZ6!+5g^Y|0xLEkZQyp znRe62x=7P+{V<)q4?(q`LNV4!<(5ixe%FVNLGUKHgN%xqhF^_!7Z+`Jo-NKZ@=3-R zys}0=&7yqAaQUtnpamfL=AXZDQKYJf=!Q7=E3nnIV~~Z_^Km=BtSDsnd%w#BA>@xA zq+uQok}sby5ZCQKXQBS}gOSDpUnas$BCfe>!9NW7IoM-@lAYg@GiaiMKxv+duXv4p zU2ygnJ_l-7^MMCx=dGSJarN7sGICqcD|Nc+M&dC<{`21kiRY!FH8nYpoxcNR@&E52 zY5(sa8FdU|WcO!old?&v{}Qlg1T=VLVg5^_yUVGaC3gb9M!E$+AZI!c(nOY;Yfd2E zTW|KF*kl!xpTXNeL4;!U%q0})!@VR9tBe%bwJ2Np9l)j`sCVP|LSeb27`PaY4OQ}n zwd-{oRu4Lj7DyQe*hBEf?Y#v1L6aXBr3g(8cIMU_T~j}!2EEIhO5>Y~ww{|yY2!qs zI;&*+_AQZPI|wT*+WaC2Yio`yhCiS3vU?Gd;`ZV>wIDU$W(GIn(GsTbnSQ;vF%OHr z2GDTP|FEDtUN6{e#^JL3;modjfqhsb1XrhtrRlP-Z!V7^DF;7oqPahnZ9lUg^a>-l zEh&}dboS+<;ctRH|sWD3TJ!CJqj-<$nqaj0hC2<9?I;NE}U(-6}~HgFobbVRrI{2lgeQ zk6hr=yvXTTC|FKqrN?Oue#A_}BH@@9o1+LK$b53e_eoK%4Q4q%|2FCL_)}d>pHeE< zF=*&xB`Avr;M|9F>REO|WGs!Ieut?Q%2%6jZ3)UY1$5aTU=>EgDZ7kDFg6fV-ms_l z!hGI5Z13se6agPz&tGhY;NxADg92tle_8Cg8V>F5nbyz3eH!|s?@ghQin2At4p6ii zMu>bUAljKWF^8Kj*1zn*51I+^hG!j{_J|tIqwAf3M9RKfpk^Y5Zo5 zoLI6xlm79O3W9*R+e%y$r@CR$GaHzgohCXV(h0z2e0=0Hp)jdD!F|1PFKnYJXewph zj}ixuOg)gL*3cIFFg9FqLjp=b3yO*B0)&Y@am%MnpoK;4)KgsV5yS6iW!lQ*ZSkp{ z0Xizi@5-#EHa5ON=>9%GtGXz3lo@P*_@EHXk3SHn9pf>eg=yggn+^DknnDFg_jtMw z2jg+NK?}#iUCdVUN#3LrJ3$Wb>zHoc1n?J2>CG$c2-N;4_rv!ANc&!A8Cgl_0k`V~ z1#qHOM)2#Zv?Yp}HuL9j+?e@N42zVXZL}|wL?6zWw2;NP_fD?(KVfN{IHY7+dGXy^P zjhrT$#f1$QAYgi+`~9=4a$lM@%8+zEp(ULDQGFBVXEJ^2D4pppfZq=v$FMZiB&N?i zM5@;V=4Y-V^q#u;9F|{~RCD4L@*XNr`CahoOcXJ094=scZK1>bYp{rcj!yHLjPnKE zf#N48W_e1uTidG&eH2sNAncj#ry#3kqXh}kL{tym_-)4fKMX0uRloC*mlB$f7u$<9 zrGk{%-}?=;U~5tvGvw`ek|GF@st(}p@)PK1f6ReH7W>Hc5$&Z_K_R>-wj%WSc%hOx zKJtY^z1H<(Z8vkNRE$jXLibn(0{<-!NO&5Pg6*>{mjaxk>U+%^{m(|O)y;a{{#OO6 z+R~92PyYmm8W0iJSH3`vqXF}>8k#!~Nx6gEY^M8McU%;fFJo$|AE>udDxWd+pY8w0 z0=O~aRC?ct1Ub;;Gpn+w&Jq`?Y`fI2 z05}d!2@D+Dehi)&pXa3`->I?=$*1_#rJ8?3IIMufYP%veVx%;#t>?ZYC52b?igm|I zQ`I@!9nF}Zd%KE06O`=HgWs*geaYH?it&5U9z%>D9A2Q9E>DOJ^SWMgCcz-!?=dfE zmE-Mn{}&9zrW_|aNxr!j>DQyDrl*)51qj@7o+&28d`5$pD)Rtz(;qiZS@IZuM%65n z7F%5|rWF6jR;=Gx=+)ZiBWr@&qpnY@g?(RIsT%_)Fote;8wKZM>na;%tB&bYvx>%D z%kQ_9cRdu5W@i)tEiSv9qEEc~pmUld9sYelJAZIEn#6Wuu-(;t-}XS*ocvZfOQ?PS zTyXR5yQd0xi8>;dX{pWGpIzR_&?6SEW0=*6^gTd~l*m^o3_MW!+b}(Hp)dXrD);N4 z^7!JF*+9_!ryQ(={)Kqzne&q>p-(R%hyaQ^Q*!_L=W$fS--DmwQ*iouT5zsbrlpq5 zFR}y$dWWx@{mB*|-PZraVO^3;)_^t3q?8mN;%JV&$G!}fnuU3swB0dm1#_=4o#0Vcxo9;4#GIUBWSc%6)NblkP{-v30-QnZfS7 zFqW+gyHaF7S^Tv|TT7c{Vo-DqskJ7A-5i)#rdmioh&Bjk0Uwp_?e6ZG=HBfI3W&nc z_Imn=@VrB(0y(~UOoutC5Bej>pQq}nWzM1Zfr0yt?aS$=53l0x-aD^{c9^fh=Zx#hzogK!2a*>@t}Dw6HaO zy*`PwCGMLLrZ_M7?e?5ZFlGZ~ezJo=%+z`tJV<=NjbsHdXL8d7vB+T%}dk&xvcs@Yn*5&1bk0|M3x#Voj(H2gtP>-vaq%SNi{GIt#ZZ{O|2=Bc+v+M$r#l z(mfjK?(Xi+fg(yHB|W;k8v}-PcjxGikX^?rpc|LCxXp$S4~MT?UiJs?2!kZ3qg6K_UoMrDIRaI zD-FgoXBD!~DP2uN`mFxUQt8&jR6HonT)Rn% zMH4d7W=@L(R4NusIxi1E9)0pwt%`bw!lMZ%lv?lTb=0o44bguDb3y6sdBMw}OQD_Z z^ju?$-^&X@k=I4>%0bHl8L&TPFRVp&iBV-FQzvyXSUe9Z*#@&852jomkrkVujrZrA_Vv+KXRzQk!L_H1p>20DJS3{ftDruN$&UK+Je#a{6wn=&b#q>v{kq%N zxGe!zh<2^2NB$7NCA4CV0@fUGH}wLA3_t}D^S}MNZ6b+c;kKb~Du&fZ@E{|Yfw)Wl zQfw}?lannL($$KQxdD?_RZVh<#J@Or)w3Hf%Vv7)NMB}@u%m zD^*d;@`Dho!suPJRx#BbT^esxomGp9qO!Ypj|1$M7XohKXV--EDvp^PZW}ITW24xw z0-EY@Ma#5ny9M2S5&T^t@G+o24qn5T#$yo;{LE)et>?yFmeFX{8(<~L2>i$5 zTuE8s_q}i_^Q`XrgPyp3$2+P$b$Z1i)2$r9ooRt5;mPl~k6>PfIF&twEUM^xyg6$D zy(zD`jh|L$yN|uQnr(V8NH%!-)9&X2l4WWYBW&3Ipb0F`(aDZ)L4;4tbM+T}r`6)j zRMNiP&hIaM!{KjEJy}_1;eMI=HaI^;(>L zKH(gzVxTeO7NiYd^;u5mi@v5`r9uNZkmLx7hDWCu-T*F4e3A2=keQ+q`?m0qAWuaq}?$phJ_pY)9)` zm!UmnSGQ~-@qRRy@@h9EWgyN(ky)RsrDN2aEX5P)wkjHE9l#x{teuH6#<$Y@7e#a`=M|?Gfe*h0QpMXYPI=aJ=?JV>^*=;?M!#Gc{R9wAz~ms&b^IO zux180NE!Mrg(IbFJ6{&*uxLOT`>hS#B9aCMH5d)YH?CAU0tO3<<8eIloQ zZ)0NWo;oB%McEiB_}kozmCzlp>gbHFiZP{cXAK{*i_wfLKcO4uCAdAPs zcdYne!WjZ*LXqelUL>eWLgj#sl>`E6IayRF{Qjxo(f zkXWm#YiL;}DTA|*7|~ytbHZwZLBUx; z_n|qlfKj@*KrNVP)`KJAi+9MPF4BsD&In}vCAmEqsNRG4h=?hkI42rA!!yUj`y{-S z;f)QYo(a6LkQMc0@vI*akz+fD1&n3-Ta!Z#mfe7DcVz~D8j}Ty;eb2?ozrzrlwor$4Erqlg?#Qb4NG(eRH}YY*`4 z4@Q*gS1ttcZZwpe{HrwH$yy-qn;$}N{c6@n)(kQ5srdygb}CE^+;5gw$Ga+BZn_k@ zQsvfUQvUTU{m87F5hZNb6p{nk?fb_(l9|>z-})Em9;;l?5$`VcyULs)ra!=PqLi1X zK>zHn8RqV~!k(At&h*$lf9M)`ojx}93r6UF89`ry+5z==ZEb7_&_SNpFErbkNkY@T z!6*Beg{rk+1iNoqi2YN8~p`j#)x zP)qgnbl@()46p1ctQEjgmE7C|P>+!nHP(;Y7yUy*#n+zZ4bI%g4y#v|<0aue0>Czb zS1hC={6j{;X9wtz#jAp?s=m*4uBumae9pQy7HvxMaV<)$l-r0n_mT_A1Hpnqz3DLkA3tw za5aqbPS0?&P@@_ZYM`2l@OlyZeNr%QK>*qHfk$@3?J%?5!5?TU0=w|wy6q5_8FrvH zL`vE6>g=HsAehw7h|ARU%a7p{RD)uvdW3oeYyb#uW`rC_2(ja!kO=l_e|_lt_1TmD5a_Do~G@2y6mG?4m&GNvm0&AwBH49N7MPY7=z{q zZENqHcYv%Zo@!bA_E5)!j9N7Ej9G7+=mBcDvy)56dZA8&HDi%}J65~elft9aJ7h7~8M2Hr-w)C6CI_EG|j4m_$MlM9vRJQRRI zi5uQBye;(4pleZ@wuNtHAIOQB6IKZO9Q!I_?Fr5Lq5JQwTj zC~1g1#+0fv!1H`$Z(NC!BCHKSvk-Aka|%-e4l5(Q<423?$Sg>u;dHLW*eEUeMm-ST6wq$wGis+e_+!Y5T!(WRTaV{S$)k>#RRoM7DxdIi=Gd)=p zw4N(VjS&0x{IH`};~4^Xr*|AOXx(@L?IyNc?z!KGX|U1WafZ(CqJG`H)NdhhuUl64 ztl`Ag?lDJGYw%0csjr|@jf@&#Il(N!F&tf_*WHtdK27dVU19C6RC@rC7k|U;M_r@D z_s_W7m~TZR;^GuzzP#4G8bU7tcwu8kp>HUHszoM5IDkQsALr;NS)|=-{End6%!TOh zL13HX+sSE^l|D?{I7-o9ED9AKkhmbAXIZ8A`%Rbs_#R{1SBUNV9WGuq>cXjG;-Y?9 z?VmSvob@-y9{!+7;Uf{8QxX;GwURJ`Kpk5 zj)!DfajWdPJ4I@(=?+KE6jw4e?&L1p4ZSV*zagY~SaVU#^urEyMbY0Kzhd)0o8J}l z+WB)f8cWXQ&3{6itZQ^V6+iKzU3tZu1S}g25WJWYT@LU$SqZ*(YJObGD^xhkq4&JU z?ZA7l(JuT?;`2Lif74YNZuFo2zKDOIOxz+GrrJAw00uAnTf%D4Zb|?pcw_DO0u z*cp=IHpvS6hhXZ{*M}cFyZpTtrx>S0LRL}m zpLfOv20oGAzv=(QK40rRiCl_QAuj(QYd@=?$pB^~DrDqK^2nzi{;EP7JW6E7MrTvk z6A}{bx=*Da&1k;=a{KdrqTD;zp}|X254j1QAYb?_9o*!1)5XgI>v$?G;DjRD5#DI zb*89?r$Ug$yocDdU!9Z-gBKh#ES|YbjlhNIujyINze+-f8h{O_j$*<%b>VEET$hZI z$LRd05719FV}6%a2)IoEs07SvHzh}jJ0FlizJ+DQ${&}J=N&_xBen^wl)C~|$=xSX zyaKCuwXrF2urOIQ^7rN(0`J6Ea*5dQ+ZsnRAIPs|?AF;Xs8tAyJsk@;<{Ige;}GJz z`HFBVB8qNrPvb=QiNf^zfaA8CY?W0cy!|2Qzu|*l8FPtsO64oJ;YEF4REBod$9i~y9RD>$0Jrc1BTsUAY29wSS6V@P}xP(oE(vIL*sk`Yov(YjU3GWqGsq3&-70 zQo%P@qfkmmVXW2|`t{&FTx%qXRswQl@d`ZXLbwU{l*i;TgD#P$t353R!~;_z*uZ=W zQKSLthRFzQ_=d`24T;z$*|xI-e0U=#p@sms zWAu25Cl&r$+^3Mta_w6qx%o-=%<%8flk~vK7tv2YzmMg{qQKK>Dd4BugQ++Dv%!Ju z4~W(D+S6+n2J7|j;`W`gaVgzxZWlHN3yZ<_BM%0HR-raLjMD@?$9w8IOPXa$qX8q+ zGbD!#ty~m(udsho_J$p%3!D8)rFk5Sc+xwO4NfaZl*`3t$*tWbBh}B@lg9SL1P35Z zx%9n-f1rGn)qBV~gc?JQ#GhUD*W0M~y`YoUKX?%5H$~!HJIp8e`*?7>c+NGf6hWS$ z06_`W%(LDFB9IGs(Q3x?be)2VbP2Ci#1q9zRo$kFha4@$Eg*u4^fOQoKq^HtjSxH7)2MKsyQcJ{Tb35Gp_? z-=;pFUsY_4IC+CFl$wNVY*E+_x_Ueb5o@%2Eb`d=Pw}={PopSsa~(er!riE#Z`(OM zoc#PW6xE%XJbht8veM)W|E57-mzbZ>Uuk|0*n%Nyi{r8_9t=5c#*D6=NLBcmw|H z9<>;EK>O?03I;bLw&@3Q{V85#j8xf*P!oCg9w9?-8IwC0aF3-&Yfm8!$SN=VQQnk;pKRK;DPrF1t3}WmchbUvcOq z1Xdhy>}ZtKHIu#2VQY-3gi{`u5vgIT&$k5Yq33gQQ+g<|d6>qFUG ziu4AKrkl=ZH;Y$t?aZ1^zDaL&!!IlebE_wB@P^>v#zwC`OpgBq^VNdz^l4~<-ORor z@;#EVY-Yuyd6V}Xx$1=nJW|b^b}y{CHIKMV0_R$dsxa^$HiZqEU8<>!^bnW#E6+d0 zrshhgS9Y;m|G2={Vn6w?1ROa~`i^E7DHuk%y$Qu41^*s@gS}@GNisLPclpiiMKtJOXUd{y>il#)lWDH zTB?HnN^Z2ihtU1XeEw((z7eJ^&XDvrj^|fEA!iiOkS|SPxOVwaC-@Mp0&uS;IzwDb zph_CJQ?Rh!XWAjJ3KV~#J-FI?s_6>`8Z^`uyXqDrQrincluinpD zRO6-Kw)_nq`RhseB9s0fj8I1*0p*ZMnH|M+6sy|JuYFtD@=-Hqxz~*6*IAaVQK#@k z+N)d$fQZXfgVWsCww=-SbfSiGQ2w*Nt9Hr4PD5ag&vhV*xh^5Tdp)fn)okQXDS49d zOGB}?I!<~GXHQ2Khb^gPzb+M~*SnuKY{W)T1_2Nc;n+cs5gn7&lKyiiZ`Opty?Pr# zua4nOdZnjxx;WwU2?I0_qW+-8rl7-Z9h1jl#>paW#T?O2pXc09W%A9>x6ua9i2V+~ z=BF&03wZ7$%|esay^B&Nx7&HPQG2^L(kXx46>#k5{`CDlhD%+J-G^lFP7C@!lRVF>ZR89!1{#+W4;LVeM6| z-`G~!nSYdAs6gW@U$X!WYt4{!A%Os3vGv4u+DK~PRxPe^*sJsI&op^s$=$`S#n zO&k2D%aTge9Khz;r*dyhX<}`F4hd+lbzVPsU@&2Ll6p{%9f|0d${?ok;5!E-S@>Yk z(A8BV=#tJ3n+htSwjO{7QEm))LzcH>XAXk$4U`>4o{yweH}f}MFtJmS{Ulsd5Y^Ff zfW5noy{YspWvWO{PM-S_DP_f1{v;6nQ;&!Hrx@O&GL2^vC~)Tiw)?zrPF&h~kH5&B z_4l=?`)3}vGy#typfKR@!j&U-v^+nbH7m`Oc-6CFtlpUI6;RLutz*$^Ii9pqi;QoS zOfn*U30!@l+G-MzbHHmp1z*{in9wkP{d74JaEx$3Lr?_>iJ>7Q!K;ODmQ0+N8!wje zmwZgB!T{~alVaZ9TP5QrCT*8pVzY)UM=|#vCnHBHr5N|cGTPcC-EEHZdv$LlLr&(wW&Ws zA-DylVOz1h>&6P91nV^0*ykVPw%RU(%)NfcYz>nJ#M3uoG zfr0U+DIVZEpgRLL;eSdEW|O*>mT1X}C|=8NY4HaXz90tG06*}1qAL;@Va}>#T8%}G zY>pPwDp}seu(&Ml!5lx<7AG_NeHZoekP`q@xq}IIFGntGr9{O*V01$*||;W zIxLdEez~`=g=}noHythRbl!BH3|F|=AMyuojaALp?>=|HZ#`<0qfAJ>BZS9Pg4V zcM40(t=CYUl9!l0FM3_pSnjfda>vr}t&D+ofF?sX6y=0n%z}?s9}3^^+iTO(@aqAh zvB}oH*8oKHV8)>%<~UO?E5R_ERlMzG4Q47;7wsIM^BUGGrN)`sQ(5g;`QoB*q9#Q( zgbgd0AXPH8Y}*Z2E~EYfX95W2H&}iZ%S&xDlWU49*6)sIq0yokD0qYN(@)-~rl;#{ z6V^1GDRh$4heLCPhWqqq5%scTvN&#~`Mi;5RoH*)^cFvG4W(4cpm}P?()u|n?4awd z72UFs(QK1DqP+Sk`4`7Y1S7xu7Cef^cjFs-OpdVMQRDrAybKbwT=@QPl$yC}*~lN4 z_(-s%V$1m)4QS2`r!0?=HDS_(Hjb7b&qTDLPw93-C~<`WU+B*D#GW^zNNBIu;~s1- z?#)>xb?U{m>Gm|J3#l+>6_h4QLr@-ci8`1854*ROSdj;6J>(X0r2a4CVZddFT$HAf z*Bo)_lk_MAO!gg(om@P6n;2vKH12MEzZrOpa^rEX26N}rXnORRusT((6c__7u%hxV z64WBn2e!7u!CY}{uu&(fULwng2cg2xr>)zi<@*M)4|keTj;wboLlK6e3Rmt#a zx>rd{+-#PCRN2^r2YyF4Wr!xgK^6Hw8 z?(wL6wZgr+c-_peq6D+I$LzWfi;6rZXDa7UefA$kRn$&n5D353+c}lM2mD4A_2Vmb zu^(F(QlNx?6mh5v8f%gjmaD&E(t!kNU6eA>^DmsBnGLNjp0dmLlG4 zh;k=*4FY~_oHee$lVTHMmxxZ|$4(52Pa(|Iu^seKYQxMwRPfg!nyvQ9}QYyfw~?{ThN2IM1(~9|mB=L~&A{ zYQtD^3lw6z+9?g7_EJ3<_kagwl()D%5eoM|^KQ39fSXt}UVkW{OmmQ!KCUTa#2q|~ zqZY9y-q9}4Sez=I)R3Ic<54l%zCHe%K3SxxO4rrUFlYPl{rlU(apJVM(?tzDmM0Kp zd8(^DGEyw`rvQ~o$s%cULQ_!9Ek(Y$I0Ly?`VGaw%r#t}raYVXs<3R|ZuON=?RuqD ztA*FeV(0y=iSJV@P3lB4XJgyl82p9Bv+3DJdsp#h0m`x~FiXV11NNoypev}Vs!F~p zl8(z}IC%dj2F*ja%XZ+W*6Qy;$co?pukfIEw&}mSKqVhbH6f^Bo8rExIjotenDI;U zSh4wvar%v=h#R@PJq~qJosdDOUrNJhY3{_b17^S*NWP`Mu1NP3@*Y5j?@oa^HYpmA zH8+|=Eh*I+@LA|2U`h}?H??HS1KWh)ZQ~IHB(<|Bq6pTT=T8ZS-9Zo398)@*elggB z#$RJ!Ad?EfQu2dc%K;UbICjQE5huQAydGR~xg4uq#ARaV?mihF*pErm(fX!<-%8=9sblV-VOQ&G*|`io@-nQtb!AX-Zy7K2ED$2tMr!-C$VF`S~Ovz2;-@uU?-()s6weDKT2AAh2T{{R=o+n)n=LtBjjHOIewn6u7w^=6c};|3)}%IxhRRJ%t> z?Br4HwACD0)x-P%C6(e&0t`%SHPA+{13vvIjmUaa1SpsRKp#t`b9{R}^?gO z_)k7#(+^6M)V&=kOFY-6^%!$zCDR4^0W9$b(|~V$L1HqJL5W7BJy~tOG7;Eg?a4kW zHA~qd0mQi7hE$7K!|zp#h24N#Bh&p7Gcv~Dx&q^$Zp2aPUu-i}mTZf!fAVC+q_67^@Y2|vccvTC0l{8VP!1(u{W9=brqco;Bn*=zp+TpgQ4UW9~ z!U6!i0EMLgyLIOCn{L6NsS`c_oEYMiUi%XT0Q$g7=%hep;=_e@uMphB5ZFg+%fi4N zJ$m1p@%`oYjYp+$6s@8Eu-c{+b+P7XP+C&tQ0C!CsYZEoa!N{w#!q{ds4{w8XRvDO zfmP-fVwTo2GH9X=|&)rrbHEr`CYYgV?#^?nCK67 z+mgaZ5W?>VVL(i?Tn!&1oaXal;H3t-C>6-_Dd2^ciqQp=_iYkT(%5Cr(MqWjh5Q0y zE>>FRyk$wK7rYvDqX#4loA#%}UY&R-F_op~kBPa?)3nDnmBVNr>*AJ7adlNf9XtH? zus@U`!z#X`=`pCHW1s(>qU+odZ7~{<7y~V zu|Li3aH9LPQdU4Oh+~GDd<4$(IGljgJ%0174O?_5vU_#|+jrhXbRjNTMU;3vwNAD*fs@M!|TFp=u2_P&JN1CQBjr^Rl>FYM9SOs~P{Ze-9- zST%kY_nuq`8u)%EQ`GP9Osjl0*zWfiFOBnakDQRL1eh3oThOl8d7{D>B*2;ekENX* zDr|WOwRK~8^`pDJsA$Irt%4A3O>eB8<$?O$&Sm4|v2yW^SU{#b2If+k54bv!rp;LU z19ot!;1?iAfnfqjx{<3w4r4MjaQ741C3i0kk0vMh5Cbk7OIauE$zu1zg<)F}?YCcS z=cm@>7UHk|t#h~(yah~}{o!!09r3oQCaOhNo})7ujZVPiTNHQ5@O@o7zS!8lyYN`| z^4kT;F{4xl-wOBrQ2{8$oMeeCRt%%MKNRP30NtysU7=fs=({4Law`)Cc6@euWixNN zq^3U!x*4KumUwK|3N5ImNt#L10xNQ22C(^-QHQ|{6*k{E<9Qv!BoQA05?nk*zK*GSXb8R}J%x+c0Q4Uc$aejWH_=6iEgd70dH=%fPIf8Ec z-JRzHgC>H$wkK)yVt1Qj%xHF5*M1so?boa;-4=@>A$JIykh8V*e6nU%!`qm+z(0|H zKOc+z|5+D`ySJ^72jjH>{t2y7PYaVXwl@G)I!Zx{H(b$nfyR0$T)nW29rR2JgLMa8t5njINNW z%|bk8=LMdg-G4!@1#$c=(wb`Q3NX~M7g7gEvNGy}j=Z4@D%?6vmPnYyzh(eMVO?Hb zMYe>~-knhZb}D>`+oPP&aVCpA8(pTMv&^%z!#kQx_V0**C$H#v2R_e z6g}yCQaIQU(lX$x6|{7e{OHz-G7pU5dA^9chOqJVT&~PJ^SCt z0Es7s##A;Q2$z0J9{o!Oly`1zL9_#l6{huX{9c_`0Ld@DS***5H2ux$OAWfbt@SK> zZRc=^-wyyIorFq|mFjpULw+~#P01Zn0FtxPiwVGqmZX?4x1a-ff?r`RvRpF!zy-td zdSUpdT*i4Td@dUG#EhZ}#~qSaGqPW%*pZ^V?GVa7OJR)dE#{gMGjQq!Ns!v1+ea3#K*jUv%+Ed00{erOJ+uVz})~3WFVVqR1O;X&hnM* zywW4s*hjv#KYNJX(+`p_}eun9R1c8N_q_QB#;Wz&TE z$_Lv#?Bn@oQm9`2`d~cvzHVirxGVkxXMFhaOxNCP&H)j=dRevO2n_>X7cPQ63E8xM zz~YrM|}Eh7Efs|B#7@YjZR#??2b*$TKxCHS8VE5MbHx zWnD#ObNRKJa{xxd7RY5$mOHQ-Fg>}T7@Ux|MdI&M3|h_O{)HFw*S}%#!w5+YA!|x3 z(ei2UtHiu{{6W@J)@2ME^tM&cl?sape0D9e^;NN1*Q)yj+12N7?-f!iXuhU*Pd%mw zX8%Js(LRn!al1%^bo=!`OKd0l_)fMCS|vY|>N#|mp!o_%wHJ$X5=D8&wk09Vk0d(? zpyalKrXU%uNC`f zyVtpimez1-P(+Bt-#z5e#qmmx6J@7Z^4TB>uWV+HDg+M-0;!&2Qx)sE>CgGT)^2= zW=Jhb_grh+_M#IxBc{3tJjN6X+O-^hzm*~TMXEvstilP~u)I?6w%Zp93zFE27Y=pl zL`B<3oMmrP^Dv`e3op%O^YkvS6mm#DG^IDiXhU5?GgoO_&@!JnA2$elRd8${jrRVx z27w62gavbE?;6ifH<|8D3DZ8|V*Z#a>Ff$`bJAG39jijC<;3!0$1G8&J3c&05nb=C z)A3r3;^EtFERJ`tmG!4G__CTkC-1IK_G}N>bS86XMvOTEQm;Ero$sN?vzEok4!-tZ z2~lPj6?X;I2;@aQt3JC-Ze(EpurLxN5cq05L&Oe*8`q$ja8qbgj?Y1mALY#1Iq*pv zNQF%TIrBfq^M@pQNhQ8%4Z5G1`nyT5o}4dR?rQ*GQ6&sP$ z2Ig6vuL&j-at5hS1H4vo#>}ICWo*BO+uJ(C^_}cp!mm}|eGx`DM-KMuA0H=pIgB48 zUBW-)xzz37HbaobfbuMoDktusgkK*T9DgKx7f)1C_eIR&tK1GG_k!`vGUh1|FOoMtCBI6qX5 zh=lqVN`CQNYTYtwCkFT;4}B#Xl>Zm^Fc=y6Er9Kh@t&dIZY&K=!s5b$v9RCy{5yi< zy5Q2ksYv%A!w7%EP$LVH=8kcR3`-PcFS~~|0I=K7Spg&M-^hLd&{Ny5FfQlL0?%Of zO~+<}^t28THV(kp8NLulTiDMK$SNRosv5|Pp{_cYUn3H?!sz2bS0=*%xC?H?pc1jx zEc+O0J|)i1##D33Whs#@tfVZsWip~oNC;4o@jQ*g))XLByF*Q_)$^MvsjR?vGA*Lp zr@{BB91a^pg@=B}PdEe!Y6en{4d;rF2u`)Q5$(=SHG43Itvnpwx%jPvMgj$!>>gOn zC2J;f7hZgkB-85-4w6^$t=L~aeYw3SinI&Hx6MqMSD+7sqX<|amsHYjzphL@z|99m ze(_DakXZbj?ESY?6_Xj>9NRJcsOdcnomCc6(!FHK{z1-D{o~ykCi-pn=FMwy6GmRG zVli9yNMZnKyCk`5^pVg?>hfoXldho-ZED^N0pZFaC~##8 zq+K9+K!w+&x)Co%dcHm z0C%x7P!R7FhuHeXPhTu*qSJBO!c@2q#}a5QOxKQ~K=cj+(T}JZpOp!Sk$y7gL*sE$Nykx*A zZeo^lZ1VW!VC)!wfg<3rhH73dCOB_3LFK3wS^WP5%Q3D!6i*4u%;s9mRHRXCz4f&p zy8Srlxm2*R=+!jx?suo?zfRc8bGc>+ZELd0Y4N&#zw)sluvc;_M;Ik)@}hKea!;YM zE&8KzkA%-D5C9|u%rGU|nPH6O){&7yUl2PI!+Po%FoYm_r{(w!h%;7*AuRd?KYs0^ zNP+@!+OGBUumqe1t;rRnSsWm))=O9+lR7K?b55v0T9nF!|lHr+tm(WoKHI4zn4QPVR1RGMV*~TD#a>4E^Wx( zzvoGH!}!lc>0P{>X*^QI3yKeGBk`UD30iLtB#V{PmgG=#IXi~;a9EuG`G}s5_XC~d zB}a=^fS$z-L7}fHr78jNL(i|b&YcsDw-=(=ft^^5fEfs*CvULhD*EOoGWWoG8XJ0B zbwA!tB(1!jvfS=dJX7T-!V`4o=|wfj<2N;%rBJEgI51GGzGZ#;RZTmnQsK$s9L_8g z`=N{+YU8La&1w$h=iB|tm$JwHyFmd!K~Ce33Ma~{h452eGjM>!YbfqhNQ&NUh!81y z@b+T2@ejKkV~TTvBi|@-PzHxUvfw_|y?Cw@FL9ZuZqOsAtEhyWo+fP+8_z6q^F7nT ztMELEWTkMu`Nb@L2{s3Yj8L>*<1X=p1K?BXI!&mTZA7>ej}bjR9ZfEm4gDeamX}bhxB#xn%OH=QDX+IVdW^ zokNWTvo+Sy+d!A-XkU3|W{Xl-4XjD-T=mM(|A5FLPjlZk`-oH_;T_KE^YWK%a;?kn z-&>U?Wv?O@bQ`5tJi&D1SBU<)fDr>qhAfV*xn9 zF*Vng#yNepzSIeHJEinjvZJa~)@JM>}nOX6F++03{0U|!VwtN;}J zX@xE-!9Eh2vv{!~Bu&aUGh3KWzOT;2V_)~0mA40UhAL$?}SUDvDyXSvnkL-v7YXS$z5*)k2_QWfnWQ&EqyA{cVrIMIL8r{84C&th)t z9eAW^Mz{t_O430aD;=VX}1liI&&W4bLho(b zobI&ze=NYS&o2f*n9(vBc}uLaq5~N>e&j;XT0PTD>H4TUQo^+iBbu;{yoFjLShu^Q17lg2o(meAaWuVtq$w1SAQd zXLDIvxKOBCNu0y>GVd~+1*WAn)1-_d1(;&~VF5wznSM)Kx7RIrSNK_K`E~B1L zxZr9^EB?Ts3&}488I@fM#Kv3Hf@rMkLKWD110rGdnQ{8q?F$)`b^AE5C1?AR_{p zaya=PbP0kTm@*6 zjh#a1B(#V+%H0S0%iS_xK*7NyU#-%ZBI``NnV0!BE`eDBtT_g>;k8XS^|fbXSnYUM z@8?S>1)%rs#_)}!=%qh!K239Z-b3bMG(%_>!n{@0OhM}{&a9D%CL=z6lUSr#EKkfY z(?j{#ZzN6@-Lc}BdxO@@$sX75Gp}E#V_CaMiNl2gUA#}|7G)!h9B47gDe=zlpd)z` zwA8Poa`wZy7F2MWfQ{FyOitZ;3t^cv1GC=JmiRa>D%Hng_NQAQ=Tquv>%S^ zuef_=NO3o5;Y@n4xIN6)ps(~I=Uw-Qo?CA+Ld9QOe-nq52m%|w5WS4QMmPjjkb*o< zq(_1efBP96P$VTT{}3#Huo0|c)$5phxC+Eu#;e(4R7nr|2Ue25FM`Tzm+$_xnKbPE z!gZS?5uzGrP+N6b5XuMYyRh~BeP&uanUk5s9u>g7>T439wdIIrWPVauZSzhh@4E7H zWfCb->887vu8`I;1+#VqN9%9J0_M9HTWS?8$_%2N+IdaY-eSwMcRTrr`O%*1ZRu-9 z-4Bj(cO}4@pTtu0YEB-v`sBR7Wy_Y-Ei-1?`8;AhUs3i44jnY*W3s@!Z0Hcn@22%D z$IQ7v>Djk?Tg3h64(Ms{jvX}p!vi4WmTiw-xdX#(Qzs556h2AJ{ z`Ow`$b}$3PSmk(%E(;#wucI6p_oa>LLnFopl8Tj?NGgO2MY&uw;1c>Kerm? zD!EE@ceM)bK)HL5@j4Z_p&J+-% zp?m5auK{%wk)u&zms@YWRrS=%(?Cuib&HPn{OXus&jUpvaJxE(vBit$IPBF5xCn-8 zlrNnIC6kqJK3$#GC>n#@2o9soC@E{jDkhVqwxunt?E?HfvE8A)Y5(nV6`}Llkv;_| zT&E~XJ)+Aqt-WgSse8^h-v@O0Z!!v%;s?C-P-IY$Iz^?2f;zfqBoB|Z0L-~>aMO&C zm5vNs+uK6?g}^ym(eti|@gE<$DF_h--=`!-fZY$!$*IRxa3N*VtL;I%7pjN)p#ukT zf3)lV{x`V-zNXLDOWsMX_p7zAB*(p}B#;35HE_ALkQR%czHi&6%})&(Hf*7Ci8Haz z@e4O-A%v<1Fl%aRQezb{j>U^*&SLNV#yyYPtu>$4V8F>2^nrrv=;7_w@S7vJQ>ofB zXEnCEbUkp7v_DgO&Op7kw%+`=v**mQdgJ}m)hwSmzPZKh)NcfA-f@jx@d2YW-~&cJ z`}glPixkQoK)>s*JFV6@L2`^?rt+~lHyHsAFen>vU_NL|Kzs8~EOa>! z+lBhU4|W`k-^{YA|sM__c%#tj=jQ(97b-_+{rf-+H~or*>V#7R9Om<(Xz zH3d>wls%P+@m~y#`l#OXFLnI=f%fUMG6P_+*t2=gu}4kUpAGruZawq9HEd}Li+D}V z8T04Poj1=wgzu*#-8r5tMBCy%`q)K*dghpJt-1mOpckoQ+Tnxy%?gLHKmnq99zkFS zj~q6Ncih-2i#fnL^wP1&i}`q|T0h-jl%K)gFPFMG9n>!u&>2s>W)LoZOrrR!^Ju`?^O~>$q)$m2a|NB7sB#ZARMlP z7@)_mr`@l*FSzbrV%I@k)_T*>A;X>-H@5Pd#Y2Xy()U6&qGU@XFn|Pfk7eo}8QA}n zNGwTP`%&Ekx-qk4QO=ij`AGrye;PGnWDx*VD)3>!#RBzWEi8`SB!ft0TP!ID8i8Yf zKzuuvW`6+l1-!ev&%NnD9#0+15+zQBGOs}9fKG)lDBY$eb@#Q@zDhsa9jBd5xHq8jByb>nj;wGW^G$S7>HSUKtC!-iXcnIGHIy#@GL)FAg} zB>J$w%-#t=XH1u?QO8T+nrsE=R`pKciYy4EL_VbJAs>`P?lV?IXFL2_r;EcxF&j>u zyDZ|r6@L$TnxZ$rOyUY4{_uZ^7pqC7ZtubW%~55N_kzY?wUYWEhK zg9Y?~7GndFei88T{TytA#T6QNIG8)IG7bQuN73TmoQ3@X3@q~w<#=Pc1L%x@!GZ;; z(F)8m(9yiS+MMU1b0elfB8u7%fEQBaIKL?pQR!JeLt!BLoB#NXQ7mZ2f&wsY=8V*m zB}=S5sy8LUIuERX;75Q?I9$3;{Qxq#68FcYsQ1hL0rqcpL)SD@@X(1QD{HB$zVN(9 zftdpekb^0~YWH%mCJ$22A|Q`<>vOBy|GP~5HOz+t`ap`LvoX24U)(L@*8{~YH#ZyC zNN>&Q(`{wNB|jKfHTlnrhZJL}C-nQ3xB-)6+*A^{-1X$964sTNEMTspG1HeXTlPyM zD=QyYP*9l`-HdHpwx$*>T4c>N0K`^-6yOPn+k&YD5pWNY;i9b-q3xFW#Vm67SN8|( zfxZ*BN_id%gM`+YSm3-b4~RVPUh+zXnxiWQ@oVVHBPD75xyv}*Ps*Io zcu_pgovUrh%gbLrVsz#Ir)&610_s;{#Yv8FGfCib*OQw`R##-M=l1Oz|1U4S{Bx&H zo&3p1AANKM+{c`Ug7HUkl-?6=R_j$&O5KnL8&i2y`psxKTay z?g;3D6)OnJ3ikIn*JqI4-N z=F_Lo8lc~{c#(Dg>JR8N6?LW|XcbYb&Is6@BDcBH&pWc%853z~wY6uhJu0$-Mjo%? zF_f7l@7%HhqFU$Cq#R}CZ zkDbCj)D4JS75LGSmoq?Akh}ZtyVJnxF&ch-n2V>cacqy9h_gaG_k4ML=<)P5%E$V? zM!QQ9WAozx-~@XD=QLB#rTakR07zjGEI`tuPynEF%{QtV=^W$CnR6DH1$baN(-PDc_Q)@vq5XW} zH-$nAKZ`xf3G_Wm3_uRhXX$xL06=~<4-|%d2ltsGL0Z}!cidsJ<2$3rjSb!1ytFJ9 zdcX24kihl>2!+cBz9*1p1ZbY8?Xq@8!)b5pUmndXo>myo@As4V*{;S9Fs{G>n0e%a zOW~o`J<65kqw77!ovZ%O zm~28jbid{uZ4sm6%7^YpowK*0xv9CKvEjwJb8r0(DP~)>f2b~$Y>5OC30zPDS7SX% z#65rnWIvMP*QntK=(ZTm8lxp-Y$oxbSI`D-0k3jQF1EoaK~ze1T+f z1V~vJ0b5^eEuTAr2V4~{8UR55P4-c#(+`*Sh5WrT4v*7(P#4@r?llM zY8BuI&>0iY+48bOOU-@z4p>2)d+xc%0G(ht1B)nCjY@GHN;&h$b8bkBm=^%JRSxL1 zH@6tIepr>pj;ORLV}u#V$j(UR738PXmeY=p?C7ortC6p9M_3dn_qPG)$j!zfU~?IH z904+jr*`>ew}3xQ#Pi;-CZNX|miTR#26ZV&jFYirl~W3qy6)2y^^T%PJ5@j)B@D%o zdkwjApYR>G^5ZN}oXLUtFoh=aq5Bvd&<*Ux5@o4dPxxL`Gu{;_z3&Ww$y1GU*qT~f zdgaDx%FoIB+p5Wv|3YKiuFsQnrDSzYBybT4B!K=7+#Xox0`2>EZ{P820-8kvZzwGT zZS^}hz`I>3RxF-0(ttibe)0sCajzbs)0*hvxX+uEEx?l%j;Q6ng;W7^QN47x7Cpd? zecUo~Q1y5%z=!j*$OD)x@|Bg92Iy&Jp`WZcR##7_je~NdEZFoX=U6%NjiYGn*|pco zkS@MsNow}&*{L>xH_8DPx`9Om2%ZmaE(I%h8iL`l^s&Hq@7!e;X1z+`0y@Z~xU4i) zuUhT2M8!Xk^20G6()c|yp+r=pFi&*Hc2=SkBcrLeFvYfA2=QG7g0LVE_@re`x z&(n6%T?l}$_K4)-aYo@do&U_p78SfLS$ZqK(zl`U(Y9$bc;? zD_DF30eYHlw;cwi+#MX56Jrj?3^X&Z`Oh`81|%^6G&yU$Rxdt^7!Rj8-)DcNZ@)Nz z`}sJ(Q|dpWZwM3f$J@Qx6;+yxDED}80zMb@-YbRUjItH}R)v@TTyGsrK>bSJHOcXA6bU4N z{tjG8ElBfMuXz2BM~xb>SQXQW*5xnuk- zP0a@AG_?WHhe_#*yGob?V{=Q|DR;l#4(Kii0NC!0i0WZ~dqjYa&)i}Uq98|nDQW+^ zX^VaN?}42O_oD~%sR9u9WUrLp6J@2P-<~~f#$Oi<9eVIe$}BlnB7qx40tujBAPn^z0bZ5?;HbA2{ zyG2$d~Gz*=|Z7SRt^3??{SkzAGx`I)!IWd1+5u{fY3CIDNd+%9l zmO1+|UI4vPRQvde6RbD9Q^j6O-pl1GVE3{BJs$YRIgq1+GD-tuK`B9YSn4QO1uV z65jVGq+GHA&i7zX**U_@CHEl@3UWLM<`X>xAk?uV?XK{a4qGw={b7z*x@mw z$9(hFg$w^u``77vm#W)yB}AMYBay&$BY_0aukxjWZeO!v#cwGM=O+c)G-659ngANs z5;@ca#Q_F2N?W6;Mv45xbfs{77s2lDeM^vHDspa(@WawkN-^FH@UxV~IZyMJSh5BF6^d$_+mCP4x2A*x>Y zi4`sq%i%Tr1?pYrYU_86tsML1S#xH+pyN@9AlVWLBoc@ukO2BsycM*NQm=j9mJOS~ zt~KvYEFl(1QmZ@_jg&Qj;NgcKwgv2j)YMRcdA`!sptT)zICp-Yg6<+f!n=FX?NXGxzML+vO3s|01 ztT`vw0;UB3VxAMkCNxXYv4BR6&%w~ZiaPv}&-t=%zkc~|7cyC4P%Pa}JK!_tfu-)n zW{@fKam(E6<;N{`m$B3B9!uaBwkdoHM2|BPU0oe%Ku^D~$cIeT2k_S+H7*3ld7KEb z7Jfe?TmK!LJW`c=G;THx{zA2|GD zyZ7z>9a)T{v7`xf1Ec^}dU-$d%rmLHoZQp{4?JKCJ+-#6Xhw_**0R&(EOdZ_1A{NF z`}XY#waZ1}0vwM8xK+Mdz!WQe{rdIhlP40rQ&I6&ght~5ylYOLHilr7 z3c*0BW0jARa#AmagmL4RVC+o|jj1(j*4S%Y0>kvbM5$>W18^RwL>BOcqVos5zks&b;C}$`xxIjn^gDtt^U3VIDVsQvi*h<%9GfR{dFOGkOx~*O8 z7LL0}9I#Qu7&{pW1T2z5Nd^LnN?>I|?s)+0zPxeH6Zfr~g{^zQ<2CrqEpvBExG&uA zA&vo4j;}mk*MKHHafKnRJVy6D@@6xo_t3$%GiT4PnmB&qZ_i&if4QznQuqBTu4Boe zuOA5{fPNLPl@_JpySD83pGQs{{gfiU3$cK)Ha&0(VEgBP{GL(m(8>+!A%03A$Kp4# za+LWt-ET_)55UprZ_%s{Ec^HGHA@-rH%m6kHD^(FDwDiAtPF^^ad)1^WiwmH9EuXcuv>Q7>E;(al1L&DAfarc|YTX0uV=6~m^t|Wm zUkuO(OKTf&N0f2@+rcf=tXQBJ$90B-7zPiPR0$1K)vfD&qV0Zq)uU51bo?4B6u7Ol~3jiQ6 zji5LdFf4f%Sfbrg09f$6z>L>BXXq_$&FSOuJ+Cy!!W^eCIVTo5{%pp8C5+V!Elwmn zsblQpFvXT%lfO2DiAVnk& z+;Knu`N38LU+8qemq%gu+sy&aYstG6%5DI8L)5pP`CFkD$%pGYL8){!+i^cS(dQNf zrhS-Go`U_@f?axbx45gs+#MPN*Unrfa*a@R55GC_3SNTMK|3d>FXfF<#{KAV28cO% zyaDHk1G@RnO*sfHTV00E7$Fz0zQ=dZQy!wc^th71zKmb@bJNjdCw?G?=}+|=qV9X3 z6Ot{Fz)dQF1kkV2g@nR@Zr=TeV7 z_E>6M)p+v}H%HVsfXn{P>MIVgu_#)eHI^L(IiiIxzaTf&ATS{YA6GN~W>1$Bj9w85)$Eo!+Ku6#+n9J)HdVF8E65Tq*LU#qhX=T8V z?qvWYK55twWXO1NpQ!ncF%uS-K>oevla5i)Jkq6S2Q$da*vF#XqZ;{f+TC)^bwAOG zjq#Hb=zRmY=R%-b0BUzXTnx~i&G38E_jQHK-*;ufN-JNsB{ zLRMDq&TYHTo;ZE-Uo`gL(Bp(YOA60i#=Vk!_4<}T0_a!a`f1_GP&9V+zFoWjq^P81 zsQ@h(E0x@2(y|Ep0t}yj{`u5~H`b<}eDX=7W?4ABphvX;9V-;ekM~&gu%hTI?F%FS zX+O!Lhs9hk%AS1RAqo~Fh^$3aIHgh#96n?KOl7svBS%@|5*m}_isn|5QSg;UDNcRh z7=Yd_eS*xOX#s8)Q-BwXzqPg5-UskmXzOZ&A9nos2}X?r-WCfGS>UZ5ts!bzW9Ks{ zcj$Af$#L$|A!X?(d;GgF3Me;TmUMV|h3$td+XXsKxw{2;2|&j={-%4rKcKtc*L}&n z#zJR)ZiPBU%yq|o}P2fhzr2toic4|I(EUVb)DUg2mLN31_kYEZv$EAFbO>J zRj3C=3g1624|3DFKmQ+l?*V4#S)Tcy=|!W_sCQXbv1QAWZOOf32S+a8f*Zk02-(g4 zuaN9+8X=oqAlYO?5&{GQDN889v`}Ke4Q#o{GVVpPEXnG<_d1%9H2?eeeBXWMo#T-- zlE%is`FzPUbIw=Z_j%v%xu5=^0cWOkrJUudk_KSk&-8E4*54RoqjMT6Z1f5|nwz(C?iFsX}*9!X->~+&kH-%~4K#4X>s~^ke3$i)Y3C6qXV7ri=({)kgvY_YH0Upw16U}YM5?Bj_Y3d!`lvKMQGe)qmvPL z`c6X=&7gQ&!F_6L>hr2?O>rJz9$mE*6vofWnykDmX=`C}Rh~Ly zWLy9V01X2NWJpir9L5ggM|`FM>=KhZpu`yX=d`Ul2_c+Y zTA+tDyZgx9)!%Q6Mt_7o@s`kSysis~M`eChH(uB)s4 zkeGNqzGF0Wg1rDfv`sY6Z+zn$g&_k5hOgB=R)#~gHx<09#VEI8hR@S>!W1o2ZK`pR z7GyIj+982xfQj>WVbBCTVGf3os?T)RJq%O4{N|O_icHt%;ll(ViNTISABXcwaaq(l zrhGo%w|h^dp>5i*F#veXs1X4GZ8DvsnIbIkxoU$2LkG;FAxs_|2JmsehQ_)qqF#U= z%svk^!)>rm!p={hc{=WeAY_^$=ny|Zy>!yBqJWDlmE}I#6u5fgLpRV8{O4-{UYo{U zNCrT627$p2nuQyLynoFJ0cVS}bmqr8u-;c)byZXVBT(AbXVa+uE}7wrL<-`T+aGQ{gAo;8Shfpq>Ic_ex_R9QP4I zCc&9t|Jw@SA$ywjM8Sv8?GR7ppm5!u=eb z|BJrHWkB!c&8Q7isU{-lEO>R^$7P1SQAIl{DBM9LJ7!ow8Eu19t_L4{urPe^kT7!& z96Tt14KM@%D)M^ad!*%J{)CC4p&HOB)Dg^78ZVkKerq&x%#lRX;|~opzrYWm!72bC zroup#a>D5sj{lv{Q;iqCW?+Lv02Ttny47n6%a$#ZrJz2Z(bSj$)xN!%pFj6)D)=qy z9LHx7IiI)LG;lZd&ANKkRjWNJr9pLGH5LgK-kCdhZZutC{ETbz0IzWqg7LU-IKtSc1*vw*-uMazw={6h0!Es*ZUG_cDbVpvLMOE3_plVv0EhHQfjxU&{afPQKoF73 zC>kdBe?M^1B{P9{&->b?Ae9W$4>||CwbU>2cybN&uXqBpxGzTLl6KcBd{!QQ%U77 zYK1RYv><>3Z4hl1?TYlU0RocUd9FENjxYctOaqmor6{$|1*T^7!H`2!&p;MU7>0>| z7_;oc*X9R^opJi4ESL=qPGERYdFWi*r%&H7z0$%IMqF3l7}wV+x;>)i^MJmHoJR{2 z{SAl!!qbXqCpw#aC)PC@{8=D%N@t>n{!*tN_=mfT1;P~xte>=45X;aURs%S*H1K2P` zw2i7*n#B>k09}Gqe69!~|@Pq#dAP4vm2+#-t4SbAfz}(9XSyG=S)6UHN z3Q*(syviJ46Xz+aj_aEkZ=P#CbLPx2xl^VVUv>oR>1x+(kLY*qr(G3!;xaQ=R%F^$ zZCw`3hsoXGLgYBWi~vCGdh*qYEg*g%tOGKqLqBV4F=qVG`E~r=n}D7IjW$B&6RV@px)EnQa5g>(V8(WJ-p=^x;Rsq_1vqVNuvEAYiO}71U?T0!34(oeslq)P1Rt7XD&sS^UhH zK4x5Mt!FjeYZYb95!(Nv*Ta%9QUHkQ9kVZ{>U8WjwOd2S%5XAA5%8p;mjb$TrlS^l zB8V^^05J=YI~4TBm4e{I8gL+-L4T|#2r3i~x>TS}bwGq2p_~A+O*G21d(ZK$0Cb+` zNd7&l7RNJP>wrB);~R?o@UOYKDZb+zTnQFnO3mvQfE-ZBGdP#$l$zbs`9eSMMO$CO z{gUq;06o3l0$sM|+69sx?HWq++7~Zgx_kNR756B9Q&R=2Gaq^A;eXt{clRYK=UR>bJj>VK6Q*kCDFf&*#ZyO*3GHpn*i(wy8z4+c zQ6JWXLPN=$tH3O|XKk%a=8Bvqoow^At*X$b6f!Zv78PK@?A^b)UqlKMoetoV&Q|<8 zB9!X_m>LLz%7djMe_f?tVdQA|XlxJs=)M4QtO)?pRyALN`8Ud!-fuuw2Rthqs{%OG zSFg;X!by#@$&~rxn}_KWWETEXY3P7AIr%(`4r(zT{Z4TmeDBuwZ1N7!3+K1~cM^bZ z4KePQ=V_bfHXQ@zG49;dZ&R`Z%MefibjD7UICG1req9I1qp?%o7n#4gqn$^5P3Gexaehew+exDqu92#`%c} z6NX6Tv+sWQy8(2Q<%^y%V@9E=IV*eGB*yO^<`ER+?qN|TQ`$)0M%5A5Rn^Kt7vRtw zg#t3$1dd!!0U4sN(Xi3>$rC5{J3tVhc^S4{6VnfH{IMb=_grgHY1Mx-VXE(FOmiV83-`P5ngPmhv?}FBB*PdM~b&7)zh;fB*ac zWz~w6ACvF5<%%n=2nGX#1f0;)VDOkUF~y?sOqwvUaQ*eyM}9J(-y&13OP<0sUGT-) zX+$e0wcPWb7Qxg2NDdgFnXk>2e4d&%v)>DaItAC&=s5(x@jRQE>r{bmz4EFbee}_& zBsSxn*M_-$zk;Y>sA%T^8XydiM?P}Bs&`2<2b|FSnLE$NZ2-V=&Y%G;F^(p=A86pR ze96-A+wN~Wkfo`ORykUIH&DV)wDFW5ox}4eYG%}j0enwj2d4mJ4Kf9EgdInL+l1^s z^Z_E8pH1$hb-6x28Y1fqpc5_5Jc(_fxBCx&_`}GjrwI=4>6JbYIgwOQZFB zacjn{Qj@m-J|xQy`_MV$&>YtR?iJ>9&N)+KK3wZyKm#Y>pOyy>3sRo)mx4I73TsTB z9_hWBeb(u2h`pU0ah?P^r?8nuDYygZ>2>V05J+`n_LJVXLod&HWr5rUpO%1quY{Cs zy-nBh{mK-0yHMZ+*x}n{=x@Jq$aFdM2jBnxr?ze1amUqHUtNvK66S|VnZPvw8!ZSh zL`#3>nP&=DU3Ph-H3c|IJKZNumuO?s*ht$-qoJ+EIMN*ow6|ydq7B$ZfCB7tChqUL zi{h>o03$#|u#*@dmF)O^^OlW;d+xa>%&}Kqd1c|8DO0nOweop0KIVjg%e6K=)JIHN9s z=)-*Zm!|j~3D7MNI8(uZkICJ0G%%-svoDHq6Co&OCU{#(0CbPV*%$~Vjti*Qp4DDG z`0^{SywXr#_xJC8-}}C!@5+(yZ$I`~9#Jn)-~`xVFFf@Z@D`Zcmo8X(=7T?e;0x8Y z)tBFT>#d=o?pOI$7#^CMwLTh*5GeJfFMX+S%{$%^rdVn91$vV&R&W^1^ZFZa2yieX zG_VEJSCz3S{gP`qE+SI|pFF6@0YnafVjP|3N(C&*d{1$f!+FDy@I}fO{K}k{6g~d~ z`NwOcFv*MDT(Tm)7BIPZJn2~4FOAfFn;6pD3^pFdZZfgLW0p0n} z26O{&W^SjtUsl-;jhqYvwAsi<7a$S{Nq0D60kG11>s#N7jEC#4yDor}2z?6sq#Alr zfXjuklLd4Ocz)$d|0Wh;ue4eh&~ecm0^kt1R3nKB$p! z%Ja28`(JwH<=GOlKPDF!-Pz=eDj#JE{9;j{4CuYIo?>3Lk3I6p%`eTF^NBMjopI{L zmtGQ@#D-1lvp^^@@1{PAD9;1Ieykj2%&^nWJukp-wfdmbijy=gBBDo(8d=nEV~9t{ zS1v|-A88(W^meL6WlR&_b7tbqD!D1hPE369!q??9zfXDP?S&7#|JN01J|uFmsW}c4 zU$;X5CtR68{E_RylT&S(9aTMBLRZ{r(g{;l%S!h8?xZz~EDRaF&*4QtmG zR;^wU!EmEgZ4RLZA2ioQ7dUlW1N5_0xTG6bKF>~|%er_S>3D;$Jh5Da5TdbDSDhDu zXE{AfX@~K5kY3}bhJHkQdtTI$7tLJD9&ks%L1U!^tV@+*0;Z<>KDihE^iLSNqde^05_dERCvf-HOds%r76cCx0ZuJ@isv|fAcFY_>gz&>69YWo zhZqGc9#qQ%(4xM%fSftnqQTgxp&x(e4NoyU6F7(u7#}&72{Ib6H~>-9L&$5!cLs@Nrug1IJbwfi?(b$T22|<`@EMi` zEDcU$b1@m}5Jdaj+{c}QJ@;^%-R=OoG>y%4W{$<@=P7TVdm1#y@7@!R7qPHlP2Zr- zJ>9`ipLM+S!V8^Eer8ko**;iBM8@9# z!ykTpf9rwwidol=pE#kgW*r)5Wns|JArWB?BSII13BCB-^Wj6k_@YZgvm;<6TJM%v1C;%ze^nr$^6nKzz44u5lmGt+uwI&`&{M06FP#G;7JCx-;J= zKnM`bdhGGS)@_>$s=F-^9~OD&n5#!9C@u=yTO&sYB~&Lf3w zf;zFa(sy2Sbb%JnmwRW=>x|+r1@TvkUr=DCR%6?|XjO)Lwz6m>ygKXtf%M^H9Q{Y&5@U|ZO+i7sG&6#ugeGfkLH={?5 zI$wZZMH<@5)vM$OS8$ii(sUOiwJh?$1@7CoY|Zk#8~bM6xNk`?NoECk>7n+SR7#ZltkUJbxUE&)G5kqKP{TQ zFfN`?YgY$3IWjs-sfm`_RZH(Vpc^#2Zw%%(wOgx<=jK9_gSaS!m z_>==BjJ1E_6uXquC7iLdiA@&CG0k}g5@?_mDd|+L130aTZ`^$US77wSlg;1NPp;>5g zjD+{7{pA)sy94xyCCM!tj(ShEd*YSxbm{gMqhBzMHQILx9{8$zGmu7W7#{X z7NRs&2{U1yPYwWvhNvbK);3^JFeg{O>W+>E_G2z!380&K+H8qg`}Kv33XeTDGs=BV zJ^L(;hoC0)wmvNXw;qJKeba_@VRFZk(A?Cw*i|k3uJS{-x2xcYOzU)AYfxdC#>PGY z!u$5MhE~@q!GU>_qW0W#&qbgZrsu;QSwI=*Fkh;}IqKf?43^84crzFEDdYaYaT6j!f6wuOP=Z4D*7?s`kLBsD_C1y{Q9E8 z{r5|F8ZokP+nsk5YSi2YKsP9Hy|We!=)DQ#DL7`Dcow*ZONbyufG@Ob6&6CHB?uBw zCqf^$0`Uz5YcfXr$+_OvBp0EvPu=uQOTs!P!u#C7ZEfFLc2uV zjm=t_3at5wUpNAzbpHbf)aU~cQ`$J`cYPJf@4_iW`Zx9KU)Us?5C{lO0Q0B`ekhAj z#)r(jxi5^IzYP>Ib`ha_=H7D+9Xh6_T?2@NxSWF@=H#fqlL=d4BG$E8WOep8*Wg=T z@Y=kHZXYmcU})xOumJqabLT`n0Km;*GxIiCW+*B|TjIy z>U^Fn!hl^KsZ}NwwD=rAkHF5Pd5`xz&mphge=}BuN3CDSf(5VbUbtlW!|LYum&!bt zR|fUo-eu+cz10-xeNORK&){wFJelx@{Kt2`|J9ZOE!SK>V@3@cIn2JPrMWOvdDm!b zX6pDR0om$2a+~&#_|0KB1~CJVnc2xq(Lr$)sMX5PHdJN{<0RGV1rtu?mmQdUE%{{q6rYe$s?5TyxDe3sOP-WZt{-wPgzYEGSS0 z^pm7I+PXmRbZK4RI``~zrvA#+S6ASB-m+~+VUPl&FhjSB(OHY=$W5^@c$hSR9&Jo> z1_a}A113nJ8=iZ{nWsk!&1atZX>@}F-6}Fd^*H&<3Gy2_Xh<}hAy^JZk1*3LpZewvn+o6i z-uD9JZ@THG!k)b8Om$va4z0<#!}cemxnjyl;|R>udp!SKh)M4OusF}$!CMBBDn-2e z2(2y$B>+9s)U&*LQq!0(f(|wAiJ2f4fYd(R2E$a7K63K&3TenwE>!cIBFtf#%MB1>_ON8~_*o>s&}JrnBW;0uAaG6pDhAz}FTN3$onX^Gn?%DZm%&1c*ks ztoYmGuu0#71@~tS*k8^nXjebqM;@KITAA=)zVY2R{*#2W4JXMG%9ocZ@H3-88PHFX z^kNqE_uTWL{aKzc%##$QXP%c9Ek8H8^JktpDg5gEj%L}?(l72o$FPm- zHx&BFl|U01+JtgF#d0P|E5#(+N5BoBcj(?!>v~b&0SMW`X&v+sFfLlOsBrJS_r`hede^%G42zNS5{z7VFUBl^D}2mJ zH97m7J9E`fZWE{XBaIE3?AyO5t7aG0ntkz;dB61h3n8fBUI6%U#Y6=B^l1?_^qHT9F*Q{}6FHWYZ1pyX#WnV-c|Rr0gn zx4-?(Kiaoz_wTDFd&B6_r{o1Usxm+)dKrBuPg?`fgHapMbM5TS7<&eCUE|`(>$Z6_ zYh)pRuo&%APdybHCnZcTQQ8`L(u|#)@;%bb1KcDS;QQUaV_RY7!!zY09$vU;`UQpE zyLN`g8Vx-JZusJ85(rc`tS+lfRw>v;LsMjbC!qL+JGPUdxT!@h%u#fue2tWitVtVJZhyvG| zTf;O^MKGAwpO}RosZTnfclX_Q2M~I!6q^CiV{H(`q@l?rnO7 z4_YxE0Po&?Sqhuo0Xz#}U!tHs+zeQ55JV2jlumB~_BeGEP8oM4&B*5 zJP$fXcRua^v>=Sv!eDIokk`PpG^lq8oJ2e%#WA;bg=Hgu?>uLo?W%YYOs852oTL4F z@cCz-pF8rDQJ<1O{XPk?JKv0VvV6}n1>Q^wlmY!DsjK|yG2i^=J)amgY{Z=^DOm|H zq0KfnH7lh{fnfwviP^dB1b`k#(*837zK(Ys#|(4N@{2Pqk3Qx49iL*JUrc~gUq!0} z=4hML8XqXF>-O9443OHVK(?sqF3^Q(x&aB=*NZPcU-?*cZK$JoxPM&sFKX%JVL~pn_n)1G$^YrDQ3V z6h3xYC^$%mjEn-!i+#p3oC%Pop)s~JSk8cLL8QAl6V9==o`SmfG@bQVl;7KhXJ~1p z8%2=r&Ou6P=?>|T4(R~|lvcXCySuwby1Qd&hUT5mcdhrA=N~xh+;e8{eP5fsyfx3`E0VT;llbHE1STn|+}HxX~agEs*-`;U7Tw*dYC z_B{^}s`!g7!Y2E3Cp*f}+Ea!ehGmA6rc_}gx+~gA4p)j|j=GGk#+!Nn*NMgtXm!N) zO`9z}RRKZUhIQY4Zx;&@(>VU|kBW$!C6QHIts!+je-5@iXPs=?8~}I$C>86Y6>fdj zXs$%9eE~wDzLT>0msEfj(t5>mt28z$)ABkJo?o35n;*qF>RlGhl+DCb?$Vms2k-v% zRa=}awzGHn9-Ny<^d1N#&J)V2Df*7W)#!1T1ja(@TH*Rtho;StGH9n2)NuRXfz0GP zjQ0cawg-dw!jRbc{!f{_hI)WoW`?)j1Tp=AJ<7K@rcwYiwpjX%xp!F4U2w{7gTrdm zMVI`Q;rF#RbC>Xxdv$E$B69U?6AeQWhUoDK7ro3OZoDK}V zr*M&oQqd`xsnbTfe*gK)_E}n4H;6Jhb*wN9dy3CzsV`7jKhj=UI4zC@GAL(^)&uuA7IkBxo-xM2RyVgT0vt z;7}Tf0+d>Li=^>YIekWSq$&hA4mFk%12Ub}9Jg2qGUsLnsIr`f8IjQp0>O{b#2TyV^fOgNgp27m7-*v zAEA1ZJ#m9kvk0+{R{3-l$!m}adE}3JtWB^0#7D#(+!MQ1#}@&j#QUp#Q?WA=;k`J- zNGvR7b90@#LbtP*j~PBkfzOYy$d0WM=F+rEDjs5Ogc@Gwi=Sm5rp5X_0M|324x8bb z4WG5i*-@PL022bNj-G5C6Hs!*b_3J~5=Xzf$avgg(HyL*IXhTXI;Ao^#Qbt|%>Q(r z&RuaoLzk%kg*LIm*I*rctWYF`3%Mn`i}NB^p`KO^L^ihJe_zP%BlWMl)2%n+I0e8R zRtc%fOJGy~ritX+4uq(wOz>XwBSOYku%*1!rDySz;%ozwhB}=l=h1!h-mG0$cn~WI zx_vUaDu|pKNI};?S1&0)#wR1=oz^X)C=|Ks4=0v=_MA$<1r)WoCFyPmVL(zvy*1V2 zg0Kstgz0_)-ZxpFUrdd%6CZ&1ou)`RXK%v1LjU1t>gXp~$CHTeT>%y`^P@BT(_2{1 zIrkOTB3AwNj=7VT{cR%S$gW5oEejrV9Qe+rze5)2vXR%TgUS75Ystmz%#!Ayj9pWp?v>|K|)89TtBDF#0Y>$wRtg7C=Rl9O>0D4(X zdKRyK`z-ff0~XbFWOc5LC@XL`;$x=o zQPisUt#Z1UuP!BH7{!UiKv@Y!@fwuHvZ5OO5uB zMh>$`5#CO3hlM=q!*F;5eMsv7mP$)Li!3G1n*VD?%0mdMLld;6b56=?=WlY`e}7gT zO#k;&MkKqmWNp;BUz(XLa8YN=*10pK>r--PMjqGmK`EcZaw&|StfjOHm1GxZqV;<` z_BIxVOCHhN``@e92Pm$fGxXN z0SEl)d=5T}G1xKUfXPOW^+p(2Y4+cfPUkE1(%s(EI@(0TkMGD_uYZLiXl>r1Fb!z4Z(0pbB@O~8~>%Dat3T4S#c1g@p}oA zf}5tHfgxA~JO*x5Y`)Vb;1G9#IJ<6iNk~uwR>9$;sgKA_+q4tig9U3NE3)Hh*~e{( z`+d&^jI6jzIn_(^DCnhA=^w3=n6 z^imdRHo(si@yx(>_r)3j6JXtOEo@)jaX3x0of7z&ReSJ7OAvdGNFr!*mtN=zB8hX7 z#^Kj9UzjQUd{$`Sb8*R4l!;W!V)T%p0=E}FN?1q-8(qgzufO&m!Ub!|h|<3VY)KNn zcNFp7Q6XV6f5mArJ+$Mn4pcg&B-y!+rkp5|A?pWP;|N=0KmSeOywRtasdIX6=}GK- zGM_c0)@hRPgn;Ljc4HA0G?+A&APedX%ry3gl{_DKb?&pD*5R{CWNg@D&C}8~&zVu884vX{{eP}(~|FN0CR>kj!qy0OZo6ksX+I6{AY{#2&69dLh>z%6s2Lu{itES4khw*Ejj9`}x zWSmS}u+sA(b{h9VA>~P0;6a>7nMza2LAkNYJ_VE=Lv9e~tlgtGKhfy6{@DMf<(2=( zOi_MH@1M24HSLf~(Gdax#{VuO((uOt)z?`EpPMM@O4f(e(ux)vhHhip5G?k&z5%3E z%^t5_QzeGC6{+1Q-tX!@ivR7ZVBlx|E)dqWBh7pFT%870cWru>=8!f_i)XPu35^e|I9p3P|^7^fSJTWEngb^ZcA@~y7~KZ z!e^cLavfj3zHm7D^hJx@TJ6}HI){E$^$Ff%MVeToKHV%#2zl?g?;_`N7}Oj}*QJA) zzT}I(qomHN-OI-Zomf!5_D2Ujz7w^N z&l7*1(DKT#Y)iJ}LM_KL+Ft^#r#sx2S3UeSby&zp#cuEyHFj;+(EoRC#Vi{~ugQ~s zx48&IuVq#X^ypztX=X_TS791>IxhuOI#tW$KuQCprL-3~biy*bl1FqPKc=)ttK*W8 zmrzIJM-)#|@CiTlDVW}o@L$TTtGO<31u9@1pU-F_3y#o@M zm#Y!~12W>zcL?s+$PV`Qzb7?IgHI5Tp8fg>wTiY@%r7XC7{631#EZ(WSDj#35?nC0F2CbiKO({~LGLBEgYdo;$q~SYYP`JCDF_%g zSN@{6!vSz^ua_0CWcZ*$q_KzqIc&Dfh|J*u3$5z~Nd+N8Z1YJ&54GnoQ`bBvQn3!2 zVsNM4hl+f|;(9kk(`vIgg+`#hwDvB)iZzYL?edjGz;OuwojG(}{IdW4YOPQqOnfGT zB{ci&F7%LJ^0ez4%?&n;e-Xrb`c@w` zV)QYr%H<0N_V4(`2>Pl3#QfD-)8YgW@&J-P$5w4Cp<&M0s&c%G@QQN!>)mb#6i2|C zm@y(2PviQExy#Ls1ma15>ljFcC~|PL^qvxHnOSX zxqiuM0gQV{eedh7wjgc<0WX!ck5%=Gf9BGHOd^L4>eMHec#J+0&@qd#CToyow zF+D$v!ir>fla#qThR;8B4*;?|N zt1Ap=U4?V1m9Gsaf$c8OTxy-G^aaVhm%qLYhi_`1e<`QRC-Z9A%U|*;lQ3+KTJL3g zAHY33bDs(Ty~(Gn87OOd86fZE*@l0zt{T%>(nseL86nI6rNrN;sAJ}N?csB?`#%g9 zzA7!Z@`5R41>6^Q`m5l({$f0WIAk+2|1z zF<+1wf|_V^urRH?)X?{e=f=u^e?&WtbOw3mwX>pgJeg0nbI%MRd zr^-ELYjdiYVg<3RiP*eEQ~tTCYqkrRZ1ugC*8726>}K0-+@UL8_omSk55H6yD}~Nh ztmPUReh!PG57Wf$EV;Y(U z+?f~rZ1JXC4R$aXJA=<@>u>8>%W>sIlE8)R-)|lVEj7x|3wk9!1A0>MICCZ- zyPxFyJy<0}el1q-U*D~07jCGae#7m_NYd$^~=VuNTICRmWC`0c5{`sC+wEbE^9}BDkWkx9Jc&pfC%07L9O0s{acR^Ub$4bn*mJSLYusXOs zbpi5V3o-tRzRL8!2>unR0$9m-XnClN7Jk0&{1Xf`5?bf4H0pRNkhKuK?WBjh)L+d_ znSVv$wCsKl5|-dc{Gq2?7Fh_k*G-V=N^QsoIy0WiOHhK?BV+b;AXFIm8knRwJXtqq zf%8V;8o2T_u0YFMzHsv4mJlzc`-dP#MY%X(d^8~>kDvX)SQ2~=9| zr-ae_PX73@_rXk+7BX=Uz$jKL22KAELQ!4wT#pU*JzRVuva#n26({_rF3RB*hnyqJ9DSx}sEJ;vsw zKai`rV93*I;5%xK&u-*M`<_p7BJJmjoR(TeOOJecQK+iQMUw5MoZ|`QKrN`>FAJv! zM_1_U*}D%1M%tg%`MXlQR$8URSqMp@9JtLbJ%FyrsDIx{oafTsm-9+a3%L=QVIK39 zMf(9tEd7g=*Tt?vuqZG5=@l~+?$zsD@5YjdGrW%c%a-dd_+_KXW<8#Yx3~Q44QH(R z&h&`~Kjm#?C=W2j8(cpUnHR%EnRJ@2`}V zgqWpIvyEi$`;^)r_{xWaiuKGVczg@;?wBH zyWsK5-`ngzhu?ZW*TFG8aKnPAukF)xVUdApRddkUUaf&Cy;n(DnT3w%5Q1!%%x z3Qeq^QU@a*5;*$r1+y#_-MEaIk=S_xAqR^hnyK&o8 z>owALwel8q?W^?yxBaz13(w##kuLTc(o29sCI6LaG^g0luUqeb3<~086L*^rL9$Ov z^u!&8sx~vHgjNgB+$mm1^*VAC0@m{X^E=>2YTTl#0COOW7cofDrNjJ{xRw%5I;EGB z4+B8BscVyJcofjRx@b%kU@I=lCX=`6!Rrs~oy8aY!>^SDjQ5KsW<0jZqTcSC@I2s~ zNbg3U!7)^s(1I{`Y!&4UXHAo=hYnM=f<-hMq%19U3k99}YDsy27%P7$X*0=1`CF=p z+>Yu^tdtrF#)CwyNN!e2@ZN2qp;&60noDUw(cM_u??*FX zIycfI;Ydy9iuT6yr!WjWL3AV%N?^>YP6B%W*T5Uqi@Yg$J`fqBM^U1L+F*R^>FGr$ zl;eKNMFL?|#p{|W>v&+ZX4q5$GG*{HxS0#8i%coi(axj$^X*aFwg;8KkMpf;$q+xg z%b8;EDwIM!Rg+D}dA`lF((lK@`6j+hG?jtLxgxKtWw>Kx_euiMBjlNXKM$Pol0Nmm zUMR`1+G0j{h*dlP0tiVE#Aogas0su0wDx9bF72AUxpqOpro4-m42^ndfHoc@EquBE z%Z2O}`QKepQa#$O^tlfvhU#}(Pa845_l#gl*T9WDk+TK}WA2SBYaQQrnP~s1k+DgZ zt0gNkRGlyL?tG;V4xbQL4sb{ecZRy#OpkGi1$P{ z>wa(A8^0)vTu7O;y+lDx~gF$8HlY6M^fn2^mcntA10JwfE+@(eCN_{%X%3RBU&%srfl@>OcaZxKPT5w!QERv#FNB14C)EV>q>SK{Y02 zHTuJtXGR}do`iG$aS(4`)`WM!c~29ru~wO`PK>d$@k*c5WHbfO3Ht*k$@$L;hto(m zhV@*90Q_wDor#XM`Gzzu?swje!~FTsgFfBet5b&1?49{2mViFK5HE~!pEl~)wX8kA z`#Kp};EKKXj>3$f=!)nt3h$t0{!cY=(6^H_E(o{7U}}i%=Na#b&4OnyI%Pl{(AWlS}F3 zt*>4jRX)I!tj}y!!ECb&+`tNah-k=6%iBoLIf%BD#c15+04BT)Cr-h zvdkj-?sa(f$XjOKG8p}T3LocxZ-g|Y^+vb#qR`AA2Upull>DYcRVMX3-?}j^3lb7e zPq41`ovxVx~mS2#`Ou9RqlqB{c_F* ziPiDgy9hWkuZ~uV&^&f`wSIzf{T8yjRk5NvnM=95vTMjPjU2m?@t&0=qaah}&d~(y zr(LQbewEOIf-E}3mglCq4VJRJF6jEH<(U$kL{?dB4xR)SsY~vA@3nnDj{3FbppJ9z zGAYVmMk12wT0`)8%G(3=07ZeF0OlyD(^2{kpfoAvC?Ox}eyt-*@;)64WNH7^4#mie zN?jZMAY=Xl+N}yw4uX;}gQF7cftpllWzJbh?0N<22IWqRm)TEsD zD{_-M`~1bQyHGxR?W<))EX7F?j?zO$84Plc#SM0l3oc;THlXBx0G8YI^O zR|91ay?3roB^v?IOuq^kiOX`eZ|Fl?sbty#s10#&YIih{UTs3md;egQ)F0k_54+^|8+BHLrt7re%FbK!*f8yVRLl`VcCTIuu4-;n?W(2$arC8y&$+YJC;W_~n%{427fS`}2l zp&!Jx=RTI{PO7cO&YS7dFq)^d>ZgNny-!(1GhPNo55zt$Ms zdnLLyt|8Q6Wtocld_idoE*MD)3}G@P7&mpL+Ww|kEPY-!f{c+TtlsO}d~lOpU6}du z!zOC2#qBw{G@{Afx&jG$R&t}tcCYSE3@5ixqbWYkwEtr zzTd`Q$F|w)ZGI>>V|R|fqH*`3)AZ3c*)P=y2GY414j#r%EO7o<*hogjY4H7acg|UP zM5VL7a{0BO>wkZCs8O>SVJ$z_+HmX^T2B2lxZRGj;6=3&#g@7nN5aadxLr!;3(&dHtIx;~c5MUbBnR-ZpAA2{JHg zreIfuOt8aKVQpsEnaMy&5;6T<*`xM%$PVf3!@#-{n{cq~K|rLY^e!*>ZK5=~Oo85? zZYG9NO!9YqVrl~i=#D5n+)mtHsmp30#mxAJX{>mI32Fsnuw?Govdia937 zJ^&(kpc>L3Tdc#q0v+4Fa})&l16EymYeT-IZj!4De!R&}NHP5$#g|psp|+phn$UXI zY>+!GqWaYDPlR;dTj8`%_;Od)_#antiESk0U%^Dc&CR zckRjh!tJK?6=7DCoOr_jW^Z-b<5}5UE3Jaz(gxM&QbcQ29@wtBh)-ed;2zXUyVV|j z5_0ZEe)8;jl3!QnSmTItos*S_swq>O+jhhH_yiQ82niNi_FAalT*oQzDI zcGJBYssV4{__R{)^Y7xn{aev264lcNw_`X|q;4n38+P^xUXpT_;#W7^tJ^hC`n~=Q z#Eu*}Q#h)9Vi{pU=h->}u_vUNuT)kuIZe^{rxb5GbB>1xu2($$5dW9B!vPAruAP*M zA=>bnTU0~5=Bz|Gn7KsxffjOH$yFm#n2A1%E5hS^U6h47CTL?Op9?H2BAEZ6xJC%Y zw0q*=#!~zW=++@IlHrY1VP$0j#=2=7F%fWTP%W{3^@~3_Z+5XMT#}n-Euk^4W&wgRanks_`42J88j}W!#f1 zVrC05?D~$2gqc%!Ei<6RDlV(jquI07TGPSM9kHZ^sVRMH@Ibi<{~y$F@DWIQdT`%c zlrqa|^TR52aTaAD+V4Mf0YPgx#TL;qTaOp5tuPZm9NWkm?9aP9FQ$W0f+BV^2ds*U zzMX4RQ?IXw-k|pBICrjawT=dbfZYH5B+&(`%Qv@bS(B{sq1exjEe|2XmzlFnF|tc| z-9|bsF4;DDCip*?#>1sY&)vW1|*fD#Zk~MC%xP%%w+uab3wa?g`;#v zW)5G;ogI*S?Dw+9o?Ft>;B?%U3^Hq%d0>fexpspH37j_6YaT|W_v0d8tEW&*zkRN} zJe9tD%3_R#vl(@jz+c72Ss944O*7w=(Ddlkt3tVZ>e*VFQpsObAa7SC^p{AFj9^gI zbFNKmUp8fGH_?dH+6;oNf()7d#85mupR)C*K|4a4PQMqOW;5)b;%&QuWB&%Gqn?@( zBR}dSZ3Yk+>PDvqK5JfEvhzTY#%b`vtHU&$`_^7qR?S5}HhGGQ<62xdC(FB(JJ=M6 zy7*C@N_|ZF@vu-i#cfSmO-$s+`9h-HT<)ho7qoC7!)4|YcHQ$@(mz^M>qzG8fO11W z`uXhaWxDRQ9R>pr3=^UXtOFvu_VrKNG%_GrkH>(?G}TbYkv0Ks@5lRlDisf6ku}1M z(yn3bH{IFSq` z{K8_yPt&2tsyR&Se~^ueG0PkO=kGu>&l(Nk@5_oazxi>5$FfY``W2v-+|Yy?Y9k@D z7V!g448|wSM3+ecTW6DnUz<8n4$yV!)Sq9R4XWGAct6;F@g(G!j`Q1ZHFtJjo>g_M zn1ew8(;nccZwPX}3mx=glNc9SZ(L&N&GAJ|gLG1xYdco(WBEUgqVpcoIL72~v3-zo z%mjXfN3|a(6kiRwqeo#lkob^eUd-?yn^wJE1;qitFP9w7(@Xy3H(*kjbn0$bAyr_? z&q7_^Wx=AUYU#vJngxZ&e+cO14Dg|AmbJpf`D}j>ZGzAZmM-0!8d5+;sQ196V}5&( z{24^J_G0B~@=@H&p`*<6j9q7NWNz*z*I($dK6-|KW|aqSW=jeSVQZy?;E{YZ5DM3> zWa0yj{G2TdGw}Adm<=gN8(dFz5M?g5#r?SVfv^R=1duex;5Zk&&RQ9tyGh78P55L! zB2o1o7lP26@LkW;e+W5$zUsS%wA;aQCQT(gARYwald^q=o=8eocyzrFG4{|NR~1Y=%uZ3fcRT zRAj)ixnX5_DR%ke@JGx4?Q?x?Bj>Nc87J9j+D(8Fq&znKvNl%~WWYp}{B8}U&QgXu z^NY$TE+VkD!(e&#P6dsf0s?FN@^7CpMgxYoYfv&WlWyE6yZKB@l01a<61-kAJT#~x zk`NyL&2^vDE#!-NNYJ1;DyLp}M)`j<^8YtQ*IhR(AuAbbB8yaad5VRWztm}M*kVCt zl*T@&$Q1Wy!m=x1qJuwEhdW=D)E3zhCz1E(Bg8O1i>3Kz%@(MJiefH}MA9b2KWOrf z1Z)_=4e^sRAV7=wYW2AS*Y>QsW9o+*Xs}<>apg(6l3L8+;d-z@G4rL>S*NXn)4U^Y zXQA4(zZhe`vPEzEC2K{@lpyHqo6j|s&R>PchrVI*@8+bv>3*UfFf&tnBN8KJ{&@~K4;z(p z5!E&@YAk4JxpfI^zboi4deuDteaY=7$Oz9mo0bWaJp{0#4$NbfJO*iuCUkoI`%9;2 zW%Y!i#yp|M|aL3L)cVoq$ zuhmRsesYrcL0gXJd*V7w2Pe>C5K$j7#yD4dhX8Iu_IMm2&ChXagG3=C^9p#Rw&P&@ z2m$0ST4XxU3@dRfW0V4Q`7s`7#P7!3bbPvu$2|Gu8tZrjFAg*7ng-qT=?k2dX+|}q zSJtl`oO|kJIB|aceUuy7=+4Cz!M7wwczz|Cj?y&G1-mqg$PK3@Nt!J5_TfNb??LU!c3jt zlIQg6r~IF`(lws^?D|Wb^RAp5nwYvv zSz4pPm_9LGm?+BoN_bL8)fr5j@^Jf#+Ab-6Vh?p7>SS1lC5Hb8t?2eTmWDDL-?K9( zR^H)r7D^D@|FW_4^gqg^%hC(7UTqXt@Shl0a`BXu9Nka0q2v&GP&NJZ@v$V|-vxmD zoXN?_t}h^7_m7m@;fIHQ`itS+m_ke6r1DKM8<=T{*;EzhT+T}9-1&$%T`(BaEjA}m-p`F;PA*rgL`Z*|XlTx% z0Rqu+XxB%@c3*g{CyxH}M5%a%7fPio?C6k+kgGE~`Elg3Rd4yWz0yH#eHtlHBVJb< zsTE%QMfjNDVRM*n9h81(myF^IqC^QNVl)=>$HRUDp)Iebbtzr&`Uy5{p{maCe8^LT z#?L*tN$!Pm^sn%bu1u_>&9%uZj{7chQ`YdER2EfuR#$Xv;Rm5cr)Z$uP;snXG7c*K zhtvU^d1c$qSL*l=hD08}%CH|hKJ9bhCy`^;H3Hj($C;1?#o0*`c-v8%E77;OOjKer$MEHC5_%87bIcfL6bh=kq}3PISp2MTCk2wC7HX_k%>Y*qa*FFlg6mg*Kp zS%pz%4)UMk6IQ4H@%qxyN z>+o9IFo)R7+1RU+Gp&J*Bs+!X?fA%6=xSM`7_jt_JP&rdNWMfiM*CeAXq>;X<4usP zLA4ST9ec)w@4H8gyg=Kc#ebN~X6F+v{r)&K-C8bgqc1dqeRg*F^Xf1H^6{21NivWQ zz#7efLW8h#E=v!l0{lh~UKAYhvFM7wml8Ip;0u?{(ucZ;n{~oF5{d_KR#m5qfd=ma zlff~aZwiuG(a{L*%7CsuhXA4bTY#4)_+zKT#D=GgHJJt)E*&_-<^shon)5mJn8Ny0 z7a=Nk$mXgs6vM2L$NZMAIH(M9y_zkKz5%d*-NF`V)IqPK)~e+4`_SZFzl6y|bR)Ry z<+lRhO#<6B;t<|)m&^MJDVqH)W+w6#zHfa+i}QxBrJbxU*Lbv@|7LDZfZ@cGoxV3= zvz=dc3B#)HS+6G)>Q9pk8oqA z(JH$NcQ!V94466^6w73`C_h1^FcK-w<>zB*nyqL{t5x!fMcFGc+jSCeQu#t`k+KFe z*|K-4Z0f%gbVG~nY#!3)Y|1BmCBYlRmwzsAI@A7ldUKRmzNaM`X9*my^HWj-Bb8+y z)x}A&>6{yD?{@zHRwHJ03zMJic_TpKJlkAN90f`tac=Q)-Dzh)@s^BJLfpoB^RD3g zs*ZP~wfzVIIFuWKCb<{?@;-zeGO#ja@)edT(S2>;+mV zsS$J_ayT*Ldf-Y}36&*#;b==@jwkVSf1u$+wina7c5yOj8(_>L2J*6Ns*}-t=14() z18UdspB^)Bvbl80+cVX3+`?$guUETABWoF)c=^2{kIJAr0x12GA?vW-60|80U4Kj~ zk3xj}jaMLai+Qs1{K*8k5qs9Lx%&E8S8VyBzAbJ;#~Yb#F}PG8o0$%~4E>!!6$R$UGsH##za;7VeJ!1Nav8g}YAip_cs0MSs_bHT0?kKqS!UGbf{27(A=%|T+r=MB zYRs$>g}|PJ2r^1d+ZIU(%*O3Li~)OcJytGb9RfuH^XMFBNRCdV&+2a&&U8c zIJ6{c!Nj#X(znI0Rb2ByS#=TwVd%d{Gh;8ECgsVjKmge{A4Q--bt;=sv2X1)bYI(l z;?uwu9?T?$5C~n|A>{W^YlWb4;ff$YI%lJrRmhDQi|esoyWRbSOJVxsB)_5f_L&)U z$(02=+fqwznv&ZC%1o`@=)Q^?5=|m_dHuU^*b(v-XpBw8!xR3hA|eZ+YqTRc%-Da- z&93zqOss~S^w&+G#pXZU3$bA52RgQB0k10pwTaj_Z5aysk|0y0A2m?kl*Cst?|r=( z>Anq{#G&BBRatjqA&cvT&q{b13gSaGL!5tQqWelpyscQX!|U4djq2RRl#DqW^1B<9 zti-k4xQoj~VD0j&t;sQ3e z!r3ujITU`;Fl!|RF}8w3N#BbXm&qh6AK>oFUcIdZ2$>rL6E|Y#ATHcBK+&6QascVa z9)wo~;yq)TQRT;CH4xlufn64WCoJKY%>$f~Y=$E(?g5~r=GFBq!9!_^Pa0DL@N4Jw zd~Vrgi2I8mbJ(tu#X56Q1_h*FG$9{bl)qDS;Rv3_PNagdC5Pkgz3c(^%6<>}VS*Ze zuWBs(dI%9i>etyg`bIf|teA6tPem=fPK#STN#$*}m;L;`9K)gIx#6{fW_s`sb(Fc6 zOx2txVur8RoI{yj?QZ)x>$s&tl7LdR#alTK=zU4?QXJ(M?8J{huniLgHl-`m5SsHR9Br^Y#G})0gJe8){D@ANtqNLdKd# zp4ZVQ7H=lDaBaa14FX*HlM-u-$yoIBP-joo=g-|ehjb6-zX>cqi!PDL_^La$t6YnS zvH~VkLp1(ALWXaQb$9^efG#oD$w81|9y!oCDc_|WEvwr<3cQt7=(?f=2f9tN1c(k?@9MG$vOaNl-QQ()Q=fuO*SG35OJ8Pt9y) zb8^7Cm>6ktS5bjZIoA+4WdkOOW@nXCa?StaASP>`?H`tj-RXl{H5CE!H%by&0;@lV ztqC)Y6p*80j?go~Xwmanc@s<-lWeY0wxQI$9kLc=wrPYe%QUn={dpz~9PgjUBrxUK z)wB5dz0>xs8u^zSgEP;`%;Sf0Q6IwQ{j6R21pQ{${;+it5l4vYeF5r`&g_Gh38-;T zF%tRKQrmS&FZ>2`;Y>T7iLe(}vvS2e*O1#u+nC-xYjkPXl?mOj?~m)Y{gu~J3i7EA zamoqJ58Tjq{$8@j-9e9W2(X}(l7~qi96LW97}LDZ*`W+WCJY6xezk|Deqz5t%Xjvb zdHbj+rx)f`*>-K!oS*ftS8u?Y(S@CBTEuzTI0k_P^SxZ_-l2-O#~Guhk;@kiXwX{s zO}6y@bB$Wno6MH6F}MJP?SBpivf_1*^R6sgdqPk81y?XE2n-6;tHaMQ53Ke%)X>|q zA_2I0%{SdU(5~)04ildczC2?(5Cz!8$EGpg@DLRNO(4zIPDsK9gJ&~msJ&7)%$ePQ z9I-|56`RPctvJEF`C$%OfECe6-3(J&fa|<{ z<1I5wd)wpuI&AYx?8jHB?V*-` z*BiLcM{&zyny|LE?Tu~^&Dj~l2Ghse?iP>wy-Gdvez=xii~Oz(qeL{b+(46zG+H@n z-eq4{!u}o2UT~Ny$Wj|Sg9XZbx(Ux|+M=eD1|fr>Z?f=XCG5~2tOk{}qrJDrIC09Jv~Wv$t=Hh)o5wojtG#CzU&(Fr*a?ALG88}%9qWM^ zV3o{-u_+Y}^`(%oJLU1&{{q0C|K{ZZQ7gV@pP2Ur81wT>=mF5sa?llp=0!|oqShLy z|Lp6THi%PZ2igwthj`}x-uD0aBckoQ!Z}j(pEog7YmOcKo{}i86WcJ&f3wAo`6)(t zDwhO}Q9-0b@T{JR5RhKcY66J0*tk#~h|VV`jNfs63dD(W1KgY*lAoGI*x0sEy*RABPFxM6SWX z&X@-;ZQN60+oS|(o4!5QV%Ag1Wuqp|<8!X+>VEcJF%m{oH?omW;#6eulh3<3@EC}9 z)!H{C4TNG3cAdJr>98uw+#hM^V?EX!8XgvnR4Xl32rS4Z+yvn97cp*ypbFZ5+e>|k z`(1*zcTRp8s90B@dQrxJzkZ`boaVVYwz-qq>%CD|1jCZOh50D}vXW*LQniTgOcZYq z4b*?p0*WLuDX}1{9xJAM`U4wp8xHroKf8<%gVeM4$bdP1zrbH2)Dz9eMOzSEm4d0d zf4HDz*c@~hU7e9)xE&Sy$a1I=ZDta-IMs>n!;m21K;7m}US{PK>k3jUkB+E(aMVzb z;m{G13JD#eD`s7i3o0fV3H|M}Qi%0>htZ>DNfP!R5SsNq&WwY{6qM-9xdPYh@gE&6&+~ zkCm7GX*l6X@8dV;xgWnmOcA3D+P!)owJME#Wjps0Ob|wfWQKi?bd2APJJtZE#-7#^ zENuY?W20buNBXA9nLxZp*2V*=Ba7js{Kt>Jm7Z*$h>ewG5NsU>NMj|>XFJ{wV|Nyu z#E3gs*?4KgSWt&=eg-5=9wu}q3_ByCcd_hb;L3Amh1ed0@funuPi;`dmj} zWZeK4*mQeuP+$OhP8mSnk)t^P35+dZ7vqkd6&s}V2S3$q`l4U|QZ+?&ChQZ|_UCdS z3T0}!+I$cY352tk3TW|HI8=KJD#AnQJEHx)T^|OX@pTc>Vf!F7?`+j>_jXs;zRCwBRjF627w600u zs%@hpUC?6U<`t^SE=+bKm6r7x-kP%}?lpGsxaJL8?ffWVcKVx(Ry1*(!@j?U@GNn3 z(|3tro8XW-*y^B!_!^s-AhLr&+p2BzJVbP zu^=Xc0tmzXB?;20Z`MMwcHJLKZA+*jEl;MtnPSR^RJ%0I_^X(mdGqnS*QP9OIh~;l z9=Gj(XZ-cV_I_VxYDu{z_(lMH--(%-}*x!V}0@RBcxa8siZV$0CzYF5z{b zkj_PlgFiifPfzvqQQhzAJi{cp43>>D9?Ctjb(zK>5;~kHi)6H0dau9(EB~}w-90Iv zf;gXGlUzJ^4}vQ%7Zh>?^smzhEIcH(UHZ1hjpkVx+hah{aY^O+-Rni*=Vp&7GOvGn z$*E~-=exRAAvo>PKZ$v+RYC0afV&5EavT870vni(9K?sJN+n$HvX}hE>R+l-Si^Je z;!RRTEvP~Pt#4hvUu=cdbReTg=&P>Vc-BjhIG^2hRpqhFDZ=#|geaUw9$2fiu^?!p z(!`Y^vYHP%s~l*cjfQkU)oN`R0p1Tnf=HUigDil|JRV#)&aC`OA172`^}L8c{D8kH zXJ1vdy3^3!qxD_wPagm9nTsX2_n!3jdrh&eY=@bF6lR>zQ zf8P4IWr|@XXJsdJH|XaB6B+{DcDntDp4y^_ROEvDT>ae$hb{wUo9RB{GnMp?yshSc zNM~|}v%-F_-EPxI?AKzy5m{EZI|z`}2v$B!_fmw7eJFruOF%gPp-^&h-|TU~caBrd zS{|#qY=t6#RW8-&TANJ1#oi#;gxcTp#9q%lA%$LRowg^FZ{x}Nyj1>BukELCkFTQP zMO$qQ7-Svwu9tsL^;iNUpyPrQ8twqRF(NDq6r?N{4th}fMOPLAL!b*)BQi2A@*P+SKdrJu=9fFo_qJZ}u?C-paC%Lh>x1PQ&>1Om; zY6XTLBt<>)uK$<7XCdP-L?Wof>iK(U#i7t0=)LrJn-`0f_iP3kdv3;TTvOmv_}DSo zIVsTKwtSmxp~g+^x+2=pdvRlIq8##)1_90z*0D6dE6@_=SRI0+@yZ|62KIlMvzQU z(xMBW80guqwJ4oX8Eo%->Be~}UeT@765Z^o(pNjny>5q9YIkh$Kl1Wt(wWH6y`6z- zo*{3Ck)6M#mt;r)_3cA?&k}vlCJ0RY7E{a$?r}TnG>gf5^f(9w+9z4>77+%7WyqCFb`7_t3BU~B>Q@EJ;I~Pz-Ik_+<-A-+r42y3x>Ho+Cq`aJ(OwJ z#{tL|yr68Xts>|By>D}LGT|69%0A6U+ij~0pFv+^$CY_Hi`*GHMXqZ*fB^;DK=d3i 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�SX?$3^Q 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 D^!eD( literal 0 HcmV?d00001 diff --git a/priv/static/images/sex.png b/priv/static/images/sex.png new file mode 100644 index 0000000000000000000000000000000000000000..877f73ee4a26300a2f4c1869e6b3de31ad9bd423 GIT binary patch literal 84923 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 literal 0 HcmV?d00001 diff --git a/priv/static/robots.txt b/priv/static/robots.txt new file mode 100644 index 0000000..26e06b5 --- /dev/null +++ b/priv/static/robots.txt @@ -0,0 +1,5 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-agent: * +# Disallow: / diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex new file mode 100644 index 0000000..3aedd02 --- /dev/null +++ b/test/support/conn_case.ex @@ -0,0 +1,38 @@ +defmodule VishnyaWeb.ConnCase do + @moduledoc """ + This module defines the test case to be used by + tests that require setting up a connection. + + Such tests rely on `Phoenix.ConnTest` and also + import other functionality to make it easier + to build common data structures and query the data layer. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use VishnyaWeb.ConnCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + # The default endpoint for testing + @endpoint VishnyaWeb.Endpoint + + use VishnyaWeb, :verified_routes + + # Import conveniences for testing with connections + import Plug.Conn + import Phoenix.ConnTest + import VishnyaWeb.ConnCase + end + end + + setup tags do + Vishnya.DataCase.setup_sandbox(tags) + {:ok, conn: Phoenix.ConnTest.build_conn()} + end +end diff --git a/test/support/data_case.ex b/test/support/data_case.ex new file mode 100644 index 0000000..875cc5b --- /dev/null +++ b/test/support/data_case.ex @@ -0,0 +1,58 @@ +defmodule Vishnya.DataCase do + @moduledoc """ + This module defines the setup for tests requiring + access to the application's data layer. + + You may define functions here to be used as helpers in + your tests. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use Vishnya.DataCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + alias Vishnya.Repo + + import Ecto + import Ecto.Changeset + import Ecto.Query + import Vishnya.DataCase + end + end + + setup tags do + Vishnya.DataCase.setup_sandbox(tags) + :ok + end + + @doc """ + Sets up the sandbox based on the test tags. + """ + def setup_sandbox(tags) do + pid = Ecto.Adapters.SQL.Sandbox.start_owner!(Vishnya.Repo, shared: not tags[:async]) + on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end) + end + + @doc """ + A helper that transforms changeset errors into a map of messages. + + assert {:error, changeset} = Accounts.create_user(%{password: "short"}) + assert "password is too short" in errors_on(changeset).password + assert %{password: ["password is too short"]} = errors_on(changeset) + + """ + def errors_on(changeset) do + Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> + Regex.replace(~r"%{(\w+)}", message, fn _, key -> + opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() + end) + end) + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs new file mode 100644 index 0000000..576679a --- /dev/null +++ b/test/test_helper.exs @@ -0,0 +1,2 @@ +ExUnit.start() +Ecto.Adapters.SQL.Sandbox.mode(Vishnya.Repo, :manual) diff --git a/test/vishnya_web/controllers/error_html_test.exs b/test/vishnya_web/controllers/error_html_test.exs new file mode 100644 index 0000000..fd15716 --- /dev/null +++ b/test/vishnya_web/controllers/error_html_test.exs @@ -0,0 +1,14 @@ +defmodule VishnyaWeb.ErrorHTMLTest do + use VishnyaWeb.ConnCase, async: true + + # Bring render_to_string/4 for testing custom views + import Phoenix.Template + + test "renders 404.html" do + assert render_to_string(VishnyaWeb.ErrorHTML, "404", "html", []) == "Not Found" + end + + test "renders 500.html" do + assert render_to_string(VishnyaWeb.ErrorHTML, "500", "html", []) == "Internal Server Error" + end +end diff --git a/test/vishnya_web/controllers/error_json_test.exs b/test/vishnya_web/controllers/error_json_test.exs new file mode 100644 index 0000000..67334a1 --- /dev/null +++ b/test/vishnya_web/controllers/error_json_test.exs @@ -0,0 +1,12 @@ +defmodule VishnyaWeb.ErrorJSONTest do + use VishnyaWeb.ConnCase, async: true + + test "renders 404" do + assert VishnyaWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}} + end + + test "renders 500" do + assert VishnyaWeb.ErrorJSON.render("500.json", %{}) == + %{errors: %{detail: "Internal Server Error"}} + end +end diff --git a/test/vishnya_web/controllers/page_controller_test.exs b/test/vishnya_web/controllers/page_controller_test.exs new file mode 100644 index 0000000..7f2f75a --- /dev/null +++ b/test/vishnya_web/controllers/page_controller_test.exs @@ -0,0 +1,8 @@ +defmodule VishnyaWeb.PageControllerTest do + use VishnyaWeb.ConnCase + + test "GET /", %{conn: conn} do + conn = get(conn, ~p"/") + assert html_response(conn, 200) =~ "Peace of mind from prototype to production" + end +end