diff --git a/.cursor/rules/project-conventions.mdc b/.cursor/rules/project-conventions.mdc index ddc5cdc7..32ecf705 100644 --- a/.cursor/rules/project-conventions.mdc +++ b/.cursor/rules/project-conventions.mdc @@ -1,6 +1,7 @@ --- -description: This rule explains the project's tech stack and code conventions -globs: * +description: +globs: +alwaysApply: true --- This rule serves as high-level documentation for how the Maybe codebase is structured. @@ -19,7 +20,7 @@ This rule serves as high-level documentation for how the Maybe codebase is struc - TailwindCSS for styles - Lucide Icons for icons - Database: PostgreSQL -- Jobs: GoodJob +- Jobs: Sidekiq + Redis - External - Payments: Stripe - User bank data syncing: Plaid diff --git a/.env.example b/.env.example index 5253039c..528dad8b 100644 --- a/.env.example +++ b/.env.example @@ -1,20 +1,31 @@ -# ================================ PLEASE READ ========================================== -# This file outlines all the possible environment variables supported by the Maybe app. -# -# This includes several features that are for our "hosted" version of Maybe, which most -# open-source contributors won't need. +# ================================ PLEASE READ =========================================================== +# This file outlines all the possible environment variables supported by the Maybe app for self hosting. # -# If you are developing locally, you should be referencing `.env.local.example` instead. -# ======================================================================================= +# If you're a developer setting up your local environment, please use `.env.local.example` instead. +# ======================================================================================================== + +# Required self-hosting vars +# -------------------------------------------------------------------------------------------------------- + +# Enables self hosting features (should be set to true unless you know what you're doing) +SELF_HOSTED=true + +# Secret key used to encrypt credentials (https://api.rubyonrails.org/v7.1.3.2/classes/Rails/Application.html#method-i-secret_key_base) +# Has to be a random string, generated eg. by running `openssl rand -hex 64` +SECRET_KEY_BASE=secret-value + +# Optional self-hosting vars +# -------------------------------------------------------------------------------------------------------- + +# Optional: Synth API Key for exchange rates + stock prices +# (you can also set this in your self-hosted settings page) +# Get it here: https://synthfinance.com/ +SYNTH_API_KEY= # Custom port config # For users who have other applications listening at 3000, this allows them to set a value puma will listen to. PORT=3000 -# Exchange Rate & Stock Pricing API -# This is used to convert between different currencies in the app. In addition, it fetches global stock prices. We use Synth, which is a Maybe product. You can sign up for a free account at synthfinance.com. -SYNTH_API_KEY= - # SMTP Configuration # This is only needed if you intend on sending emails from your Maybe instance (such as for password resets or email financial reports). # Resend.com is a good option that offers a free tier for sending emails. @@ -37,60 +48,20 @@ POSTGRES_USER=postgres # This is the domain that your Maybe instance will be hosted at. It is used to generate links in emails and other places. APP_DOMAIN= -## Error and Performance Monitoring -# The app uses Sentry to monitor errors and performance. In reality, you likely don't need this unless you're deploying Maybe to many users. -SENTRY_DSN= - -# If enabled, an invite code generated by `rake invites:create` is required to sign up as a new user. -# This is useful for controlling who can sign up for your Maybe instance. -REQUIRE_INVITE_CODE=false - -# Enables self hosting features (should be set to true for most folks) -SELF_HOSTED=true - -# The hosting platform used to deploy the app (e.g. "render") -# `localhost` (or unset) is used for local development and testing -HOSTING_PLATFORM=localhost - -# Secret key used to encrypt credentials (https://api.rubyonrails.org/v7.1.3.2/classes/Rails/Application.html#method-i-secret_key_base) -# Has to be a random string, generated eg. by running `openssl rand -hex 64` -SECRET_KEY_BASE=secret-value - # Disable enforcing SSL connections # DISABLE_SSL=true -# ====================================================================================================== -# Upgrades Module - responsible for triggering upgrade alerts, prompts, and auto-upgrade functionality -# ====================================================================================================== -# -# UPGRADES_ENABLED: Enables Upgrader class functionality. -# UPGRADES_MODE: Controls how the app will upgrade. `manual` means the user must manually upgrade the app. `auto` means the app will upgrade automatically (great for self-hosting) -# UPGRADES_TARGET: Controls what the app will upgrade to. `release` means the app will upgrade to the latest release. `commit` means the app will upgrade to the latest commit. -# -UPGRADES_ENABLED=false # unless editing the flow, you should keep this `false` locally in development -UPGRADES_MODE=manual # `manual` or `auto` -UPGRADES_TARGET=release # `release` or `commit` - - -# ====================================================================================================== -# Git Repository Module - responsible for fetching latest commit data for upgrades -# ====================================================================================================== -# -GITHUB_REPO_OWNER=maybe-finance -GITHUB_REPO_NAME=maybe -GITHUB_REPO_BRANCH=main - # ====================================================================================================== # Active Storage Configuration - responsible for storing file uploads # ====================================================================================================== # -# * Defaults to disk storage but you can also use Amazon S3, Google Cloud Storage, or Microsoft Azure Storage. +# * Defaults to disk storage but you can also use Amazon S3 or Cloudflare R2 # * Set the appropriate environment variables to use these services. # * Ensure libvips is installed on your system for image processing - https://github.com/libvips/libvips # # Amazon S3 # ========== -# ACTIVE_STORAGE_SERVICE=amazon +# ACTIVE_STORAGE_SERVICE=amazon <- Enables Amazon S3 storage # S3_ACCESS_KEY_ID= # S3_SECRET_ACCESS_KEY= # S3_REGION= # defaults to `us-east-1` if not set @@ -98,26 +69,9 @@ GITHUB_REPO_BRANCH=main # # Cloudflare R2 # ============= -# ACTIVE_STORAGE_SERVICE=cloudflare +# ACTIVE_STORAGE_SERVICE=cloudflare <- Enables Cloudflare R2 storage # CLOUDFLARE_ACCOUNT_ID= # CLOUDFLARE_ACCESS_KEY_ID= # CLOUDFLARE_SECRET_ACCESS_KEY= # CLOUDFLARE_BUCKET= - -# ====================================================================================================== -# Billing Module - responsible for handling billing -# ====================================================================================================== # -STRIPE_PUBLISHABLE_KEY= -STRIPE_SECRET_KEY= -STRIPE_WEBHOOK_SECRET= - -# ====================================================================================================== -# Plaid Configuration -# ====================================================================================================== -# -PLAID_CLIENT_ID= -PLAID_SECRET= -PLAID_ENV= -PLAID_EU_CLIENT_ID= -PLAID_EU_SECRET= diff --git a/.gitignore b/.gitignore index 0b8983aa..3a37df24 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,6 @@ coverage .cursorrules # Ignore node related files -node_modules \ No newline at end of file +node_modules + +compose.yml \ No newline at end of file diff --git a/Gemfile b/Gemfile index c195af9b..86027d7f 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,7 @@ gem "rails", "~> 7.2.2" # Drivers gem "pg", "~> 1.5" +gem "redis", "~> 5.4" # Deployment gem "puma", ">= 5.0" @@ -25,13 +26,14 @@ gem "turbo-rails" gem "hotwire_combobox" # Background Jobs -gem "good_job" +gem "sidekiq" # Error logging gem "vernier" gem "rack-mini-profiler" gem "sentry-ruby" gem "sentry-rails" +gem "sentry-sidekiq" gem "logtail-rails" # Active Storage diff --git a/Gemfile.lock b/Gemfile.lock index 79a48413..6d0899c1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -155,8 +155,6 @@ GEM rubocop (>= 1) smart_properties erubi (1.13.1) - et-orbi (1.2.11) - tzinfo faker (3.5.1) i18n (>= 1.8.11, < 2) faraday (2.12.2) @@ -177,18 +175,8 @@ GEM ffi (1.17.1-x86_64-darwin) ffi (1.17.1-x86_64-linux-gnu) ffi (1.17.1-x86_64-linux-musl) - fugit (1.11.1) - et-orbi (~> 1, >= 1.2.11) - raabro (~> 1.4) globalid (1.2.1) activesupport (>= 6.1) - good_job (4.9.3) - activejob (>= 6.1.0) - activerecord (>= 6.1.0) - concurrent-ruby (>= 1.3.1) - fugit (>= 1.11.0) - railties (>= 6.1.0) - thor (>= 1.0.0) hashdiff (1.1.2) highline (3.1.2) reline @@ -336,7 +324,6 @@ GEM public_suffix (6.0.1) puma (6.6.0) nio4r (~> 2.0) - raabro (1.4.0) racc (1.8.1) rack (3.1.12) rack-mini-profiler (3.3.1) @@ -393,6 +380,10 @@ GEM rdoc (6.12.0) psych (>= 4.0.0) redcarpet (3.6.1) + redis (5.4.0) + redis-client (>= 0.22.0) + redis-client (0.24.0) + connection_pool regexp_parser (2.10.0) reline (0.6.0) io-console (~> 0.5) @@ -458,6 +449,15 @@ GEM sentry-ruby (5.23.0) bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + sentry-sidekiq (5.23.0) + sentry-ruby (~> 5.23.0) + sidekiq (>= 3.0) + sidekiq (8.0.1) + connection_pool (>= 2.5.0) + json (>= 2.9.0) + logger (>= 1.6.2) + rack (>= 3.1.0) + redis-client (>= 0.23.2) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) @@ -544,7 +544,6 @@ DEPENDENCIES faraday faraday-multipart faraday-retry - good_job hotwire-livereload hotwire_combobox i18n-tasks @@ -567,6 +566,7 @@ DEPENDENCIES rails (~> 7.2.2) rails-settings-cached redcarpet + redis (~> 5.4) rotp (~> 6.3) rqrcode (~> 2.2) rubocop-rails-omakase @@ -574,6 +574,8 @@ DEPENDENCIES selenium-webdriver sentry-rails sentry-ruby + sentry-sidekiq + sidekiq simplecov stimulus-rails stripe diff --git a/Procfile.dev b/Procfile.dev index f3cfa172..68cba921 100644 --- a/Procfile.dev +++ b/Procfile.dev @@ -1,3 +1,3 @@ web: bundle exec ${DEBUG:+rdbg -O -n -c --} bin/rails server -b 0.0.0.0 css: bundle exec bin/rails tailwindcss:watch -worker: bundle exec good_job start +worker: bundle exec sidekiq diff --git a/README.md b/README.md index 969f4a80..2a384012 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,6 @@ Get involved: [Discord](https://link.maybe.co/discord) • [Website](https://maybefinance.com) • [Issues](https://github.com/maybe-finance/maybe/issues) -_If you're looking for the previous React codebase, you can find it -at [maybe-finance/maybe-archive](https://github.com/maybe-finance/maybe-archive)._ - ## Backstory We spent the better part of 2021/2022 building a personal finance + wealth @@ -29,9 +26,8 @@ and eventually offer a hosted version of the app for a small monthly fee. There are 3 primary ways to use the Maybe app: -1. Managed (easiest) - _coming soon..._ -2. [One-click deploy](docs/hosting/one-click-deploy.md) -3. [Self-host with Docker](docs/hosting/docker.md) +1. Managed (easiest) - we're in alpha and release invites in our Discord +2. [Self-host with Docker](docs/hosting/docker.md) ## Contributing @@ -84,37 +80,10 @@ If you'd like multi-currency support, there are a few extra steps to follow. ### Setup Guides -#### Dev Container (optional) - -This is 100% optional and meant for devs who don't want to worry about -installing requirements manually for their platform. You can -follow [this guide](https://code.visualstudio.com/docs/devcontainers/containers) -to learn more about Dev Containers. - -If you run into `could not connect to server` errors, you may need to change -your `.env`'s `DB_HOST` environment variable value to `db` to point to the -Postgres container. - -#### Mac - -Please visit -our [Mac dev setup guide](https://github.com/maybe-finance/maybe/wiki/Mac-Dev-Setup-Guide). - -#### Linux - -Please visit -our [Linux dev setup guide](https://github.com/maybe-finance/maybe/wiki/Linux-Dev-Setup-Guide). - -#### Windows - -Please visit -our [Windows dev setup guide](https://github.com/maybe-finance/maybe/wiki/Windows-Dev-Setup-Guide). - -### Testing Emails - -In development, we use `letter_opener` to automatically open emails in your -browser. When an email sends locally, a new browser tab will open with a -preview. +- [Mac dev setup guide](https://github.com/maybe-finance/maybe/wiki/Mac-Dev-Setup-Guide) +- [Linux dev setup guide](https://github.com/maybe-finance/maybe/wiki/Linux-Dev-Setup-Guide) +- [Windows dev setup guide](https://github.com/maybe-finance/maybe/wiki/Windows-Dev-Setup-Guide) +- Dev containers - visit [this guide](https://code.visualstudio.com/docs/devcontainers/containers) to learn more ## Repo Activity diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index f2a91f62..e39e4975 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -10,7 +10,7 @@ class PagesController < ApplicationController end def changelog - @release_notes = Provider::Github.new.fetch_latest_release_notes + @release_notes = Providers.github.fetch_latest_release_notes render layout: "settings" end diff --git a/app/controllers/settings/hostings_controller.rb b/app/controllers/settings/hostings_controller.rb index 637ff80f..f461fc20 100644 --- a/app/controllers/settings/hostings_controller.rb +++ b/app/controllers/settings/hostings_controller.rb @@ -9,18 +9,6 @@ class Settings::HostingsController < ApplicationController end def update - if hosting_params[:upgrades_setting].present? - mode = hosting_params[:upgrades_setting] == "manual" ? "manual" : "auto" - target = hosting_params[:upgrades_setting] == "commit" ? "commit" : "release" - - Setting.upgrades_mode = mode - Setting.upgrades_target = target - end - - if hosting_params.key?(:render_deploy_hook) - Setting.render_deploy_hook = hosting_params[:render_deploy_hook] - end - if hosting_params.key?(:require_invite_for_signup) Setting.require_invite_for_signup = hosting_params[:require_invite_for_signup] end @@ -46,7 +34,7 @@ class Settings::HostingsController < ApplicationController private def hosting_params - params.require(:setting).permit(:render_deploy_hook, :upgrades_setting, :require_invite_for_signup, :require_email_confirmation, :synth_api_key) + params.require(:setting).permit(:require_invite_for_signup, :require_email_confirmation, :synth_api_key) end def raise_if_not_self_hosted diff --git a/app/controllers/upgrades_controller.rb b/app/controllers/upgrades_controller.rb deleted file mode 100644 index baf4cd8d..00000000 --- a/app/controllers/upgrades_controller.rb +++ /dev/null @@ -1,56 +0,0 @@ -class UpgradesController < ApplicationController - before_action :verify_upgrades_enabled - - def acknowledge - commit_sha = params[:id] - upgrade = Upgrader.find_upgrade(commit_sha) - - if upgrade - if upgrade.available? - Current.user.acknowledge_upgrade_prompt(upgrade.commit_sha) - flash[:notice] = t(".upgrade_dismissed") - elsif upgrade.complete? - Current.user.acknowledge_upgrade_alert(upgrade.commit_sha) - flash[:notice] = t(".upgrade_complete_dismiss") - else - flash[:alert] = t(".upgrade_not_available") - end - else - flash[:alert] = t(".upgrade_not_found") - end - - redirect_back(fallback_location: root_path) - end - - def deploy - commit_sha = params[:id] - upgrade = Upgrader.find_upgrade(commit_sha) - - unless upgrade - flash[:alert] = t(".upgrade_not_found") - return redirect_back(fallback_location: root_path) - end - - prior_acknowledged_upgrade_commit_sha = Current.user.last_prompted_upgrade_commit_sha - - # Optimistically acknowledge the upgrade prompt - Current.user.acknowledge_upgrade_prompt(upgrade.commit_sha) - - upgrade_result = Upgrader.upgrade_to(upgrade) - - if upgrade_result[:success] - flash[:notice] = upgrade_result[:message] - else - # If the upgrade fails, revert to the prior acknowledged upgrade - Current.user.acknowledge_upgrade_prompt(prior_acknowledged_upgrade_commit_sha) - flash[:alert] = upgrade_result[:message] - end - - redirect_back(fallback_location: root_path) - end - - private - def verify_upgrades_enabled - head :not_found unless ENV["UPGRADES_ENABLED"] == "true" - end -end diff --git a/app/helpers/upgrades_helper.rb b/app/helpers/upgrades_helper.rb deleted file mode 100644 index 6e1584d9..00000000 --- a/app/helpers/upgrades_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -module UpgradesHelper - def get_upgrade_for_notification(user, upgrades_mode) - return nil unless ENV["UPGRADES_ENABLED"] == "true" - return nil unless user.present? - - completed_upgrade = Upgrader.completed_upgrade - return completed_upgrade if completed_upgrade && user.last_alerted_upgrade_commit_sha != completed_upgrade.commit_sha - - available_upgrade = Upgrader.available_upgrade - if available_upgrade && upgrades_mode == "manual" && user.last_prompted_upgrade_commit_sha != available_upgrade.commit_sha - available_upgrade - end - end -end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb index d394c3d1..25727230 100644 --- a/app/jobs/application_job.rb +++ b/app/jobs/application_job.rb @@ -1,7 +1,5 @@ class ApplicationJob < ActiveJob::Base - # Automatically retry jobs that encountered a deadlock - # retry_on ActiveRecord::Deadlocked - - # Most jobs are safe to ignore if the underlying records are no longer available - # discard_on ActiveJob::DeserializationError + retry_on ActiveRecord::Deadlocked + discard_on ActiveJob::DeserializationError + queue_as :low_priority # default queue end diff --git a/app/jobs/auto_upgrade_job.rb b/app/jobs/auto_upgrade_job.rb deleted file mode 100644 index 34a0f3dc..00000000 --- a/app/jobs/auto_upgrade_job.rb +++ /dev/null @@ -1,31 +0,0 @@ -class AutoUpgradeJob < ApplicationJob - queue_as :latency_low - - def perform(*args) - raise_if_disabled - - return Rails.logger.info "Skipping auto-upgrades because app is set to manual upgrades. Please set UPGRADES_MODE=auto to enable auto-upgrades" if Setting.upgrades_mode == "manual" - - Rails.logger.info "Searching for available auto-upgrades..." - - candidate = Upgrader.available_upgrade_by_type(Setting.upgrades_target) - - if candidate - if Rails.cache.read("last_auto_upgrade_commit_sha") == candidate.commit_sha - Rails.logger.info "Skipping auto upgrade: #{candidate.type} #{candidate.commit_sha} deploy in progress" - return - end - - Rails.logger.info "Auto upgrading to #{candidate.type} #{candidate.commit_sha}..." - Upgrader.upgrade_to(candidate) - Rails.cache.write("last_auto_upgrade_commit_sha", candidate.commit_sha, expires_in: 1.day) - else - Rails.logger.info "No auto upgrade available at this time" - end - end - - private - def raise_if_disabled - raise "Upgrades module is disabled. Please set UPGRADES_ENABLED=true to enable upgrade features" unless ENV["UPGRADES_ENABLED"] == "true" - end -end diff --git a/app/jobs/data_cache_clear_job.rb b/app/jobs/data_cache_clear_job.rb index 49e18880..045e1e10 100644 --- a/app/jobs/data_cache_clear_job.rb +++ b/app/jobs/data_cache_clear_job.rb @@ -1,5 +1,5 @@ class DataCacheClearJob < ApplicationJob - queue_as :default + queue_as :low_priority def perform(family) ActiveRecord::Base.transaction do diff --git a/app/jobs/destroy_job.rb b/app/jobs/destroy_job.rb index 8ea120f6..74348555 100644 --- a/app/jobs/destroy_job.rb +++ b/app/jobs/destroy_job.rb @@ -1,5 +1,5 @@ class DestroyJob < ApplicationJob - queue_as :latency_low + queue_as :low_priority def perform(model) model.destroy diff --git a/app/jobs/enrich_transaction_batch_job.rb b/app/jobs/enrich_transaction_batch_job.rb index a796db67..71aac720 100644 --- a/app/jobs/enrich_transaction_batch_job.rb +++ b/app/jobs/enrich_transaction_batch_job.rb @@ -1,5 +1,5 @@ class EnrichTransactionBatchJob < ApplicationJob - queue_as :latency_high + queue_as :low_priority def perform(account, batch_size = 100, offset = 0) account.enrich_transaction_batch(batch_size, offset) diff --git a/app/jobs/family_reset_job.rb b/app/jobs/family_reset_job.rb index 20dc2499..185df111 100644 --- a/app/jobs/family_reset_job.rb +++ b/app/jobs/family_reset_job.rb @@ -1,5 +1,5 @@ class FamilyResetJob < ApplicationJob - queue_as :default + queue_as :low_priority def perform(family) # Delete all family data except users diff --git a/app/jobs/fetch_security_info_job.rb b/app/jobs/fetch_security_info_job.rb index 484a47e1..e789222f 100644 --- a/app/jobs/fetch_security_info_job.rb +++ b/app/jobs/fetch_security_info_job.rb @@ -1,5 +1,5 @@ class FetchSecurityInfoJob < ApplicationJob - queue_as :latency_low + queue_as :low_priority def perform(security_id) return unless Security.provider.present? diff --git a/app/jobs/import_job.rb b/app/jobs/import_job.rb index 8a7c490e..2e45f508 100644 --- a/app/jobs/import_job.rb +++ b/app/jobs/import_job.rb @@ -1,5 +1,5 @@ class ImportJob < ApplicationJob - queue_as :latency_medium + queue_as :high_priority def perform(import) import.publish diff --git a/app/jobs/revert_import_job.rb b/app/jobs/revert_import_job.rb index ac7090b4..818244cb 100644 --- a/app/jobs/revert_import_job.rb +++ b/app/jobs/revert_import_job.rb @@ -1,5 +1,5 @@ class RevertImportJob < ApplicationJob - queue_as :latency_low + queue_as :medium_priority def perform(import) import.revert diff --git a/app/jobs/sync_job.rb b/app/jobs/sync_job.rb index 187d18f7..3c7497df 100644 --- a/app/jobs/sync_job.rb +++ b/app/jobs/sync_job.rb @@ -1,7 +1,8 @@ class SyncJob < ApplicationJob - queue_as :latency_medium + queue_as :high_priority def perform(sync) + sleep 1 # simulate work for faster jobs sync.perform end end diff --git a/app/jobs/user_purge_job.rb b/app/jobs/user_purge_job.rb index 2f173f7a..70b94be8 100644 --- a/app/jobs/user_purge_job.rb +++ b/app/jobs/user_purge_job.rb @@ -1,5 +1,5 @@ class UserPurgeJob < ApplicationJob - queue_as :latency_low + queue_as :low_priority def perform(user) user.purge diff --git a/app/models/provider/github.rb b/app/models/provider/github.rb index 51e2556c..208049c5 100644 --- a/app/models/provider/github.rb +++ b/app/models/provider/github.rb @@ -1,43 +1,10 @@ class Provider::Github attr_reader :name, :owner, :branch - def initialize(config = {}) - @name = config[:name] || ENV.fetch("GITHUB_REPO_NAME", "maybe") - @owner = config[:owner] || ENV.fetch("GITHUB_REPO_OWNER", "maybe-finance") - @branch = config[:branch] || ENV.fetch("GITHUB_REPO_BRANCH", "main") - end - - def fetch_latest_upgrade_candidates - Rails.cache.fetch("latest_github_upgrade_candidates", expires_in: 30.minutes) do - Rails.logger.info "Fetching latest GitHub upgrade candidates from #{repo} on branch #{branch}..." - begin - latest_release = Octokit.releases(repo).first - latest_version = latest_release ? Semver.from_release_tag(latest_release.tag_name) : Semver.new(Maybe.version) - latest_commit = Octokit.branch(repo, branch) - - release_info = if latest_release - { - version: latest_version, - url: latest_release.html_url, - commit_sha: Octokit.commit(repo, latest_release.tag_name).sha - } - end - - commit_info = { - version: latest_version, - commit_sha: latest_commit.commit.sha, - url: latest_commit.commit.html_url - } - - { - release: release_info, - commit: commit_info - } - rescue => e - Rails.logger.error "Failed to fetch latest GitHub commits: #{e.message}" - nil - end - end + def initialize + @name = "maybe" + @owner = "maybe-finance" + @branch = "main" end def fetch_latest_release_notes diff --git a/app/models/setting.rb b/app/models/setting.rb index 41355fee..da829d7e 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -2,24 +2,7 @@ class Setting < RailsSettings::Base cache_prefix { "v1" } - field :render_deploy_hook, - type: :string, - default: ENV["RENDER_DEPLOY_HOOK"], - validates: { allow_blank: true, format: { with: /\Ahttps:\/\/api\.render\.com\/deploy\/srv-.+\z/ } } - - field :upgrades_mode, - type: :string, - default: ENV.fetch("UPGRADES_MODE", "manual"), - validates: { inclusion: { in: %w[manual auto] } } - - field :upgrades_target, - type: :string, - default: ENV.fetch("UPGRADES_TARGET", "release"), - validates: { inclusion: { in: %w[release commit] } } - field :synth_api_key, type: :string, default: ENV["SYNTH_API_KEY"] - field :require_invite_for_signup, type: :boolean, default: false - field :require_email_confirmation, type: :boolean, default: ENV.fetch("REQUIRE_EMAIL_CONFIRMATION", "true") == "true" end diff --git a/app/models/upgrader.rb b/app/models/upgrader.rb deleted file mode 100644 index 605c7da8..00000000 --- a/app/models/upgrader.rb +++ /dev/null @@ -1,57 +0,0 @@ -class Upgrader - include Provided - - class << self - attr_writer :config - - def config - @config ||= Config.new - end - - def upgrade_to(commit_or_upgrade) - upgrade = commit_or_upgrade.is_a?(String) ? find_upgrade(commit_or_upgrade) : commit_or_upgrade - config.deployer.deploy(upgrade) - end - - def find_upgrade(commit) - upgrade_candidates.find { |candidate| candidate.commit_sha == commit } - end - - def available_upgrade - available_upgrades.first - end - - # Default to showing releases first, then commits - def completed_upgrade - completed_upgrades.find { |upgrade| upgrade.type == "release" } || completed_upgrades.first - end - - def available_upgrade_by_type(type) - if type == "commit" - commit_upgrade = available_upgrades.find { |upgrade| upgrade.type == "commit" } - commit_upgrade || available_upgrades.first - elsif type == "release" - available_upgrades.find { |upgrade| upgrade.type == "release" } - end - end - - private - def available_upgrades - upgrade_candidates.select(&:available?) - end - - def completed_upgrades - upgrade_candidates.select(&:complete?) - end - - def upgrade_candidates - latest_candidates = fetch_latest_upgrade_candidates_from_provider - return [] unless latest_candidates - - commit_candidate = Upgrade.new("commit", latest_candidates[:commit]) - release_candidate = latest_candidates[:release] && Upgrade.new("release", latest_candidates[:release]) - - [ release_candidate, commit_candidate ].compact.uniq { |candidate| candidate.commit_sha } - end - end -end diff --git a/app/models/upgrader/config.rb b/app/models/upgrader/config.rb deleted file mode 100644 index a78e51e7..00000000 --- a/app/models/upgrader/config.rb +++ /dev/null @@ -1,17 +0,0 @@ -class Upgrader::Config - attr_reader :env, :options - - def initialize(options = {}, env: ENV) - @env = env - @options = options - end - - def deployer - factory = Upgrader::Deployer - factory.for(hosting_platform) - end - - def hosting_platform - options[:hosting_platform] || env["HOSTING_PLATFORM"] - end -end diff --git a/app/models/upgrader/deployer.rb b/app/models/upgrader/deployer.rb deleted file mode 100644 index cb12992e..00000000 --- a/app/models/upgrader/deployer.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Upgrader::Deployer - def self.for(platform) - case platform - when nil, "localhost" - Upgrader::Deployer::Null.new - when "render" - Upgrader::Deployer::Render.new - else - raise "Unknown platform: #{platform}" - end - end -end diff --git a/app/models/upgrader/deployer/null.rb b/app/models/upgrader/deployer/null.rb deleted file mode 100644 index d4d217fa..00000000 --- a/app/models/upgrader/deployer/null.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Upgrader::Deployer::Null - def deploy(upgrade) - { - success: true, - message: I18n.t("upgrader.deployer.null_deployer.success_message") - } - end -end diff --git a/app/models/upgrader/deployer/render.rb b/app/models/upgrader/deployer/render.rb deleted file mode 100644 index 5df86857..00000000 --- a/app/models/upgrader/deployer/render.rb +++ /dev/null @@ -1,41 +0,0 @@ -class Upgrader::Deployer::Render - def deploy(upgrade) - if Setting.render_deploy_hook.blank? - return { - success: false, - message: I18n.t("upgrader.deployer.render.error_message_not_set"), - troubleshooting_url: "/settings/self_hosting/edit" - } - end - - Rails.logger.info I18n.t("upgrader.deployer.render.deploy_log_info", type: upgrade.type, commit_sha: upgrade.commit_sha) - - begin - uri = URI.parse(Setting.render_deploy_hook) - uri.query = [ uri.query, "ref=#{upgrade.commit_sha}" ].compact.join("&") - response = Faraday.post(uri.to_s) - - unless response.success? - Rails.logger.error I18n.t("upgrader.deployer.render.deploy_log_error", type: upgrade.type, commit_sha: upgrade.commit_sha, error_message: response.body) - return default_error_response - end - - { - success: true, - message: I18n.t("upgrader.deployer.render.success_message", commit_sha: upgrade.commit_sha.slice(0, 7)) - } - rescue => e - Rails.logger.error I18n.t("upgrader.deployer.render.deploy_log_error", type: upgrade.type, commit_sha: upgrade.commit_sha, error_message: e.message) - default_error_response - end - end - - private - def default_error_response - { - success: false, - message: I18n.t("upgrader.deployer.render.error_message_failed_deploy"), - troubleshooting_url: I18n.t("upgrader.deployer.render.troubleshooting_url") - } - end -end diff --git a/app/models/upgrader/provided.rb b/app/models/upgrader/provided.rb deleted file mode 100644 index c0eac5e0..00000000 --- a/app/models/upgrader/provided.rb +++ /dev/null @@ -1,10 +0,0 @@ -module Upgrader::Provided - extend ActiveSupport::Concern - - class_methods do - private - def fetch_latest_upgrade_candidates_from_provider - Providers.github.fetch_latest_upgrade_candidates - end - end -end diff --git a/app/models/upgrader/upgrade.rb b/app/models/upgrader/upgrade.rb deleted file mode 100644 index 6a842947..00000000 --- a/app/models/upgrader/upgrade.rb +++ /dev/null @@ -1,29 +0,0 @@ -class Upgrader::Upgrade - attr_reader :type, :commit_sha, :version, :url - - def initialize(type, data) - @type = %w[release commit].include?(type) ? type : raise(ArgumentError, "Type must be either 'release' or 'commit'") - @commit_sha = data[:commit_sha] - @version = normalize_version(data[:version]) - @url = data[:url] - end - - def complete? - commit_sha == Maybe.commit_sha - end - - def available? - return false if commit_sha == Maybe.commit_sha || version < Maybe.version - return false if version == Maybe.version && type == "release" - true - end - - def to_s - type == "release" ? version.to_release_tag : "#{commit_sha.first(7)} (pre-release)" - end - - private - def normalize_version(version) - version.is_a?(Semver) ? version : Semver.new(version) - end -end diff --git a/app/models/user.rb b/app/models/user.rb index 479ce225..db929953 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -69,22 +69,6 @@ class User < ApplicationRecord (display_name&.first || email.first).upcase end - def acknowledge_upgrade_prompt(commit_sha) - update!(last_prompted_upgrade_commit_sha: commit_sha) - end - - def acknowledge_upgrade_alert(commit_sha) - update!(last_alerted_upgrade_commit_sha: commit_sha) - end - - def has_seen_upgrade_prompt?(upgrade) - last_prompted_upgrade_commit_sha == upgrade.commit_sha - end - - def has_seen_upgrade_alert?(upgrade) - last_alerted_upgrade_commit_sha == upgrade.commit_sha - end - # Deactivation validate :can_deactivate, if: -> { active_changed? && !active } after_update_commit :purge_later, if: -> { saved_change_to_active?(from: true, to: false) } diff --git a/app/views/impersonation_sessions/_super_admin_bar.html.erb b/app/views/impersonation_sessions/_super_admin_bar.html.erb index 41bf6d13..57bfa825 100644 --- a/app/views/impersonation_sessions/_super_admin_bar.html.erb +++ b/app/views/impersonation_sessions/_super_admin_bar.html.erb @@ -4,7 +4,7 @@ Super Admin
- <%= link_to "Jobs", good_job_url, class: "text-white underline hover:text-gray-100" %> + <%= link_to "Jobs", sidekiq_web_url, class: "text-white underline hover:text-gray-100" %>
diff --git a/app/views/layouts/shared/_htmldoc.html.erb b/app/views/layouts/shared/_htmldoc.html.erb index 6123b318..bfeafd27 100644 --- a/app/views/layouts/shared/_htmldoc.html.erb +++ b/app/views/layouts/shared/_htmldoc.html.erb @@ -19,10 +19,6 @@ <%= family_notifications_stream %> <%= family_stream %> - <% if self_hosted? && (upgrade = get_upgrade_for_notification(Current.user, Setting.upgrades_mode)) %> - <%= render partial: "shared/upgrade_notification", locals: { upgrade: upgrade } %> - <% end %> - <%= turbo_frame_tag "modal" %> <%= turbo_frame_tag "drawer" %> <%= render "shared/confirm_modal" %> diff --git a/app/views/layouts/shared/_notifications.html.erb b/app/views/layouts/shared/_notifications.html.erb index 29cb8c8d..4d55e272 100644 --- a/app/views/layouts/shared/_notifications.html.erb +++ b/app/views/layouts/shared/_notifications.html.erb @@ -10,7 +10,3 @@ <%= family_notifications_stream %> <%= family_stream %> - -<% if self_hosted? && (upgrade = get_upgrade_for_notification(Current.user, Setting.upgrades_mode)) %> - <%= render partial: "shared/upgrade_notification", locals: { upgrade: upgrade } %> -<% end %> diff --git a/app/views/settings/hostings/_provider_settings.html.erb b/app/views/settings/hostings/_provider_settings.html.erb deleted file mode 100644 index f6191e89..00000000 --- a/app/views/settings/hostings/_provider_settings.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -<% if ENV["HOSTING_PLATFORM"] == "render" %> - <%= styled_form_with model: Setting.new, url: settings_hosting_path, method: :patch, data: { controller: "auto-submit-form", "auto-submit-form-trigger-event-value" => "blur" } do |form| %> -
-

<%= t(".title") %>

-

<%= t(".description") %>

- <%= form.url_field :render_deploy_hook, label: t(".render_deploy_hook_label"), placeholder: t(".render_deploy_hook_placeholder"), value: Setting.render_deploy_hook, data: { "auto-submit-form-target" => "auto" } %> -
- <% end %> -<% end %> diff --git a/app/views/settings/hostings/_upgrade_settings.html.erb b/app/views/settings/hostings/_upgrade_settings.html.erb deleted file mode 100644 index fc558b9d..00000000 --- a/app/views/settings/hostings/_upgrade_settings.html.erb +++ /dev/null @@ -1,41 +0,0 @@ -<% if ENV["HOSTING_PLATFORM"] == "render" %> -
-

<%= t(".title") %>

-

<%= t(".description") %>

- - <%= styled_form_with model: Setting.new, url: settings_hosting_path, method: :patch, data: { controller: "auto-submit-form", "auto-submit-form-trigger-event-value" => "blur" } do |form| %> -
-
- <%= form.radio_button :upgrades_setting, "manual", checked: Setting.upgrades_mode == "manual", data: { "auto-submit-form-target" => "auto", "autosubmit-trigger-event": "input" } %> - <%= form.label :upgrades_mode_manual, t(".manual_title"), class: "text-primary text-sm" do %> - <%= t(".manual_title") %> -
- - <%= t(".manual_description") %> - - <% end %> -
-
- <%= form.radio_button :upgrades_setting, "release", checked: Setting.upgrades_mode == "auto" && Setting.upgrades_target == "release", data: { "auto-submit-form-target" => "auto", "autosubmit-trigger-event": "input" } %> - <%= form.label :upgrades_mode_release, t(".latest_release_title"), class: "text-primary text-sm" do %> - <%= t(".latest_release_title") %> -
- - <%= t(".latest_release_description") %> - - <% end %> -
-
- <%= form.radio_button :upgrades_setting, "commit", checked: Setting.upgrades_mode == "auto" && Setting.upgrades_target == "commit", data: { "auto-submit-form-target" => "auto", "autosubmit-trigger-event": "input" } %> - <%= form.label :upgrades_mode_commit, t(".latest_commit_title"), class: "text-primary text-sm" do %> - <%= t(".latest_commit_title") %> -
- - <%= t(".latest_commit_description") %> - - <% end %> -
-
- <% end %> -
-<% end %> diff --git a/app/views/settings/hostings/show.html.erb b/app/views/settings/hostings/show.html.erb index bd1916f3..8f944323 100644 --- a/app/views/settings/hostings/show.html.erb +++ b/app/views/settings/hostings/show.html.erb @@ -2,8 +2,6 @@ <%= settings_section title: t(".general") do %>
- <%= render "settings/hostings/upgrade_settings" %> - <%= render "settings/hostings/provider_settings" %> <%= render "settings/hostings/synth_settings" %>
<% end %> diff --git a/app/views/shared/_upgrade_notification.html.erb b/app/views/shared/_upgrade_notification.html.erb deleted file mode 100644 index e2391b63..00000000 --- a/app/views/shared/_upgrade_notification.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -<%# locals: (upgrade:) %> -
-
-

<%= link_to upgrade.to_s, upgrade.url, class: "text-sm text-blue-500 underline hover:text-blue-700", target: "_blank" %>

- <% if upgrade.complete? %> -

<%= t(".app_upgraded", version: upgrade.to_s) %>

- <% else %> -

<%= t(".new_version_available") %>

- <% end %> -
-
- <%= button_to t(".dismiss"), acknowledge_upgrade_path(upgrade.commit_sha), method: :post, class: "#{upgrade.complete? ? 'bg-gray-900 text-white' : 'bg-gray-100 text-primary'} text-sm font-bold p-2 rounded-lg" %> - <% if upgrade.available? %> - <%= button_to t(".upgrade_now"), deploy_upgrade_path(upgrade.commit_sha), method: :post, class: "bg-gray-900 hover:bg-gray-700 text-white font-medium text-sm p-2 rounded-lg" %> - <% end %> -
-
diff --git a/bin/render-build.sh b/bin/render-build.sh index 5f260f64..1f95dc7f 100755 --- a/bin/render-build.sh +++ b/bin/render-build.sh @@ -10,16 +10,3 @@ echo "Precompiling assets..." ./bin/rails assets:clean echo "Build complete" - -# Self Hosters: -# -# By default, one-click deploys are free-tier instances (to avoid unexpected charges) -# Render does NOT allow free-tier instances to use the `preDeployCommand` feature, so -# database migrations must be run in the build step. -# -# If you're on a paid Render plan, you can remove the `RUN_DB_MIGRATIONS_IN_BUILD_STEP` (or set to `false`) -if [ "$RUN_DB_MIGRATIONS_IN_BUILD_STEP" = "true" ]; then - echo "Initiating database migrations for the free tier..." - bundle exec rails db:migrate - echo "Database migrations completed. Reminder: If you've moved to a Render paid plan, you can remove the RUN_DB_MIGRATIONS_IN_BUILD_STEP environment variable to utilize the `preDeployCommand` feature for migrations." -fi diff --git a/compose.example.yml b/compose.example.yml new file mode 100644 index 00000000..ea6b5b63 --- /dev/null +++ b/compose.example.yml @@ -0,0 +1,100 @@ +# =========================================================================== +# Example Docker Compose file +# =========================================================================== +# +# Purpose: +# -------- +# +# This file is an example Docker Compose configuration for self hosting +# Maybe on your local machine or on a cloud VPS. +# +# The configuration below is a "standard" setup that works out of the box, +# but if you're running this outside of a local network, it is recommended +# to set the environment variables for extra security. +# +# Setup: +# ------ +# +# To run this, you should read the setup guide: +# +# https://github.com/maybe-finance/maybe/blob/main/docs/hosting/docker.md +# +# Troubleshooting: +# ---------------- +# +# If you run into problems, you should open a Discussion here: +# +# https://github.com/maybe-finance/maybe/discussions/categories/general +# + +x-db-env: &db_env + POSTGRES_USER: ${POSTGRES_USER:-maybe_user} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-maybe_password} + POSTGRES_DB: ${POSTGRES_DB:-maybe_production} + +x-rails-env: &rails_env + <<: *db_env + SECRET_KEY_BASE: ${SECRET_KEY_BASE:-a7523c3d0ae56415046ad8abae168d71074a79534a7062258f8d1d51ac2f76d3c3bc86d86b6b0b307df30d9a6a90a2066a3fa9e67c5e6f374dbd7dd4e0778e13} + SELF_HOSTED: "true" + RAILS_FORCE_SSL: "false" + RAILS_ASSUME_SSL: "false" + DB_HOST: db + DB_PORT: 5432 + REDIS_URL: redis://redis:6379/1 + +services: + web: + image: ghcr.io/maybe-finance/maybe:latest + volumes: + - app-storage:/rails/storage + ports: + - 3000:3000 + restart: unless-stopped + environment: + <<: *rails_env + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + + worker: + image: ghcr.io/maybe-finance/maybe:latest + command: bundle exec sidekiq + restart: unless-stopped + depends_on: + redis: + condition: service_healthy + environment: + <<: *rails_env + + db: + image: postgres:16 + restart: unless-stopped + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + <<: *db_env + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB" ] + interval: 5s + timeout: 5s + retries: 5 + + redis: + image: redis:latest + ports: + - 6379:6379 + restart: unless-stopped + volumes: + - redis-data:/data + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 5s + timeout: 5s + retries: 5 + +volumes: + app-storage: + postgres-data: + redis-data: \ No newline at end of file diff --git a/config/application.rb b/config/application.rb index df4c0f36..a5d2e280 100644 --- a/config/application.rb +++ b/config/application.rb @@ -24,8 +24,6 @@ module Maybe # config.time_zone = "Central Time (US & Canada)" # config.eager_load_paths << Rails.root.join("extras") - config.active_job.queue_adapter = :good_job - # TODO: This is here for incremental adoption of localization. This can be removed when all translations are implemented. config.i18n.fallbacks = true diff --git a/config/cable.yml b/config/cable.yml index cc73650e..3474a21a 100644 --- a/config/cable.yml +++ b/config/cable.yml @@ -1,8 +1,10 @@ development: - adapter: postgresql + adapter: async test: adapter: test production: - adapter: postgresql + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: maybe_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc index 142afb99..06708655 100644 --- a/config/credentials.yml.enc +++ b/config/credentials.yml.enc @@ -1 +1 @@ -HMC62biPQuF61XA8tnd/kvwdV2xr/zpfJxG+IHNgGtpuvPXi9oS+YemBGMLte+1Q7elzAAbmKg73699hVLkRcBCk/FaMQjGRF2lnJ9MpxSR/br8Uma2bSH40lIEjxAfzjr4JPSfsHxlArF30hfd+B9obPDOptLQbpENPBsmiuEHX7S0Y8SmKuzDUVrvdfeLoVuMiAZqOP5izpBAbXfvMjI3YH70iJAaPlfAxQqR89O2nSt+N27siyyfkypE3NHQKZFz+Rmo8uJDlaD3eo/uvQN4xsgRCMUar4X2iY4UOd+MIGAPqLzIUhhJ56G5MRDJ4XpJA6RDuGFc/LNyxdXt0WinUX8Yz7zKiKah1NkEhTkH+b2ylFbsN6cjlqcX0yw8Gw8B4osyHQGnj7Tuf1c8k1z3gBoaQALm8zxKCaJ9k6CopVM2GmbpCLcJqjN1L71wCe6MiWsv9LDF/pwuZNG6hWn0oykdkWeBEQyK8g4Wo1AHqgEi8XtRwbaX6yugO5WQFhjQG/LzXcG02E5Co5/r/G7ZSFpRC9ngoOx3LY6MihPRkTIOumCg3HHtAsWBeHe4L/rDIe4A=--hlLxVbnyuYXf7Rku--A6Cwdr3CAW6bRkl1rcRmRw== \ No newline at end of file +Be5nAlhacgJFHZJBgO8noswyX/VOrmkMem7wS3YQhoogzG0MCSVxCAVMbFyYFYUwqZrSPkAqUTpgH5OJJ1FB1gZfL9IYYWnEdTzMxM7IvhdDwYllYcM6smbvZEbOiqxLs9VdfC/qFS+1iFtsezBaqxfGdANJsJt3TxoRWl/ZbQ4Od1s0BNkMis1CDZt5RMEQlTz813cE5sXBlxhqEr9/2CaktwPIe5S/Oxrwo8vPFBvrNdox8BysiK9WDik8jJFSVwPSCvg43/MaIJUT0cOILdSxqrATXV143/h6ghNYtrJgoUNFT7wuu0FTU/ovTgtTqQEKG+7PDO1WLFn606bVknjPwfNMGBa9hX3LbRErDDIXNq69um9fPZ8Yq5f9jP++dPbAqbWBEg+JYsZmDgzr7LmtXVzQgAcuMkHaBbL8uxod8S1B6qhXhLNc8Dd1oeHVu0kcLFO2zaqdYRFNEY30JSjjXlG3GExXQE6aEluXvdF2gj9Hjhp7tEXZEJbIx+ZFy+6Xbrd1E2BE8AZUbalExAfudkPSYlAZ+z3fWc2RlNIuBzTYDOWH9Ai8mqsdyGNVEyizXQ==--j/6QtlLtP4mYXIFw--c+AKfDPo9stantWni+u+4Q== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml index c3142c2a..d3a412be 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,22 +1,7 @@ default: &default adapter: postgresql encoding: unicode - # Note on DB_POOL_SIZE: - # ------------------------------------------------------------------------------------------------------------- - # To optimize for the simplest self-hosting setup, we run ActionCable, GoodJob, and Rails in the same process. - # - # This requires DB connections for each: - # - # Puma: Requires 3 connections (Rails default) - # ActionCable: 5 connections (Rails defaults to 4 workers + 1 listener for Postgres adapter) - # GoodJob: 15 connections to run in "async" mode. See `good_job.rb` for the breakdown. - # -------------------------------------------------------------------------------------------- - # Total: 23 connections - # - # We default to this value so that self-hosters don't need to configure anything. Hosted mode will require - # a different pool size, as we run ActionCable, GoodJob, and Rails in separate processes. - # - pool: <%= ENV.fetch("DB_POOL_SIZE") { 23 } %> + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 3 } %> host: <%= ENV.fetch("DB_HOST") { "127.0.0.1" } %> port: <%= ENV.fetch("DB_PORT") { "5432" } %> user: <%= ENV.fetch("POSTGRES_USER") { nil } %> diff --git a/config/environments/production.rb b/config/environments/production.rb index 4670492d..e8327dc6 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -69,11 +69,12 @@ Rails.application.configure do # want to log everything, set the level to "debug". config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") - # Use a different cache store in production. - # config.cache_store = :mem_cache_store + if ENV["CACHE_REDIS_URL"].present? + config.cache_store = :redis_cache_store, { url: ENV["CACHE_REDIS_URL"] } + end config.action_mailer.perform_caching = false - + config.action_mailer.deliver_later_queue_name = :high_priority config.action_mailer.default_url_options = { host: ENV["APP_DOMAIN"] } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { @@ -105,4 +106,7 @@ Rails.application.configure do # ] # Skip DNS rebinding protection for the default health check endpoint. # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } + + # set REDIS_URL for Sidekiq to use Redis + config.active_job.queue_adapter = :sidekiq end diff --git a/config/initializers/good_job.rb b/config/initializers/good_job.rb deleted file mode 100644 index fcfacc19..00000000 --- a/config/initializers/good_job.rb +++ /dev/null @@ -1,33 +0,0 @@ -Rails.application.configure do - config.good_job.enable_cron = true - - if ENV["UPGRADES_ENABLED"] == "true" - config.good_job.cron = { - auto_upgrade: { - cron: "every 2 minutes", - class: "AutoUpgradeJob", - description: "Check for new versions of the app and upgrade if necessary" - } - } - end - - config.good_job.on_thread_error = ->(exception) { Rails.error.report(exception) } - - # 7 dedicated queue threads + 5 catch-all threads + 3 for job listener, cron, executor = 15 threads allocated - # `latency_low` queue for jobs ~30s - # `latency_medium` queue for jobs ~1-2 min - # `latency_high` queue for jobs ~5+ min - config.good_job.queues = "latency_low:2;latency_low,latency_medium:3;latency_low,latency_medium,latency_high:2;*" - - # Auth for jobs admin dashboard - ActiveSupport.on_load(:good_job_application_controller) do - before_action do - raise ActionController::RoutingError.new("Not Found") unless current_user&.super_admin? || Rails.env.development? - end - - def current_user - session = Session.find_by(id: cookies.signed[:session_token]) - session&.user - end - end -end diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb new file mode 100644 index 00000000..1209a4fa --- /dev/null +++ b/config/initializers/sidekiq.rb @@ -0,0 +1,9 @@ +require "sidekiq/web" + +Sidekiq::Web.use(Rack::Auth::Basic) do |username, password| + configured_username = ::Digest::SHA256.hexdigest(ENV.fetch("SIDEKIQ_WEB_USERNAME", "maybe")) + configured_password = ::Digest::SHA256.hexdigest(ENV.fetch("SIDEKIQ_WEB_PASSWORD", "maybe")) + + ActiveSupport::SecurityUtils.secure_compare(::Digest::SHA256.hexdigest(username), configured_username) && + ActiveSupport::SecurityUtils.secure_compare(::Digest::SHA256.hexdigest(password), configured_password) +end diff --git a/config/locales/models/upgrader/en.yml b/config/locales/models/upgrader/en.yml deleted file mode 100644 index 6a655717..00000000 --- a/config/locales/models/upgrader/en.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -en: - upgrader: - deployer: - null_deployer: - success_message: 'No-op: null deployer initiated deploy successfully' - render: - deploy_log_error: 'Failed to deploy %{type} %{commit_sha} to Render: %{error_message}' - deploy_log_info: Deploying %{type} %{commit_sha} to Render... - error_message_failed_deploy: Failed to deploy to Render - error_message_not_set: Render deploy hook URL is not set - success_message: 'Triggered deployment to Render for commit: %{commit_sha}' - troubleshooting_url: https://render.com/docs/deploy-hooks diff --git a/config/locales/views/settings/hostings/en.yml b/config/locales/views/settings/hostings/en.yml index bbcb8ee9..7377c492 100644 --- a/config/locales/views/settings/hostings/en.yml +++ b/config/locales/views/settings/hostings/en.yml @@ -11,11 +11,6 @@ en: generate_tokens: Generate new code generated_tokens: Generated codes title: Require invite code for signup - provider_settings: - description: Configure settings for your hosting provider - render_deploy_hook_label: Render Deploy Hook URL - render_deploy_hook_placeholder: https://api.render.com/deploy/srv-xyz... - title: Provider Settings show: general: General Settings invites: Invite Codes @@ -38,14 +33,4 @@ en: success: Settings updated clear_cache: cache_cleared: Data cache has been cleared. This may take a few moments to complete. - upgrade_settings: - description: Configure how your application receives updates - latest_commit_description: Automatically update to the latest commit (unstable) - latest_commit_title: Latest Commit - latest_release_description: Automatically update to the most recent release - (stable) - latest_release_title: Latest Release - manual_description: You control when to download and install updates - manual_title: Manual - title: Auto Upgrade not_authorized: You are not authorized to perform this action diff --git a/config/locales/views/shared/en.yml b/config/locales/views/shared/en.yml index 509cbd41..cb632738 100644 --- a/config/locales/views/shared/en.yml +++ b/config/locales/views/shared/en.yml @@ -10,8 +10,3 @@ en: label: Amount syncing_notice: syncing: Syncing accounts data... - upgrade_notification: - app_upgraded: The app has been upgraded to %{version}. - dismiss: Dismiss - new_version_available: A new version of Maybe is available for upgrade. - upgrade_now: Upgrade Now diff --git a/config/locales/views/upgrades/en.yml b/config/locales/views/upgrades/en.yml deleted file mode 100644 index b6dd9708..00000000 --- a/config/locales/views/upgrades/en.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -en: - upgrades: - acknowledge: - upgrade_complete_dismiss: We hope you enjoy the new features! - upgrade_dismissed: Upgrade dismissed - upgrade_not_available: Upgrade not available - upgrade_not_found: Upgrade not found - deploy: - upgrade_not_found: Upgrade not found diff --git a/config/routes.rb b/config/routes.rb index da875dce..92845bc1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,5 @@ +require "sidekiq/web" + Rails.application.routes.draw do # MFA routes resource :mfa, controller: "mfa", only: [ :new, :create ] do @@ -6,7 +8,8 @@ Rails.application.routes.draw do delete :disable end - mount GoodJob::Engine => "good_job" + # Uses basic auth - see config/initializers/sidekiq.rb + mount Sidekiq::Web => "/sidekiq" get "changelog", to: "pages#changelog" get "feedback", to: "pages#feedback" @@ -158,14 +161,6 @@ Rails.application.routes.draw do get :accept, on: :member end - # For managing self-hosted upgrades and release notifications - resources :upgrades, only: [] do - member do - post :acknowledge - post :deploy - end - end - resources :currencies, only: %i[show] resources :impersonation_sessions, only: [ :create ] do diff --git a/config/sidekiq.yml b/config/sidekiq.yml new file mode 100644 index 00000000..8d519d57 --- /dev/null +++ b/config/sidekiq.yml @@ -0,0 +1,5 @@ +concurrency: <%= ENV.fetch("RAILS_MAX_THREADS") { 3 } %> +queues: + - [high_priority, 7] + - [medium_priority, 2] + - [low_priority, 1] diff --git a/config/storage.yml b/config/storage.yml index 6c92b2ba..c6acb48e 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -22,16 +22,4 @@ cloudflare: bucket: <%= ENV['CLOUDFLARE_BUCKET'] %> request_checksum_calculation: "when_required" response_checksum_validation: "when_required" - -# Removed in #702. Uncomment, add gems, update .env.example to enable. -#google: -# service: GCS -# project: <%#= ENV["GCS_PROJECT"] %> -# credentials: <%#= Rails.root.join("gcp-storage-keyfile.json") %> -# bucket: <%#= ENV["GCS_BUCKET"] %> - -#azure: -# service: AzureStorage -# storage_account_name: <%#= ENV["AZURE_STORAGE_ACCOUNT_NAME"] %> -# storage_access_key: <%#= ENV["AZURE_STORAGE_ACCESS_KEY"] %> -# container: <%#= ENV["AZURE_STORAGE_CONTAINER"] %> + diff --git a/db/migrate/20241022170439_create_stock_exchanges.rb b/db/migrate/20241022170439_create_stock_exchanges.rb index f2e6ff5b..5eee20e4 100644 --- a/db/migrate/20241022170439_create_stock_exchanges.rb +++ b/db/migrate/20241022170439_create_stock_exchanges.rb @@ -20,11 +20,5 @@ class CreateStockExchanges < ActiveRecord::Migration[7.2] add_index :stock_exchanges, :country add_index :stock_exchanges, :country_code add_index :stock_exchanges, :currency_code - - reversible do |dir| - dir.up do - load Rails.root.join('db/seeds/exchanges.rb') - end - end end end diff --git a/db/migrate/20250318212559_remove_good_job.rb b/db/migrate/20250318212559_remove_good_job.rb new file mode 100644 index 00000000..e3b79eb6 --- /dev/null +++ b/db/migrate/20250318212559_remove_good_job.rb @@ -0,0 +1,14 @@ +class RemoveGoodJob < ActiveRecord::Migration[7.2] + def up + drop_table :good_job_batches + drop_table :good_job_executions + drop_table :good_job_processes + drop_table :good_job_settings + drop_table :good_jobs + end + + def down + # Add the tables back if needed - see schema.rb for the full table definitions + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20250319145426_remove_self_host_upgrades.rb b/db/migrate/20250319145426_remove_self_host_upgrades.rb new file mode 100644 index 00000000..a69cd79a --- /dev/null +++ b/db/migrate/20250319145426_remove_self_host_upgrades.rb @@ -0,0 +1,6 @@ +class RemoveSelfHostUpgrades < ActiveRecord::Migration[7.2] + def change + remove_column :users, :last_prompted_upgrade_commit_sha + remove_column :users, :last_alerted_upgrade_commit_sha + end +end diff --git a/db/schema.rb b/db/schema.rb index abbaacf5..7f30fe84 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2025_03_16_122019) do +ActiveRecord::Schema[7.2].define(version: 2025_03_19_145426) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -244,94 +244,6 @@ ActiveRecord::Schema[7.2].define(version: 2025_03_16_122019) do t.boolean "data_enrichment_enabled", default: false end - create_table "good_job_batches", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.text "description" - t.jsonb "serialized_properties" - t.text "on_finish" - t.text "on_success" - t.text "on_discard" - t.text "callback_queue_name" - t.integer "callback_priority" - t.datetime "enqueued_at" - t.datetime "discarded_at" - t.datetime "finished_at" - end - - create_table "good_job_executions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.uuid "active_job_id", null: false - t.text "job_class" - t.text "queue_name" - t.jsonb "serialized_params" - t.datetime "scheduled_at" - t.datetime "finished_at" - t.text "error" - t.integer "error_event", limit: 2 - t.text "error_backtrace", array: true - t.uuid "process_id" - t.interval "duration" - t.index ["active_job_id", "created_at"], name: "index_good_job_executions_on_active_job_id_and_created_at" - t.index ["process_id", "created_at"], name: "index_good_job_executions_on_process_id_and_created_at" - end - - create_table "good_job_processes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.jsonb "state" - t.integer "lock_type", limit: 2 - end - - create_table "good_job_settings", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.text "key" - t.jsonb "value" - t.index ["key"], name: "index_good_job_settings_on_key", unique: true - end - - create_table "good_jobs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| - t.text "queue_name" - t.integer "priority" - t.jsonb "serialized_params" - t.datetime "scheduled_at" - t.datetime "performed_at" - t.datetime "finished_at" - t.text "error" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.uuid "active_job_id" - t.text "concurrency_key" - t.text "cron_key" - t.uuid "retried_good_job_id" - t.datetime "cron_at" - t.uuid "batch_id" - t.uuid "batch_callback_id" - t.boolean "is_discrete" - t.integer "executions_count" - t.text "job_class" - t.integer "error_event", limit: 2 - t.text "labels", array: true - t.uuid "locked_by_id" - t.datetime "locked_at" - t.index ["active_job_id", "created_at"], name: "index_good_jobs_on_active_job_id_and_created_at" - t.index ["batch_callback_id"], name: "index_good_jobs_on_batch_callback_id", where: "(batch_callback_id IS NOT NULL)" - t.index ["batch_id"], name: "index_good_jobs_on_batch_id", where: "(batch_id IS NOT NULL)" - t.index ["concurrency_key"], name: "index_good_jobs_on_concurrency_key_when_unfinished", where: "(finished_at IS NULL)" - t.index ["cron_key", "created_at"], name: "index_good_jobs_on_cron_key_and_created_at_cond", where: "(cron_key IS NOT NULL)" - t.index ["cron_key", "cron_at"], name: "index_good_jobs_on_cron_key_and_cron_at_cond", unique: true, where: "(cron_key IS NOT NULL)" - t.index ["finished_at"], name: "index_good_jobs_jobs_on_finished_at", where: "((retried_good_job_id IS NULL) AND (finished_at IS NOT NULL))" - t.index ["labels"], name: "index_good_jobs_on_labels", where: "(labels IS NOT NULL)", using: :gin - t.index ["locked_by_id"], name: "index_good_jobs_on_locked_by_id", where: "(locked_by_id IS NOT NULL)" - t.index ["priority", "created_at"], name: "index_good_job_jobs_for_candidate_lookup", where: "(finished_at IS NULL)" - t.index ["priority", "created_at"], name: "index_good_jobs_jobs_on_priority_created_at_when_unfinished", order: { priority: "DESC NULLS LAST" }, where: "(finished_at IS NULL)" - t.index ["priority", "scheduled_at"], name: "index_good_jobs_on_priority_scheduled_at_unfinished_unlocked", where: "((finished_at IS NULL) AND (locked_by_id IS NULL))" - t.index ["queue_name", "scheduled_at"], name: "index_good_jobs_on_queue_name_and_scheduled_at", where: "(finished_at IS NULL)" - t.index ["scheduled_at"], name: "index_good_jobs_on_scheduled_at", where: "(finished_at IS NULL)" - end - create_table "impersonation_session_logs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "impersonation_session_id", null: false t.string "controller" @@ -652,8 +564,6 @@ ActiveRecord::Schema[7.2].define(version: 2025_03_16_122019) do t.string "password_digest" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.string "last_prompted_upgrade_commit_sha" - t.string "last_alerted_upgrade_commit_sha" t.string "role", default: "member", null: false t.boolean "active", default: true, null: false t.datetime "onboarded_at" diff --git a/db/seeds/.keep b/db/seeds/.keep new file mode 100644 index 00000000..e69de29b diff --git a/db/seeds/exchanges.rb b/db/seeds/exchanges.rb deleted file mode 100644 index 3f5cc39f..00000000 --- a/db/seeds/exchanges.rb +++ /dev/null @@ -1,36 +0,0 @@ -# Load exchanges from YAML configuration -exchanges_config = YAML.safe_load( - File.read(Rails.root.join('config', 'exchanges.yml')), - permitted_classes: [], - permitted_symbols: [], - aliases: true -) - -exchanges_config.each do |exchange| - next unless exchange['mic'].present? # Skip any invalid entries - - StockExchange.find_or_create_by!(mic: exchange['mic']) do |ex| - ex.name = exchange['name'] - ex.acronym = exchange['acronym'] - ex.country = exchange['country'] - ex.country_code = exchange['country_code'] - ex.city = exchange['city'] - ex.website = exchange['website'] - - # Timezone details - if exchange['timezone'] - ex.timezone_name = exchange['timezone']['timezone'] - ex.timezone_abbr = exchange['timezone']['abbr'] - ex.timezone_abbr_dst = exchange['timezone']['abbr_dst'] - end - - # Currency details - if exchange['currency'] - ex.currency_code = exchange['currency']['code'] - ex.currency_symbol = exchange['currency']['symbol'] - ex.currency_name = exchange['currency']['name'] - end - end -end - -puts "Created #{StockExchange.count} stock exchanges" diff --git a/docker-compose.example.yml b/docker-compose.example.yml deleted file mode 100644 index 683d35de..00000000 --- a/docker-compose.example.yml +++ /dev/null @@ -1,74 +0,0 @@ -# =========================================================================== -# Example Docker Compose file -# =========================================================================== -# -# Purpose: -# -------- -# -# This file is an example Docker Compose configuration for self hosting -# Maybe on your local machine or on a cloud VPS. -# -# The configuration below is a "standard" setup, but may require modification -# for your specific environment. -# -# Setup: -# ------ -# -# To run this, you should read the setup guide: -# -# https://github.com/maybe-finance/maybe/blob/main/docs/hosting/docker.md -# -# Troubleshooting: -# ---------------- -# -# If you run into problems, you should open a Discussion here: -# -# https://github.com/maybe-finance/maybe/discussions/categories/general -# - -services: - - app: - image: ghcr.io/maybe-finance/maybe:latest - - volumes: - - app-storage:/rails/storage - - ports: - - 3000:3000 - - restart: unless-stopped - - environment: - SELF_HOSTED: "true" - RAILS_FORCE_SSL: "false" - RAILS_ASSUME_SSL: "false" - GOOD_JOB_EXECUTION_MODE: async - SECRET_KEY_BASE: ${SECRET_KEY_BASE:?} - DB_HOST: postgres - POSTGRES_DB: ${POSTGRES_DB:-maybe_production} - POSTGRES_USER: ${POSTGRES_USER:-maybe_user} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?} - - depends_on: - postgres: - condition: service_healthy - - postgres: - image: postgres:16 - restart: unless-stopped - volumes: - - postgres-data:/var/lib/postgresql/data - environment: - POSTGRES_USER: ${POSTGRES_USER:-maybe_user} - POSTGRES_DB: ${POSTGRES_DB:-maybe_production} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?} - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB" ] - interval: 5s - timeout: 5s - retries: 5 - -volumes: - app-storage: - postgres-data: \ No newline at end of file diff --git a/docs/hosting/docker.md b/docs/hosting/docker.md index c112f42d..940a685f 100644 --- a/docs/hosting/docker.md +++ b/docs/hosting/docker.md @@ -2,10 +2,6 @@ This guide will help you setup, update, and maintain your self-hosted Maybe application with Docker Compose. Docker Compose is the most popular and recommended way to self-host the Maybe app. -If you want a _less -technical_ way to host the Maybe app, you can [host on Render](/docs/hosting/one-click-deploy.md) as an -_**alternative** to Docker Compose_. - ## Setup Guide Follow the guide below to get your app running. @@ -30,7 +26,7 @@ docker run hello-world Open your terminal and create a directory where your app will run. Below is an example command with a recommended directory: ```bash -# Create a directory on your computer for Docker files +# Create a directory on your computer for Docker files (name whatever you'd like) mkdir -p ~/docker-apps/maybe # Once created, navigate your current working directory to the new folder @@ -42,8 +38,8 @@ cd ~/docker-apps/maybe Make sure you are in the directory you just created and run the following command: ```bash -# Download the sample docker-compose.yml file from the Maybe Github repository -curl -o compose.yml https://raw.githubusercontent.com/maybe-finance/maybe/main/docker-compose.example.yml +# Download the sample compose.yml file from the Maybe Github repository +curl -o compose.yml https://raw.githubusercontent.com/maybe-finance/maybe/main/compose.example.yml ``` This command will do the following: @@ -53,6 +49,12 @@ This command will do the following: At this point, the only file in your current working directory should be `compose.yml`. +### Step 3 (optional): Configure your environment + +By default, our `compose.example.yml` file runs without any configuration. That said, if you would like extra security (important if you're running outside of a local network), you can follow the steps below to set things up. + +If you're running the app locally and don't care much about security, you can skip this step. + #### Create your environment file In order to configure the app, you will need to create a file called `.env`, which is where Docker will read environment variables from. @@ -92,7 +94,7 @@ SECRET_KEY_BASE="replacemewiththegeneratedstringfromthepriorstep" POSTGRES_PASSWORD="replacemewithyourdesireddatabasepassword" ``` -### Step 3: Test your app +### Step 4: Run the app You are now ready to run the app. Start with the following command to make sure everything is working: @@ -106,14 +108,14 @@ Open your browser, and navigate to `http://localhost:3000`. If everything is working, you will see the Maybe login screen. -### Step 4: Create your account +### Step 5: Create your account The first time you run the app, you will need to register a new account by hitting "create your account" on the login page. 1. Enter your email 2. Enter a password -### Step 5: Run the app in the background +### Step 6: Run the app in the background Most self-hosting users will want the Maybe app to run in the background on their computer so they can access it at all times. To do this, hit `Ctrl+C` to stop the running process, and then run the following command: @@ -127,7 +129,7 @@ The `-d` flag will run Docker Compose in "detached" mode. To verify it is runnin docker compose ls ``` -### Step 6: Enjoy! +### Step 7: Enjoy! Your app is now set up. You can visit it at `http://localhost:3000` in your browser. @@ -135,7 +137,7 @@ If you find bugs or have a feature request, be sure to read through our [contrib ## How to update your app -The mechanism that updates your self-hosted Maybe app is the GHCR (Github Container Registry) Docker image that you see in the `docker-compose.yml` file: +The mechanism that updates your self-hosted Maybe app is the GHCR (Github Container Registry) Docker image that you see in the `compose.yml` file: ```yml image: ghcr.io/maybe-finance/maybe:latest @@ -152,13 +154,13 @@ NOT_ automatically update. To update your self-hosted app, run the following com ```bash cd ~/docker-apps/maybe # Navigate to whatever directory you configured the app in docker compose pull # This pulls the "latest" published image from GHCR -docker compose build app # This rebuilds the app with updates +docker compose build # This rebuilds the app with updates docker compose up --no-deps -d app # This restarts the app using the newest version ``` ## How to change which updates your app receives -If you'd like to pin the app to a specific version or tag, all you need to do is edit the `docker-compose.yml` file: +If you'd like to pin the app to a specific version or tag, all you need to do is edit the `compose.yml` file: ```yml image: ghcr.io/maybe-finance/maybe:stable @@ -168,7 +170,7 @@ After doing this, make sure and restart the app: ```bash docker compose pull # This pulls the "latest" published image from GHCR -docker compose build app # This rebuilds the app with updates +docker compose build # This rebuilds the app with updates docker compose up --no-deps -d app # This restarts the app using the newest version ``` diff --git a/docs/hosting/one-click-deploy.md b/docs/hosting/one-click-deploy.md deleted file mode 100644 index 629f87fb..00000000 --- a/docs/hosting/one-click-deploy.md +++ /dev/null @@ -1,90 +0,0 @@ -# Deploy Maybe in One Click - -Below are our "one-click deploy" options for running Maybe in the cloud: - -## Render - -Welcome to the one-click deploy guide for Maybe on [Render](https://render.com/)! - -Render is a hosting platform with a generous free tier and makes it easy to get -started with Maybe: - -- Getting started is FREE -- Up and running in <5 minutes -- Your Maybe app is automatically deployed to a live URL - -### Estimated Costs - -- FREE to _get up and running_ -- $7 per month for a basic app (Render requires you to upgrade your database to - keep using it) -- $14+ per month for optimal performance - -_**IMPORTANT:** if you plan to host Maybe on Render long-term, you MUST upgrade -your database to a paid Render service._ - -### Instructions - -#### Step 1: Create Render Blueprint - - -Deploy to Render - - -1. Click the button above. -2. Sign in or create your account with Render (FREE) -3. Give your blueprint a name (we suggest `Maybe`) -4. Select the `main` branch -5. You should see a section at the bottom with a "Key:Value" field - for `SECRET_KEY_BASE`. Do NOT click "generate". -6. On your computer, open a terminal and make sure you have - the [openssl](https://github.com/openssl/openssl) utility installed on your - computer. You can run `openssl --version` to verify it is installed. -7. Generate your `SECRET_KEY_BASE` by running the following command in your - terminal: `openssl rand -hex 64` ([docs](https://www.openssl.org/docs/man1.1.1/man1/rand.html)). -8. Do NOT share this value with anyone. -9. Go back to your browser and paste this value in the "Value" field - for `SECRET_KEY_BASE` -10. Click "Apply". This will take a few minutes. -11. Once complete, click on the `maybe` "Web Service". You should see a custom - URL in the format `https://maybe-abcd.onrender.com`. Click on it, and you'll - see your running Maybe app! - -#### Step 2: Add your deploy hook for auto-updates - -To get new releases, you will need to add your deploy hook to the app. - -1. Click on the `maybe` "Web Service" -2. Click "Settings" -3. Scroll down to the end of the "Build and Deploy" section until you find the " - Deploy Hook" -4. Copy this value -5. Open your new Maybe app, click your profile, click "Self Host Settings" -6. Paste your deploy hook in the settings and save -7. You're all set! - -#### Step 3 (IMPORTANT!!!): Upgrade your Render services - -By default, we set you up with a FREE Render web service and a FREE postgres -database. We do this for a few reasons: - -- It allows you to take self-hosted Maybe for a FREE test-drive -- It prevents newcomers from incurring unexpected hosting charges - -##### Upgrade your Database (REQUIRED) - -All FREE Render databases **will be deleted after a few months**. This means -that **you will lose all of your Maybe data**. - -**To avoid losing data, you MUST upgrade your Render database** (a "starter" -instance is $7/month) - -You can upgrade your instance directly in the Render dashboard. - -##### Upgrade your Web Service (RECOMMENDED) - -All FREE Render web services use a small amount of memory and "sleep" after -periods of inactivity. - -For the _fastest_ Maybe experience, you should upgrade your web service (a " -starter" instance is $7/month) diff --git a/render.yaml b/render.yaml deleted file mode 100644 index e527a335..00000000 --- a/render.yaml +++ /dev/null @@ -1,60 +0,0 @@ -databases: - - name: maybe - user: maybe - plan: free - -services: - - type: web - plan: free - autoDeploy: false - runtime: ruby - name: maybe - repo: https://github.com/maybe-finance/maybe.git - branch: main - healthCheckPath: /up - buildCommand: "./bin/render-build.sh" - - # Uncomment if you are on a paid plan, and remove RUN_DB_MIGRATIONS_IN_BUILD_STEP from below - # preDeployCommand: "bundle exec rails db:migrate" - - startCommand: "bundle exec rails server" - envVars: - - key: DATABASE_URL - fromDatabase: - name: maybe - property: connectionString - - - key: SELF_HOSTED - value: true - - key: HOSTING_PLATFORM - value: render - - # Since the app is self-hosted, we cannot use master.key to encrypt credentials. App depends entirely on ENV variables - # https://api.rubyonrails.org/v7.1.3.2/classes/Rails/Application.html#method-i-secret_key_base - # - # To generate this, run: `openssl rand -hex 64` or `rails secret` - - key: SECRET_KEY_BASE - sync: false - - - key: WEB_CONCURRENCY - value: 2 - - key: GOOD_JOB_EXECUTION_MODE - value: async # Typically, `external` is used in prod, but this avoids another cron service and is generally fine for a self-hoster given low traffic - - # The app uses this info to know which repo to fetch latest commit data from for upgrades - # This should MATCH the `repo` and `branch` keys in the config above ALWAYS - - key: GITHUB_REPO_OWNER - value: maybe-finance - - key: GITHUB_REPO_NAME - value: maybe - - key: GITHUB_REPO_BRANCH - value: main - - # Required to allow your self-hosted instance to be able to upgrade itself - - key: UPGRADES_ENABLED - value: true - - # If you upgrade your instance to a paid plan, you can set this to false (or remove it) - # See note in `render-build.sh` script. - - key: RUN_DB_MIGRATIONS_IN_BUILD_STEP - value: true diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 1ea37ca7..b0e91f62 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -37,17 +37,6 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest assert_nil Session.find_by(id: session_record.id) end - test "super admins can access the jobs page" do - sign_in users(:maybe_support_staff) - get good_job_url - assert_redirected_to "http://www.example.com/good_job/jobs?locale=en" - end - - test "non-super admins cannot access the jobs page" do - get good_job_url - assert_response :not_found - end - test "redirects to MFA verification when MFA enabled" do @user.setup_mfa! @user.enable_mfa! diff --git a/test/controllers/settings/hostings_controller_test.rb b/test/controllers/settings/hostings_controller_test.rb index 2e092952..48213260 100644 --- a/test/controllers/settings/hostings_controller_test.rb +++ b/test/controllers/settings/hostings_controller_test.rb @@ -25,7 +25,7 @@ class Settings::HostingsControllerTest < ActionDispatch::IntegrationTest end assert_raises(RuntimeError, "Settings not available on non-self-hosted instance") do - patch settings_hosting_url, params: { setting: { render_deploy_hook: "https://example.com" } } + patch settings_hosting_url, params: { setting: { require_invite_for_signup: true } } end end @@ -40,25 +40,11 @@ class Settings::HostingsControllerTest < ActionDispatch::IntegrationTest test "can update settings when self hosting is enabled" do with_self_hosting do - NEW_RENDER_DEPLOY_HOOK = "https://api.render.com/deploy/srv-abc123" - assert_nil Setting.render_deploy_hook + assert_nil Setting.synth_api_key - patch settings_hosting_url, params: { setting: { render_deploy_hook: NEW_RENDER_DEPLOY_HOOK } } + patch settings_hosting_url, params: { setting: { synth_api_key: "1234567890" } } - assert_equal NEW_RENDER_DEPLOY_HOOK, Setting.render_deploy_hook - end - end - - test "can choose auto upgrades mode with a deploy hook" do - with_self_hosting do - NEW_RENDER_DEPLOY_HOOK = "https://api.render.com/deploy/srv-abc123" - assert_nil Setting.render_deploy_hook - - patch settings_hosting_url, params: { setting: { render_deploy_hook: NEW_RENDER_DEPLOY_HOOK, upgrades_setting: "release" } } - - assert_equal "auto", Setting.upgrades_mode - assert_equal "release", Setting.upgrades_target - assert_equal NEW_RENDER_DEPLOY_HOOK, Setting.render_deploy_hook + assert_equal "1234567890", Setting.synth_api_key end end diff --git a/test/controllers/upgrades_controller_test.rb b/test/controllers/upgrades_controller_test.rb deleted file mode 100644 index c5978488..00000000 --- a/test/controllers/upgrades_controller_test.rb +++ /dev/null @@ -1,89 +0,0 @@ -require "test_helper" - -class UpgradesControllerTest < ActionDispatch::IntegrationTest - setup do - sign_in @user = users(:family_admin) - - @completed_upgrade = Upgrader::Upgrade.new( - "commit", - commit_sha: "47bb430954292d2fdcc81082af731a16b9587da3", - version: Semver.new("0.0.0"), - url: "" - ) - - @completed_upgrade.stubs(:complete?).returns(true) - @completed_upgrade.stubs(:available?).returns(false) - - @available_upgrade = Upgrader::Upgrade.new( - "commit", - commit_sha: "47bb430954292d2fdcc81082af731a16b9587da4", - version: Semver.new("0.1.0"), - url: "" - ) - - @available_upgrade.stubs(:available?).returns(true) - @available_upgrade.stubs(:complete?).returns(false) - end - - test "controller not available when upgrades are disabled" do - MOCK_COMMIT = "47bb430954292d2fdcc81082af731a16b9587da3" - - post acknowledge_upgrade_url(MOCK_COMMIT) - assert_response :not_found - - post deploy_upgrade_url(MOCK_COMMIT) - assert_response :not_found - end - - test "should acknowledge an upgrade prompt" do - with_env_overrides UPGRADES_ENABLED: "true" do - Upgrader.stubs(:find_upgrade).returns(@available_upgrade) - - post acknowledge_upgrade_url(@available_upgrade.commit_sha) - - @user.reload - assert_equal @user.last_prompted_upgrade_commit_sha, @available_upgrade.commit_sha - assert :redirect - end - end - - test "should acknowledge an upgrade alert" do - with_env_overrides UPGRADES_ENABLED: "true" do - Upgrader.stubs(:find_upgrade).returns(@completed_upgrade) - - post acknowledge_upgrade_url(@completed_upgrade.commit_sha) - - @user.reload - assert_equal @user.last_alerted_upgrade_commit_sha, @completed_upgrade.commit_sha - assert :redirect - end - end - - test "should deploy an upgrade" do - with_env_overrides UPGRADES_ENABLED: "true" do - Upgrader.stubs(:find_upgrade).returns(@available_upgrade) - - post deploy_upgrade_path(@available_upgrade.commit_sha) - - @user.reload - assert_equal @user.last_prompted_upgrade_commit_sha, @available_upgrade.commit_sha - assert :redirect - end - end - - test "should rollback user state if upgrade fails" do - with_env_overrides UPGRADES_ENABLED: "true" do - PRIOR_COMMIT = "47bb430954292d2fdcc81082af731a16b9587da2" - @user.update!(last_prompted_upgrade_commit_sha: PRIOR_COMMIT) - - Upgrader.stubs(:find_upgrade).returns(@available_upgrade) - Upgrader.stubs(:upgrade_to).returns({ success: false }) - - post deploy_upgrade_path(@available_upgrade.commit_sha) - - @user.reload - assert_equal @user.last_prompted_upgrade_commit_sha, PRIOR_COMMIT - assert :redirect - end - end -end diff --git a/test/interfaces/git_repository_provider_interface_test.rb b/test/interfaces/git_repository_provider_interface_test.rb deleted file mode 100644 index 2b0dff8e..00000000 --- a/test/interfaces/git_repository_provider_interface_test.rb +++ /dev/null @@ -1,25 +0,0 @@ -require "test_helper" - -module GitRepositoryProviderInterfaceTest - extend ActiveSupport::Testing::Declarative - - test "git repository provider interface" do - assert_respond_to @subject, :fetch_latest_upgrade_candidates - end - - test "git repository provider response contract" do - VCR.use_cassette "git_repository_provider/fetch_latest_upgrade_candidates" do - response = @subject.fetch_latest_upgrade_candidates - - assert_valid_upgrade_candidate(response[:release]) - assert_valid_upgrade_candidate(response[:commit]) - end - end - - private - def assert_valid_upgrade_candidate(candidate) - assert_equal Semver, candidate[:version].class - assert_match URI::DEFAULT_PARSER.make_regexp, candidate[:url] - assert_match(/\A[0-9a-f]{40}\z/, candidate[:commit_sha]) - end -end diff --git a/test/jobs/auto_upgrade_job_test.rb b/test/jobs/auto_upgrade_job_test.rb deleted file mode 100644 index d68aa2a1..00000000 --- a/test/jobs/auto_upgrade_job_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require "test_helper" - -class AutoUpgradeJobTest < ActiveJob::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/provider/github_test.rb b/test/models/provider/github_test.rb deleted file mode 100644 index 6e425bf2..00000000 --- a/test/models/provider/github_test.rb +++ /dev/null @@ -1,9 +0,0 @@ -require "test_helper" - -class Provider::GithubTest < ActiveSupport::TestCase - include GitRepositoryProviderInterfaceTest - - setup do - @subject = Provider::Github.new(owner: "rails", name: "rails", branch: "main") - end -end diff --git a/test/models/upgrader/upgrade_test.rb b/test/models/upgrader/upgrade_test.rb deleted file mode 100644 index cf99ed7c..00000000 --- a/test/models/upgrader/upgrade_test.rb +++ /dev/null @@ -1,36 +0,0 @@ -require "test_helper" - -class UpgradeTest < ActiveSupport::TestCase - setup do - data = { - commit_sha: "latestcommit", - version: Semver.new("0.1.0-alpha.2") - } - - @commit_upgrade = Upgrader::Upgrade.new "commit", data - @release_upgrade = Upgrader::Upgrade.new "release", data - end - - test "available if latest commit and app not upgraded" do - Maybe.stubs(:version).returns(@commit_upgrade.version) - Maybe.stubs(:commit_sha).returns("outdatedcommitsha") - - assert @commit_upgrade.available? - assert_not @release_upgrade.available? - end - - test "available if latest release and app not upgraded" do - Maybe.stubs(:version).returns(Semver.new("0.1.0-alpha.1")) - Maybe.stubs(:commit_sha).returns("outdatedcommitsha") - - assert @commit_upgrade.available? - assert @release_upgrade.available? - end - - test "not available if app commit greater or equal to" do - Maybe.stubs(:version).returns(@commit_upgrade.version) - Maybe.stubs(:commit_sha).returns(@commit_upgrade.commit_sha) - - assert_not @commit_upgrade.available? - end -end diff --git a/test/models/upgrader_test.rb b/test/models/upgrader_test.rb deleted file mode 100644 index 6bad83ff..00000000 --- a/test/models/upgrader_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require "test_helper" - -class UpgraderTest < ActiveSupport::TestCase - PRIOR_COMMIT = "47bb430954292d2fdcc81082af731a16b9587da2" - CURRENT_COMMIT = "47bb430954292d2fdcc81082af731a16b9587da3" - NEXT_COMMIT = "47bb430954292d2fdcc81082af731a16b9587da4" - - PRIOR_VERSION = Semver.new("0.1.0-alpha.3") - CURRENT_VERSION = Semver.new("0.1.0-alpha.4") - NEXT_VERSION = Semver.new("0.1.0-alpha.5") - - # Default setup assumes app is up to date - setup do - Upgrader.config = Upgrader::Config.new({ mode: :enabled }) - - Maybe.stubs(:version).returns(CURRENT_VERSION) - Maybe.stubs(:commit_sha).returns(CURRENT_COMMIT) - - stub_github_data( - commit: create_upgrade_stub(CURRENT_VERSION, CURRENT_COMMIT), - release: create_upgrade_stub(CURRENT_VERSION, CURRENT_COMMIT) - ) - end - - test "finds 1 completed upgrade, 0 available upgrades when app is up to date" do - assert_instance_of Upgrader::Upgrade, Upgrader.completed_upgrade - assert_nil Upgrader.available_upgrade - end - - test "finds 1 available and 1 completed upgrade when app is on latest release but behind latest commit" do - stub_github_data( - commit: create_upgrade_stub(CURRENT_VERSION, NEXT_COMMIT), - release: create_upgrade_stub(CURRENT_VERSION, CURRENT_COMMIT) - ) - - assert_instance_of Upgrader::Upgrade, Upgrader.available_upgrade # commit is ahead of release - assert_instance_of Upgrader::Upgrade, Upgrader.completed_upgrade # release is completed - end - - test "when app is behind latest version and latest commit is ahead of release finds release upgrade and no completed upgrades" do - Maybe.stubs(:version).returns(PRIOR_VERSION) - Maybe.stubs(:commit_sha).returns(PRIOR_COMMIT) - - stub_github_data( - commit: create_upgrade_stub(CURRENT_VERSION, NEXT_COMMIT), - release: create_upgrade_stub(CURRENT_VERSION, CURRENT_COMMIT) - ) - - assert_equal "release", Upgrader.available_upgrade.type - assert_nil Upgrader.completed_upgrade - end - - test "defaults to app version when no release is found" do - stub_github_data( - commit: create_upgrade_stub(CURRENT_VERSION, NEXT_COMMIT), - release: nil - ) - - # Upstream is 1 commit ahead, and we assume we're on the same release - assert_equal "commit", Upgrader.available_upgrade.type - end - - test "gracefully handles empty github info" do - Provider::Github.any_instance.stubs(:fetch_latest_upgrade_candidates).returns(nil) - - assert_nil Upgrader.available_upgrade - assert_nil Upgrader.completed_upgrade - end - - test "deployer is null by default" do - Upgrader.config = Upgrader::Config.new({ mode: :enabled }) - Upgrader::Deployer::Null.any_instance.expects(:deploy).with(nil).once - Upgrader.upgrade_to(nil) - end - - private - def create_upgrade_stub(version, commit_sha) - { - version: version, - commit_sha: commit_sha, - url: "" - } - end - - def stub_github_data(commit: create_upgrade_stub(LATEST_VERSION, LATEST_COMMIT), release: create_upgrade_stub(LATEST_VERSION, LATEST_COMMIT)) - Provider::Github.any_instance.stubs(:fetch_latest_upgrade_candidates).returns({ commit:, release: }) - end -end diff --git a/test/vcr_cassettes/git_repository_provider/fetch_latest_release_notes.yml b/test/vcr_cassettes/git_repository_provider/fetch_latest_release_notes.yml index aef67d92..a14b1755 100644 --- a/test/vcr_cassettes/git_repository_provider/fetch_latest_release_notes.yml +++ b/test/vcr_cassettes/git_repository_provider/fetch_latest_release_notes.yml @@ -10,7 +10,7 @@ http_interactions: Accept: - application/vnd.github.v3+json User-Agent: - - Octokit Ruby Gem 9.1.0 + - Octokit Ruby Gem 9.2.0 Content-Type: - application/json Accept-Encoding: @@ -21,7 +21,7 @@ http_interactions: message: OK headers: Date: - - Mon, 09 Sep 2024 20:03:24 GMT + - Wed, 19 Mar 2025 12:40:58 GMT Content-Type: - application/json; charset=utf-8 Cache-Control: @@ -29,7 +29,7 @@ http_interactions: Vary: - Accept,Accept-Encoding, Accept, X-Requested-With Etag: - - W/"17af70a435e3513d63e7fe569e0863ad17c500158f39055d1b1cab704ab54b96" + - W/"cc42fb8190e3219e91e46d75f709c8b5762a1e8bf472008a702a4adf1e7dfb95" X-Github-Media-Type: - github.v3; format=json X-Github-Api-Version-Selected: @@ -55,62 +55,68 @@ http_interactions: - default-src 'none' Server: - github.com + Accept-Ranges: + - bytes X-Ratelimit-Limit: - '60' X-Ratelimit-Remaining: - - '57' + - '59' X-Ratelimit-Reset: - - '1725915804' + - '1742391658' X-Ratelimit-Resource: - core X-Ratelimit-Used: - - '3' - Accept-Ranges: - - bytes - Content-Length: - - '52546' + - '1' + Transfer-Encoding: + - chunked X-Github-Request-Id: - - E979:365B86:C03B37:171BC72:66DF5497 + - DDED:38A4A1:15FB4B:2C2CC0:67DABB5A body: encoding: ASCII-8BIT string: !binary |- - W3sidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MTY4NDg3MCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTcxNjg0ODcwL2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MTY4NDg3MC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjE2IiwiaWQiOjE3MTY4NDg3MCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRLTzdRRyIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjE2IiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjE2IiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wOC0yM1QxNDozOToxNFoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA4LTIzVDE0OjQ0OjE1WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjE2IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTYiLCJib2R5IjoiVGhpcyB3ZWVrJ3MgcmVsZWFzZSBjb21lcyB3aXRoIGEgdmFyaWV0eSBvZiBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgVUkuXHJcblxyXG5BZGRpdGlvbmFsbHksIHVzZXJzIGNhbiBub3cgaW5wdXQgZGV0YWlscyBmb3IgdGhlaXIgcHJvcGVydHkgYW5kIHZlaGljbGUgYWNjb3VudHMgYXMgc2hvd24gaW4gdGhlIHZpZGVvIGJlbG93LiAgSW4gdGhlIG5lYXIgZnV0dXJlLCBNYXliZSB3aWxsIHN1cHBvcnQgZGF0YSBwcm92aWRlcnMgcmVsYXRlZCB0byB0aGUgXCJ2YWx1YXRpb25cIiBvZiBwcm9wZXJ0aWVzIGFuZCB2ZWhpY2xlcyAoaS5lLiBaaWxsb3csIEtCQikuICBXZSB3aWxsIHVzZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB1c2VyIGFjY291bnRzIHRvIGF1dG9tYXRpY2FsbHkgZmV0Y2ggZXN0aW1hdGVkIG1hcmtldCB2YWx1ZXMgZm9yIHRoZXNlIGFzc2V0cyB3aGljaCB3aWxsIHRoZW4gYmUgYWRkZWQgcGVyaW9kaWNhbGx5IGFzIFwiVmFsdWF0aW9uc1wiIGluIHRoZSB2YWx1ZSB0YWIgb2YgZWFjaCBhY2NvdW50LiAgVGhpcyB3aWxsIHRoZW4gc2hvdyB1cCBpbiB0aGUgaGlzdG9yeSBncmFwaCBmb3IgdGhlIGFjY291bnQgYmFsYW5jZS5cclxuXHJcbmh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0cy9mZDc1OWM4Mi1hMjVjLTRjOGQtOGYxNi1mNTc3ZTA0MTBmYjVcclxuXHJcbiMjIFdoYXQncyBDaGFuZ2VkXHJcblxyXG4qIFJlZmFjdG9yOiBBbGxvdyBvdGhlciBpbXBvcnQgZmlsZXMgYnkgQHBlZHJvY2FybW9uYSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwOTlcclxuKiBCdW1wIHNlbnRyeS1ydWJ5IGZyb20gNS4xOC4yIHRvIDUuMTkuMCBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMDhcclxuKiBCdW1wIHN0aW11bHVzLXJhaWxzIGZyb20gMS4zLjMgdG8gMS4zLjQgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTA2XHJcbiogQnVtcCBhd3Mtc2RrLXMzIGZyb20gMS4xNTcuMCB0byAxLjE1OC4wIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEwNVxyXG4qIEJ1bXAgcnVieS1sc3AtcmFpbHMgZnJvbSAwLjMuMTIgdG8gMC4zLjEzIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEwN1xyXG4qIEJ1bXAgcHJvcHNoYWZ0IGZyb20gMC45LjAgdG8gMC45LjEgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTA0XHJcbiogQnVtcCBnb29kX2pvYiBmcm9tIDQuMS4xIHRvIDQuMi4wIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEwMlxyXG4qIEJ1bXAgdGFpbHdpbmRjc3MtcmFpbHMgZnJvbSAyLjcuMiB0byAyLjcuMyBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMDNcclxuKiBGaXggcXVlcnkgd2hlbiBhY2NvdW50IGhhcyB6ZXJvIGluY29tZSBhbmQgZXhwZW5zZSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTEyXHJcbiogRml4IGhvbGRpbmcgbmFtZSBlcnJvciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTEzXHJcbiogQWRkIFByb3BlcnR5IERldGFpbHMgVmlldyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTE2XHJcbiogQmFzaWMgVmVoaWNsZSBWaWV3IGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMTdcclxuKiBSdWJvY29wIHVwZGF0ZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTExOFxyXG4qIEZpeCBmaWxlIHVwbG9hZCBVSSBvcGVuaW5nIHR3aWNlIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMTlcclxuXHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjE1Li4udjAuMS4wLWFscGhhLjE2IiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNzE2ODQ4NzAvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjE5LCIrMSI6OCwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjAsImNvbmZ1c2VkIjowLCJoZWFydCI6MCwicm9ja2V0Ijo5LCJleWVzIjoyfSwibWVudGlvbnNfY291bnQiOjN9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MDY1NTkyNCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTcwNjU1OTI0L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MDY1NTkyNC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjE1IiwiaWQiOjE3MDY1NTkyNCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRLTEFDMCIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjE1IiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjE1IiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wOC0xNlQyMDowOTozN1oiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA4LTE2VDIwOjE4OjIyWiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjE1IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTUiLCJib2R5IjoiVGhpcyB3ZWVrLCB3ZSByZWxlYXNlZCB0aGUgZmlyc3QgdmVyc2lvbiBvZiBhbiBpc3N1ZSB0cmFja2luZyBzeXN0ZW0gZGlyZWN0bHkgd2l0aGluIHRoZSBNYXliZSBhcHAhXHJcblxyXG5XaHk/XHJcblxyXG5BcyBhbiBvcGVuLXNvdXJjZSBwZXJzb25hbCBmaW5hbmNlIGFwcCwgTWF5YmUgaGFzIGEgbXVjaCBsYXJnZXIgXCJzZWxmIHNlcnZpY2VcIiBjb21wb25lbnQgdGhhbiBtb3N0IGFwcGxpY2F0aW9ucy4gIFdoaWxlIHdlJ3JlIGluIHRoZSBlYXJseSBkYXlzLCB0aGUgZ29hbCBpcyB0byBzdXBwb3J0IGEgZ2xvYmFsIHVzZXIgYmFzZSwgd2hpY2ggbWVhbnMgd2UgaGF2ZSB0byBzdXBwb3J0IF9hIGxvdF8gb2YgZGF0YSBwcm92aWRlcnMuXHJcblxyXG5FYWNoIGRhdGEgcHJvdmlkZXIgY29tZXMgd2l0aCBpdHMgb3duIHNldCBvZiBudWFuY2VzIGFuZCBlcnJvcnMgdGhhdCBjYW4gYmUgY2hhbGxlbmdpbmcgdG8gZGVidWc7IGVzcGVjaWFsbHkgZm9yIG91ciBzbWFsbCB0ZWFtIHRoYXQgZG9lc24ndCBoYXZlIGFjY2VzcyB0byB5b3VyIHNlbGYgaG9zdGVkIGNvbmZpZ3VyYXRpb24uICBXaGVuIHRoaW5ncyBnbyB3cm9uZywgdGhlcmUgYXJlIGEgaGFuZGZ1bCBvZiBwb3NzaWJsZSBjYXVzZXMuXHJcblxyXG5JbiBvcmRlciB0byBjb21iYXQgdGhpcywgdGhlIGB2MC4xLjAtYWxwaGEuMTVgIHJlbGVhc2UgaW50cm9kdWNlcyBhIFwic2VsZiByZXNvbHV0aW9uXCIgaXNzdWUgdHJhY2tpbmcgc3lzdGVtLiAgVGhlIHZpZGVvIGJlbG93IGRlbW9uc3RyYXRlcyBob3cgYSB1c2VyIHdobyBoYXMgaW5jb3JyZWN0bHkgY29uZmlndXJlZCB0aGVpciBleGNoYW5nZSByYXRlcyBwcm92aWRlciBjYW4gKippZGVudGlmeSwgZGlhZ25vc2UsIGFuZCBmaXggdGhlIGlzc3VlIGFsbCB3aXRoaW4gdGhlIE1heWJlIGFwcCoqOlxyXG5cclxuaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzLzdjYzk4Yzc5LTliNzItNDI2MC1iYzE3LTkwN2JjMzNiMTM5MFxyXG5cclxuIyMgV2hhdCdzIENoYW5nZWRcclxuKiBEZXBvc2l0LCBXaXRoZHJhd2FsLCBhbmQgSW50ZXJlc3QgVHJhbnNhY3Rpb25zIGZvciBJbnZlc3RtZW50IFZpZXcgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA3NVxyXG4qIEJ1bXAgdGFpbHdpbmRjc3MtcmFpbHMgZnJvbSAyLjYuNSB0byAyLjcuMiBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNzhcclxuKiBCdW1wIGJvb3RzbmFwIGZyb20gMS4xOC4zIHRvIDEuMTguNCBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNzlcclxuKiBCdW1wIHJ1YnktbHNwLXJhaWxzIGZyb20gMC4zLjExIHRvIDAuMy4xMiBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwODFcclxuKiBSZWZhY3RvcjogVXNlIG5hdGl2ZSBlcnJvciBpMThuIGxvb2t1cCBieSBAcGVkcm9jYXJtb25hIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA3NlxyXG4qIEJ1bXAgcmFpbHMgZnJvbSBgNDM1MzBiNGAgdG8gYGY2ZDYyYjVgIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA4M1xyXG4qIEZpeDogaTE4biBzeW1ib2wgdHlwbyBieSBAcGVkcm9jYXJtb25hIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA4NVxyXG4qIEJ1bXAgcnVieSBmcm9tIDMuMy4xIHRvIDMuMy40IGJ5IEBDbHVzdGVyNDQ0IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA4NFxyXG4qIEZpeCBmb3IgaW52YWxpZCBhY2NvdW50YWJsZSBkYXRhIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwODZcclxuKiBhZGQgcGFnaW5hdGlvbiB0byBhY2NvdW50IHRyYW5zYWN0aW9ucyBsaXN0IGJ5IEBjb2RlLWNvbnN0cnVjdG9yIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA5NVxyXG4qIEFjY291bnQgSXNzdWUgTW9kZWwgYW5kIFJlc29sdXRpb24gRmxvdyArIFRyb3VibGVzaG9vdGluZyBndWlkZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA5MFxyXG4qIEFkZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgY29sdW1uIHNlcGFyYXRvciBpbiBjc3YgaW1wb3J0IGxvZ2ljIGJ5IEBjb2RlLWNvbnN0cnVjdG9yIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA5NlxyXG4qIEltcHJvdmVkIFVJIHdhcm5pbmcgc3RhdGVzIGZvciBob2xkaW5ncyB3aXRoIG1pc3NpbmcgZGF0YSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDk4XHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQHBlZHJvY2FybW9uYSBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNzZcclxuKiBAQ2x1c3RlcjQ0NCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwODRcclxuKiBAY29kZS1jb25zdHJ1Y3RvciBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwOTVcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMTQuLi52MC4xLjAtYWxwaGEuMTUiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MDY1NTkyNC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MTEsIisxIjoxMSwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjAsImNvbmZ1c2VkIjowLCJoZWFydCI6MCwicm9ja2V0IjowLCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjV9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2OTU5MTAyOSIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY5NTkxMDI5L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2OTU5MTAyOS9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjE0IiwiaWQiOjE2OTU5MTAyOSwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRLRzhEMSIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjE0IiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjE0IiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wOC0wOVQyMTo0Mjo0OFoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA4LTA5VDIxOjQ5OjIwWiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjE0IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTQiLCJib2R5IjoiQmFzaWMgaW52ZXN0bWVudCBwb3J0Zm9saW9zIGFyZSBoZXJlISDwn6WzIFxyXG5cclxuV2hpbGUgd2UncmUgc3RpbGwgaW4gdGhlIHZlcnkgZWFybHkgZGF5cyBmb3IgaW52ZXN0bWVudCBhY2NvdW50cywgdGhpcyB3ZWVrIGNhcHBlZCBvZmYgc29tZSByZWFsbHkgaW1wb3J0YW50IGFkZGl0aW9ucyB0byB0aGUgaW52ZXN0bWVudCBhY2NvdW50IHBhZ2Ugdmlldy5cclxuXHJcblVzZXJzIGNhbiBub3c6XHJcblxyXG4tIFNlZSBhIGJyZWFrZG93biBvZiB0aGVpciBjYXNoICsgaG9sZGluZ3MgYmFsYW5jZSBpbiBhIHRvb2x0aXBcclxuLSBBZGQgYnV5L3NlbGwgaW52ZXN0bWVudCB0cmFkZXMgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgc3luYyBhbmQgcmVidWlsZCB0aGVpciBwb3J0Zm9saW8gYW5kIGhpc3RvcmljYWwgZ3JhcGhcclxuXHJcbk1vdmluZyBmb3J3YXJkLCB3ZSdsbCBiZSByZWZpbmluZyBhbmQgYWRkaW5nIHRvIHRoZSBpbnZlc3RtZW50IHBvcnRmb2xpbyBmZWF0dXJlIGFuZCBjb21wbGVtZW50aW5nIGl0IHdpdGggdHJvdWJsZXNob290aW5nIGd1aWRlcyBzbyB5b3Uga25vdyBleGFjdGx5IHdoYXQncyBjYXVzaW5nIGFueSBkaXNjcmVwYW5jaWVzIGJldHdlZW4gTWF5YmUncyBjYWxjdWxhdGlvbnMgYW5kIHlvdXIgYnJva2VyYWdlJ3MgY2FsY3VsYXRpb25zLlxyXG5cclxuaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzL2Y0YzhiYzY1LTMxZjYtNDYyNy1iNGU3LTQ3N2QwNjg3YzU3MFxyXG5cclxuIyMgV2hhdCdzIENoYW5nZWRcclxuXHJcbiogQnVtcCB0YWlsd2luZGNzcy1yYWlscyBmcm9tIDIuNi40IHRvIDIuNi41IGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA1OFxyXG4qIEJ1bXAgZmFyYWRheSBmcm9tIDIuMTAuMCB0byAyLjEwLjEgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDU1XHJcbiogQnVtcCBlcmJfbGludCBmcm9tIDAuNS4wIHRvIDAuNi4wIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA1N1xyXG4qIEJ1bXAgYXdzLXNkay1zMyBmcm9tIDEuMTU2LjAgdG8gMS4xNTcuMCBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNTRcclxuKiBCdW1wIGdvb2Rfam9iIGZyb20gNC4xLjAgdG8gNC4xLjEgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDUzXHJcbiogQnVtcCBwYWd5IGZyb20gOS4wLjMgdG8gOS4wLjUgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDU2XHJcbiogQnVtcCByYWlscyBmcm9tIGA1Y2I1Y2FkYCB0byBgNDM1MzBiNGAgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDU5XHJcbiogQWRkIHNvdXJjZSBoZWFkZXJzIHRvIFN5bnRoIGNhbGxzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNjJcclxuKiBBZGQgc3RpbXVsdXMgdG9vbHRpcCBjb250cm9sbGVyIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDY1XHJcbiogRmV0Y2ggZXhjaGFuZ2UgcmF0ZXMgaW4gYnVsayBmcm9tIHN5bnRoIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDY5XHJcbiogRml4IG1pbml0ZXN0IGFzc2VydF9uaWwgd2FybmluZyBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA3MFxyXG4qIEFsbG93IHVzZXIgdG8gYWRkIGJ1eSBhbmQgc2VsbCB0cmFkZSB0cmFuc2FjdGlvbnMgZm9yIGludmVzdG1lbnQgYWNjb3VudHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA2NlxyXG4qIFRlbXAgZml4IGZvciBtaXNzaW5nIGFjY291bnRhYmxlcyBvbiBzZWxmIGhvc3RlZCBpbnN0YW5jZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA3MVxyXG5cclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMTMuLi52MC4xLjAtYWxwaGEuMTQiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2OTU5MTAyOS9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MTYsIisxIjowLCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MTYsImNvbmZ1c2VkIjowLCJoZWFydCI6MCwicm9ja2V0IjowLCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjN9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2ODUxMDU1OSIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY4NTEwNTU5L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2ODUxMDU1OS9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjEzIiwiaWQiOjE2ODUxMDU1OSwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRLQzBSZiIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjEzIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjEzIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wOC0wMlQyMToxMDoxNloiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA4LTAyVDIxOjEwOjU5WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjEzIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTMiLCJib2R5IjoiQ29taW5nIG9mZiB0aGUgYmFjayBvZiBsYXN0IHdlZWsncyByZWxlYXNlIHdoaWNoIGludHJvZHVjZWQgYmFzaWMgaW52ZXN0bWVudCBwb3J0Zm9saW8gdmlld3MgYW5kIHRoZSBhYmlsaXR5IHRvIHN5bmMgaW52ZXN0bWVudCBob2xkaW5ncywgdGhpcyB3ZWVrJ3MgcmVsZWFzZSBpbnRyb2R1Y2VzIGZ1bGwgc3VwcG9ydCBmb3Igc3RvY2sgcHJpY2VzIHdpdGggdGhlIFtTeW50aCBBUEldKGh0dHBzOi8vc3ludGhmaW5hbmNlLmNvbS8pISAod2hpY2ggaGFzIGEgZ2VuZXJvdXMgZnJlZSB0aWVyIHRvIGdldCBzdGFydGVkKVxyXG5cclxuVGhpcyBtZWFucyB0aGF0IGludmVzdG1lbnQgYWNjb3VudCB2aWV3cyBjYW4gbm93IHByb3Blcmx5IGNhbGN1bGF0ZSBhbmQgc2hvdyBhbiBhZ2dyZWdhdGVkIG1hcmtldCB2YWx1ZSBvZiBhbGwgdGhlIGludmVzdG1lbnRzIGluIGl0IGFuZCBncmFjZWZ1bGx5IGhhbmRsZSBtaXNzaW5nIHN0b2NrIHByaWNlcy5cclxuXHJcbkluIGEgZnV0dXJlIHJlbGVhc2UsIHVzZXJzIHdpbGwgaGF2ZSBmdWxsIGNvbnRyb2wgdG8gY3JlYXRlIGJ1eSAmIHNlbGwgdHJhZGVzLCBtYW5hZ2UgdGhlaXIgaW52ZXN0bWVudCBwb3J0Zm9saW8sIGFuZCBzZWUgdG90YWwgcmV0dXJucyBvdmVyIHZhcmlvdXMgdGltZSBwZXJpb2RzIGFsb25nc2lkZSB0aGVpciBoaXN0b3JpY2FsIHZhbHVlIGdyYXBoLlxyXG5cclxuaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzL2MzOWIxNzA2LTk3YTctNGUzZS1iNTY4LTlkOWIwOWUzOGUwNVxyXG5cclxuIyMgV2hhdCdzIENoYW5nZWRcclxuKiBGaXg6IE9taXQgbGF5b3V0IGZvciB0dXJibyBmcmFtZXMgd2l0aCBjdXN0b20gc2lkZWJhciBsYXlvdXQgYnkgQHByYW5hdmJhYnUgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDI0XHJcbiogZml4OiBsb25nIGVtYWlscyBvdmVyZmxvdyBpbiBhY2NvdW50IG1lbnUgZHJvcGRvd24gYnkgQE1pa2hhaWxXYWhpYiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMzRcclxuKiBGaXggZGVtbyBkYXRhIHJlc2V0IGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDQxXHJcbiogRW5zdXJlIHRyYW5zZmVyIG5hbWUgaXMgcG9wdWxhdGVkIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNDJcclxuKiBBZGQgc2VjdXJpdHkgcHJpY2VzIHByb3ZpZGVyIChTeW50aCBpbnRlZ3JhdGlvbikgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAzOVxyXG4qIFNob3cgY2FzaCArIGhvbGRpbmdzIHZhbHVlIGZvciBpbnZlc3RtZW50IGFjY291bnQgdmlldyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDQ2XHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQHByYW5hdmJhYnUgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDI0XHJcbiogQE1pa2hhaWxXYWhpYiBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMzRcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMTIuLi52MC4xLjAtYWxwaGEuMTMiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2ODUxMDU1OS9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MzAsIisxIjo0LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MTMsImNvbmZ1c2VkIjowLCJoZWFydCI6Niwicm9ja2V0Ijo3LCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjR9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NzM4MjI3NyIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY3MzgyMjc3L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NzM4MjI3Ny9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjEyIiwiaWQiOjE2NzM4MjI3NywiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKLWcwRiIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjEyIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjEyIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNy0yNlQxNDo0ODoyMVoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA3LTI2VDE0OjUwOjM2WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjEyIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTIiLCJib2R5IjoiIyMgV2hhdCdzIENoYW5nZWRcclxuKiBTZXQgbGFzdF9sb2dpbl9hdCBvbmx5IG9uIGxvZ2luIGluc3RlYWQgb2YgZXZlcnkgc2luZ2xlIGFjdGlvbiBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAxN1xyXG4qIEJ1bXAgcGFneSB3aXRoIGZpeCBmb3IgYnJlYWtpbmcgY2hhbmdlcyAgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMTZcclxuKiBGaXggZm9ybSBsYWJlbHMgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMDRcclxuKiBGaXggY3VyZW5jeSBmb3JtYXQgYnkgQEp1bGl1c01pZWxpYXVza2FzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAyMFxyXG4qIEltcGxlbWVudCBhdXRvIGZhbWlseSBzeW5jcyBvbiBsb2dpbiBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDIxXHJcbiogQmFzaWMgUG9ydGZvbGlvIFZpZXdzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMDBcclxuKiBGaXggY3VycmVuY3kgZm9ybWF0dGluZyBpbiBwaWUgY2hhcnQgdmlzdWFsaXphdGlvbiBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDIyXHJcbiogU2V0IG1pbmltdW0gc3VwcG9ydGVkIGRhdGUgZm9yIGFjY291bnQgZW50cmllcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDIzXHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQEp1bGl1c01pZWxpYXVza2FzIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAyMFxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4xMS4uLnYwLjEuMC1hbHBoYS4xMiIsIm1lbnRpb25zX2NvdW50IjozfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjYyOTY5NTMiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NjI5Njk1My9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjYyOTY5NTMvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS4xMSIsImlkIjoxNjYyOTY5NTMsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00SjZYMTUiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS4xMSIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4xMSIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDctMTlUMjA6MDk6MDVaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNy0xOVQyMDowOTozOFoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS4xMSIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjExIiwiYm9keSI6IiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogV3JhcCBhY2NvdW50IHVwZGF0ZSBpbiBhIHRyYW5zYWN0aW9uIGJ5IEBhY2Nlc3NkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTg1XHJcbiogQWxsb3cgQ1NWIGZpbGUgdXBsb2FkIGluIGltcG9ydCBmbG93IGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85ODZcclxuKiBTYW5pdGl6ZSBpbnB1dCBmb3IgaWxpa2UgaW4gQWNjb3VudDo6RW50cnkuc2VhcmNoIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85ODhcclxuKiBJbnZlc3RtZW50IFBvcnRmb2xpbyBTeW5jIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk3NFxyXG4qIE1vcmUgY29tcG9zYWJsZSBmb3JtcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85ODlcclxuKiBBZGQgZGVmYXVsdCBjdXJyZW5jaWVzIHRvIGZvcm1zIGJhc2VkIG9uIHByZWZlcmVuY2UgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTk0XHJcbiogQnVpbGQgc2FtcGxlIHBvcnRmb2xpbyBkZXRlcm1pbmlzdGljYWxseSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85OTNcclxuKiBBZGQgY3VycmVuY3kgdmFsaWRhdGlvbiB0byBhY2NvdW50LCB1cGRhdGUgZGVtbyBkYXRhIGdlbmVyYXRvciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85OTZcclxuKiBTeW5jIG5vdGlmaWNhdGlvbnMgYW5kIHRyb3VibGVzaG9vdGluZyBndWlkZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTk4XHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQGFjY2Vzc2QgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85ODVcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMTAuLi52MC4xLjAtYWxwaGEuMTEiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NjI5Njk1My9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MTQsIisxIjowLCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MCwiY29uZnVzZWQiOjAsImhlYXJ0IjowLCJyb2NrZXQiOjE0LCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjN9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NTI2MzMyNCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY1MjYzMzI0L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NTI2MzMyNC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjEwIiwiaWQiOjE2NTI2MzMyNCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKMmJmYyIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjEwIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjEwIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNy0xMlQyMjozODoxN1oiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA3LTEyVDIyOjM5OjExWiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjEwIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTAiLCJib2R5IjoiIyMgV2hhdCdzIENoYW5nZWRcclxuKiBBZGQgZXJyb3IgaGFuZGxpbmcgZm9yIEFjY291bnRzQ29udHJvbGxlciNjcmVhdGUgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk1N1xyXG4qIGZpeDogIzk1MSBwb2ludGVyIGN1cnNvciBhbmQgYmcgaG92ZXIgZm9yIGltcG9ydCBmbG93IGJ1dHRvbnMgYnkgQE1hZ251c0hKZW5zZW4gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85NTRcclxuKiBIYW5kbGUgbWlzc2luZyBleGNoYW5nZSByYXRlIHByb3ZpZGVyLCBhbGxvdyBmYWxsYmFjayBmb3IgbWlzc2luZyByYXRlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85NTVcclxuKiBBZGQgbWlzc2luZyBtaWdyYXRpb25zIGZvciBnb29kX2pvYiA0eCBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTY3XHJcbiogQWNjb3VudDo6U3luYyBtb2RlbCBhbmQgdGVzdCBmaXh0dXJlIHNpbXBsaWZpY2F0aW9ucyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85NjhcclxuKiBEZW1vIEZhbWlseSBkYXRhIHVwZGF0ZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTcyXHJcbiogTWFrZSBiYWxhbmNlIGVkaXRpbmcgZWFzaWVyIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk3NlxyXG5cclxuIyMgTmV3IENvbnRyaWJ1dG9yc1xyXG4qIEBNYWdudXNISmVuc2VuIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTU0XHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjkuLi52MC4xLjAtYWxwaGEuMTAiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NTI2MzMyNC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6NywiKzEiOjcsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjAsInJvY2tldCI6MCwiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50IjozfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjQxOTg4NDgiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NDE5ODg0OC9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjQxOTg4NDgvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS45IiwiaWQiOjE2NDE5ODg0OCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKeVhuQSIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjkiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuOSIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDctMDVUMTg6MTY6NDFaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNy0wNVQxODoxNzoyMloiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS45IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuOSIsImJvZHkiOiIjIyBXaGF0J3MgQ2hhbmdlZFxyXG4qIEFjY291bnQ6OkVudHJ5IERlbGVnYXRlZCBUeXBlIChuYW1lc3BhY2UgdXBkYXRlcyBwYXJ0IDcpIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkyM1xyXG4qIEZpeCBkZWNpbWFsIGRpc3BsYXkgZm9yIGV1cm8gY3VycmVuY3kgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTM3XHJcbiogRW5hYmxlIHVwZGF0aW5nIEFjY291bnQ6OkVudHJ5I2Ftb3VudCBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQyXHJcbiogRml4IGJ1ZyB3aGVyZSB0cmFuc2FjdGlvbnMgd2VyZSBkdXBsaWNhdGVkIGluIGltcG9ydCBjb25maXJtIGJ5IEBsamh1cnN0IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQxXHJcbiogRW5xdWUgYWNjb3VudCBzeW5jIGpvYiBhZnRlciBjcmVhdGluZyB0cmFuc2ZlciBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQ2XHJcbiogRW5hYmxlIHN5bmNpbmcgYWxsIGFjY291bnRzIGluIG9uZSBjbGljayBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQ4XHJcbiogVXBkYXRlIGRvY2tlciBjb21wb3NlIGV4YW1wbGUgd2l0aCBmaXhlZCBzdG9yYWdlIHZvbHVtZSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85NTBcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAbGpodXJzdCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk0MVxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS44Li4udjAuMS4wLWFscGhhLjkiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NDE5ODg0OC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6OSwiKzEiOjksIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjAsInJvY2tldCI6MCwiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50IjozfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjMwNjU4NDQiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MzA2NTg0NC9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjMwNjU4NDQvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS44IiwiaWQiOjE2MzA2NTg0NCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKdUNfMCIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjgiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuOCIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDYtMjhUMjE6MjI6MjZaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNi0yOFQyMToyMzozM1oiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS44IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuOCIsImJvZHkiOiIjIyBXaGF0J3MgQ2hhbmdlZFxyXG4qIFVuaWZ5IHByaW1hcnkgYnV0dG9uIHN0eWxlcyBhbmQgY2hhbmdlIGN1cnNvciBvbiBhY2NvdW50IGdyb3VwIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkwNVxyXG4qIEZpeCBpc3N1ZSAjODYxOiBDb3JyZWN0IGhlYWRlciBzZWxlY3Rpb24gbG9naWMgaW4gZ2V0X3NlbGVjdGVkX2hlYWRlcl9mb3JfZmllbGQgbWV0aG9kIGJ5IEBpZ29yY2FydmFsaGggaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MThcclxuKiBGaXggIzkxMCBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTE3XHJcbiogQWNjb3VudCBuYW1lc3BhY2UgdXBkYXRlczogcGFydCA2ICh0cmFuc2FjdGlvbnMpIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkwNFxyXG4qIGltcHJvdmVtZW50LyM4OTAvY2xlYW5fdXBfdG9hc3Rfbm90aWZpY2F0aW9uX3N0eWxlc19hbmRfYWxsb3dfdXNlcl90b19jbG9zZV9vbi1kZW1hbmQgYnkgQGV2YW5nZWxvcy1jb20gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MTlcclxuKiBGaXggIzkyMSBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTIyXHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQGlnb3JjYXJ2YWxoaCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkxOFxyXG4qIEBldmFuZ2Vsb3MtY29tIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTE5XHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjcuLi52MC4xLjAtYWxwaGEuOCIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTYzMDY1ODQ0L3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoxMSwiKzEiOjgsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjEsInJvY2tldCI6MiwiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50Ijo1fSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjE3NDIxMzAiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MTc0MjEzMC9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjE3NDIxMzAvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS43IiwiaWQiOjE2MTc0MjEzMCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKb18weSIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjciLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuNyIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDYtMjFUMjE6MDQ6NTlaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNi0yMVQyMTowODowNFoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS43IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuNyIsImJvZHkiOiIjIyBXaGF0J3MgQ2hhbmdlZFxyXG5cclxuTWF5YmUgbm93IHN1cHBvcnRzIHRyYW5zZmVyIG1hdGNoaW5nIPCfpbMg8J+MriBcclxuXHJcblRoaXMgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyBpbmNvbWUgYW5kIGV4cGVuc2UgY2FsY3VsYXRpb25zIGJ5IGV4Y2x1ZGluZyB0cmFuc2ZlcnMgZnJvbSB0aGUgY2FsY3VsYXRpb246XHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9hc3NldHMvMTY2NzYxNTcvYTFjZGU0OTQtYjg5Zi00NjZhLThjNzQtZGExOTQ5MzQyODhhXHJcblxyXG4qIEFkZCBtZXJjaGFudCBzZWxlY3Qgd2hlbiBlZGl0aW5nIHRyYW5zYWN0aW9uIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg4NVxyXG4qIFRyYW5zYWN0aW9uIHRyYW5zZmVycywgcGF5bWVudHMsIGFuZCBtYXRjaGluZyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84ODNcclxuKiBFbnN1cmUgY29ycmVjdCBmb3JtJ3MgaGlkZGVuIGlucHV0IGZvciBzZWxlY3RlZElkcyBieSBAemlyYXF5b3VuZyBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg5MVxyXG4qIEFjY291bnQgbmFtZXNwYWNlIHVwZGF0ZXM6IHBhcnQgMSAoYWNjb3VudGFibGUgdHlwZXMpIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg5M1xyXG4qIEFjY291bnQgbmFtZXNwYWNlIHVwZGF0ZXM6IHBhcnQgMiAoY2F0ZWdvcmllcykgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODk0XHJcbiogQWNjb3VudCBuYW1lc3BhY2UgdXBkYXRlczogcGFydCAzIChtZXJjaGFudHMpIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg5NVxyXG4qIEFjY291bnQgbmFtZXNwYWNlIHVwZGF0ZXM6IHBhcnQgNCAodHJhbnNmZXJzLCBzaW5ndWxhciBuYW1lc3BhY2luZykgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODk2XHJcbiogRml4IEJ1ZzogYWZ0ZXIgZWRpdGluZyBhbiBhY2NvdW50IGhpc3RvcnkgdmFsdWUsIGl0IHJlcXVpcmVzIDIgY2xpY2tzIHRvIGNsb3NlIHRoZSBtZW51IGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MDBcclxuKiBmZWF0OiBUcmFuc2FjdGlvbiBwYWdpbmF0aW9uIEltcHJvdmVtZW50cyBieSBAa2FyYW5raXJpIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODczXHJcbiogRml4IHRyYW5zZmVyIG5vdGUgb3ZlcmZsb3cgc3R5bGUgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTAyXHJcbiogQWNjb3VudCBuYW1lc3BhY2UgdXBkYXRlczogcGFydCA1ICh2YWx1YXRpb25zKSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MDFcclxuKiBBbGxvdyB0cmFuc2ZlcnMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIGluIGRpZmZlcmVudCBjdXJyZW5jaWVzIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkwM1xyXG5cclxuIyMgTmV3IENvbnRyaWJ1dG9yc1xyXG4qIEB6aXJhcXlvdW5nIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODkxXHJcbiogQHRvbnl2aW5jZSBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkwMFxyXG4qIEBrYXJhbmtpcmkgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NzNcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuNi4uLnYwLjEuMC1hbHBoYS43IiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjE3NDIxMzAvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjI2LCIrMSI6MCwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjksImNvbmZ1c2VkIjowLCJoZWFydCI6Nywicm9ja2V0Ijo5LCJleWVzIjoxfSwibWVudGlvbnNfY291bnQiOjV9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MDU2NjQ3MSIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTYwNTY2NDcxL2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MDU2NjQ3MS9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjYiLCJpZCI6MTYwNTY2NDcxLCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEprZ3pIIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuNiIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS42IiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNi0xNFQyMDo1MDowOFoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA2LTE0VDIxOjAxOjA0WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjYiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS42IiwiYm9keSI6IiMjIFdoYXQncyBDaGFuZ2VkXHJcblxyXG5UaGlzIHJlbGVhc2UgY29tZXMgd2l0aCBhIGNvbXBsZXRlIG92ZXJoYXVsIG9mIG91ciBEb2NrZXIgc2V0dXAgZ3VpZGUsIGJldHRlciBpbnRlcm5hbCBuYXZpZ2F0aW9uLCBhbmQgdGhlIGFiaWxpdHkgdG8gZ3JvdXAgeW91ciBhY2NvdW50cyBieSBmaW5hbmNpYWwgaW5zdGl0dXRpb24hXHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9hc3NldHMvMTY2NzYxNTcvYmU0ZDFjZTgtNzA1NS00ZjcxLTljM2YtYzliYmM5Y2I0NTFjXHJcblxyXG4qIEltcHJvdmUgYWNjb3VudCBpbnRlcm5hbCBsaW5raW5nIGFuZCByZWRpcmVjdCBiZWhhdmlvciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NjRcclxuKiBBbGxvdyBmb3Igb3B0aW9uYWwgc3RhcnQgZGF0ZSBvbiBhY2NvdW50IGNyZWF0aW9uIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg2NlxyXG4qIEFkZCBpbnN0aXR1dGlvbiBtYW5hZ2VtZW50IGFuZCBhY2NvdW50IGVkaXRpbmcgY29udHJvbHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODY4XHJcbiogTmV3IERvY2tlciBDb21wb3NlIFNlbGYgSG9zdGluZyBHdWlkZSArIFVJIEZpeGVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg3MFxyXG4qIFNpbXBsaWZ5IGFjY291bnQgc3luYyBsb2dpYyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NzFcclxuKiBDaGFuZ2Vsb2cgcGFnZSB0aGF0IHB1bGxzIGZyb20gR2l0aHViIFJlbGVhc2Ugbm90ZXMgYnkgQG1hdHRpYS1tYWxuaXMgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NjdcclxuXHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjUuLi52MC4xLjAtYWxwaGEuNiIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTYwNTY2NDcxL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjozNiwiKzEiOjI3LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MCwiY29uZnVzZWQiOjAsImhlYXJ0Ijo5LCJyb2NrZXQiOjAsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6Mn0seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU5NDUyMjQ0IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTk0NTIyNDQvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU5NDUyMjQ0L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuNSIsImlkIjoxNTk0NTIyNDQsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00SmdReFUiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS41IiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjUiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTA2LTA3VDIzOjI5OjAxWiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMDYtMDdUMjM6MzQ6MTFaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4xLjAtYWxwaGEuNSIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjUiLCJib2R5IjoiIyMgV2hhdCdzIENoYW5nZWRcclxuXHJcbkJ1bGsgdHJhbnNhY3Rpb24gZWRpdGluZyBhbmQgZGVsZXRpb24gaXMgaGVyZSEgIENoZWNrIG91dCB0aGUgZGVtbyBiZWxvdzpcclxuXHJcbmh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2Fzc2V0cy8xNjY3NjE1Ny9kOGEzYWUzOS00OTMxLTQ3NzUtOGM3Ni0yMTFkNmRjOTZiZjZcclxuXHJcbiogQWRkIGJ1bGsgc2VsZWN0aW9uIFVJIGNvbnRyb2xzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg0MFxyXG4qIEJ1bGsgdHJhbnNhY3Rpb24gZGVsZXRpb24gYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODQ1XHJcbiogQnVsayBlZGl0aW5nIG9mIHRyYW5zYWN0aW9ucyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NDZcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuNC4uLnYwLjEuMC1hbHBoYS41IiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTk0NTIyNDQvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjQ4LCIrMSI6MzUsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5Ijo2LCJjb25mdXNlZCI6MCwiaGVhcnQiOjcsInJvY2tldCI6MCwiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50IjoxfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTgzOTA2NzEiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1ODM5MDY3MS9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTgzOTA2NzEvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS40IiwiaWQiOjE1ODM5MDY3MSwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKY05tUCIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjQiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuNCIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDUtMzFUMTg6MDk6MTJaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNS0zMVQxODoxMDozMVoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS40IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuNCIsImJvZHkiOiIjIyBXaGF0J3MgQ2hhbmdlZFxyXG4qIGZpeDogcG5nIGZpbGUgY2FuIGJlIHNlbGVjdGVkIGFzIHByb2ZpbGUgaW1hZ2VzIGJ5IEBwZWEtc3lzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODA5XHJcbiogVmFsaWRhdGUgdHJhbnNhY3Rpb24gZmlsdGVyaW5nIHBhcmFtcyBieSBAamFrdWJrb3R0bmF1ZXIgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84MTBcclxuKiBGaXggZm9yZWlnbiBhY2NvdW50IHN5bmMgY3Jhc2ggYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzk0XHJcbiogU29ydCBhY2NvdW50cyBpbiB0aGUgc2lkZWJhciBieSBAamFrdWJrb3R0bmF1ZXIgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84MTVcclxuKiBSZXVzYWJsZSBDSSB3b3JrZmxvdyBmb3IgR0ggYWN0aW9ucyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84MTlcclxuKiBUcmFuc2FjdGlvbnMgY2xlYW51cCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84MTdcclxuKiBTeW5jIGFjY291bnQgYWZ0ZXIgdHJhbnNhY3Rpb24gaW1wb3J0IGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzgyMFxyXG4qIEZpeCBvdmVyZmxvdyBlcnJvciBvbiBhY2NvdW50IHZhbHVlIGlucHV0cyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84MjFcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAcGVhLXN5cyBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzgwOVxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4zLi4udjAuMS4wLWFscGhhLjQiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1ODM5MDY3MS9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MjEsIisxIjowLCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MjEsImNvbmZ1c2VkIjowLCJoZWFydCI6MCwicm9ja2V0IjowLCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjN9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1NzM5NzA5MSIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU3Mzk3MDkxL2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1NzM5NzA5MS9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjMiLCJpZCI6MTU3Mzk3MDkxLCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEpZYkJqIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuMyIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4zIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNS0yNFQxODoyNDowM1oiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA1LTI0VDE4OjI1OjM3WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjMiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS4zIiwiYm9keSI6IiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogRml4IGN1cnJlbmN5IHdoZW4gaW1wb3J0aW5nIHRvIGZvcmVpZ24gYWNjb3VudHMgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzYyXHJcbiogU2hvdyBhbiBlcnJvciBub3RpZmljYXRpb24gaWYgYWNjb3VudCBjYW5ub3QgYmUgbWFudWFsbHkgc3luY2VkIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzc2MVxyXG4qIEFkZCBtaWdyYXRpb24gdG8gbWFrZSBhbGwgZXhpc3RpbmcgdXNlcnMgYWRtaW5zIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzc3MFxyXG4qIEZpeCBpc3N1ZSB3aXRoIHN0YXJ0X2RhdGUgbm90IGJlaW5nIHNldCBpbiBhY2NvdW50IGNyZWF0aW9uIGJ5IEBzY3ViYW1hZ2dvIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzgxXHJcbiogRml4IGltcG9ydCBjcmFzaCB3aXRoIGVtcHR5IHRyYW5zYWN0aW9uIG5hbWUgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzgzXHJcbiogTW92ZSBjYXRlZ29yeSBkcm9wZG93biBtZW51IGNvbnRlbnQgaW50byBhIHR1cmJvIGZyYW1lIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzc4MlxyXG4qIElnbm9yZSBlbXB0eSBjYXRlZ29yaWVzIHdoaWxlIGltcG9ydGluZyBieSBAamFrdWJrb3R0bmF1ZXIgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC83ODlcclxuKiBGaXggZHVwbGljYXRlIGNhdGVnb3J5IGNyZWF0aW9uIG9uIGltcG9ydCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC83OTFcclxuKiBDcmVhdGUgdGFnZ2luZyBzeXN0ZW0gYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzkyXHJcbiogQWRkIHRhZyBwcmV2aWV3IHdoZW4gaW1wb3J0aW5nIGFuZCBmaXggZW1wdHkgY2F0ZWdvcnkgYnVnIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzgwMFxyXG5cclxuIyMgTmV3IENvbnRyaWJ1dG9yc1xyXG4qIEBzY3ViYW1hZ2dvIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzgxXHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjIuLi52MC4xLjAtYWxwaGEuMyIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU3Mzk3MDkxL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjozMSwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjUsInJvY2tldCI6MjYsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6M30seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU2MzQyMTUyIiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTYzNDIxNTIvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU2MzQyMTUyL2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuMiIsImlkIjoxNTYzNDIxNTIsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00SlVaZUkiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS4yIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjIiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTA1LTE3VDIyOjIwOjE5WiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMDUtMTdUMjI6MzM6MjRaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4xLjAtYWxwaGEuMiIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjIiLCJib2R5IjoiU2Vjb25kIGFscGhhIHJlbGVhc2Ugb2YgTWF5YmUg8J+OiSDwn4yuXHJcblxyXG4jIyBOZXcgZmVhdHVyZXNcclxuXHJcbi0gU2VsZiBob3N0aW5nIHdpdGggRG9ja2VyIPCfkLMgKFtzZXR1cCBndWlkZV0oaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvYmxvYi9tYWluL2RvY3MvaG9zdGluZy9kb2NrZXIubWQpKVxyXG4tIENTViB0cmFuc2FjdGlvbiBpbXBvcnRzXHJcbi0gVHJhbnNhY3Rpb24gbWFuYWdlbWVudCB3aXRoIG1lcmNoYW50cyBhbmQgY2F0ZWdvcmllc1xyXG4tIEZyZXNoIGRlc2lnbiBvZiB1c2VyIHNldHRpbmdzXHJcbi0gUmUtZGVzaWduZWQgZGFzaGJvYXJkICsgYWNjb3VudHMgc3VtbWFyeVxyXG4tIEFkbWluIGFjY291bnRzLCBhYmlsaXR5IHRvIGRlbGV0ZSBhbmQgcHVyZ2UgZGF0YVxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4xLi4udjAuMS4wLWFscGhhLjIiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1NjM0MjE1Mi9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6NTEsIisxIjowLCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6NDksImNvbmZ1c2VkIjowLCJoZWFydCI6Miwicm9ja2V0IjowLCJleWVzIjowfX0seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTUxMDI4MTIzIiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTEwMjgxMjMvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTUxMDI4MTIzL2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuMSIsImlkIjoxNTEwMjgxMjMsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00SkFJR2IiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS4xIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjEiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTA0LTEzVDEzOjI4OjQ1WiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMDQtMTNUMTM6NDk6MDNaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4xLjAtYWxwaGEuMSIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjEiLCJib2R5IjoiSW5pdGlhbCBhbHBoYSB2ZXJzaW9uIG9mIE1heWJlIPCfjokg8J+MriIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTUxMDI4MTIzL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoxNjUsIisxIjo1MCwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjQ2LCJjb25mdXNlZCI6MCwiaGVhcnQiOjM1LCJyb2NrZXQiOjIzLCJleWVzIjoxMX19XQ== - recorded_at: Mon, 09 Sep 2024 20:03:35 GMT + W3sidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzIwMzEwMjI3OCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMjAzMTAyMjc4L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzIwMzEwMjI3OC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuNC4zIiwiaWQiOjIwMzEwMjI3OCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNE1HeGhHIiwidGFnX25hbWUiOiJ2MC40LjMiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC40LjMiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOmZhbHNlLCJjcmVhdGVkX2F0IjoiMjAyNS0wMi0yOFQyMDoxMTo0MVoiLCJwdWJsaXNoZWRfYXQiOiIyMDI1LTAyLTI4VDIwOjE3OjE3WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuNC4zIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC40LjMiLCJib2R5IjoiIyMgRGF0YSByZXNldHMsIG9mZmxpbmUgaW52ZXN0bWVudCB0cmFkZXMsIGFuZCBtaXNjZWxsYW5lb3VzIHN0YWJpbGl0eSBpbXByb3ZlbWVudHNcclxuXHJcblRoaXMgcmVsZWFzZSBjb21lcyB3aXRoIGEgd2lkZSBtaXggb2Ygc3RhYmlsaXR5IGltcHJvdmVtZW50cyBhbmQgcXVhbGl0eSBvZiBsaWZlIHVwZGF0ZXM7IHBhcnRpY3VsYXJseSBmb3Igc2VsZiBob3N0ZWQgYXBwcywgd2hpY2ggY2FuIG5vdyBiZSBcInJlc2V0XCIgaW4gdXNlciBzZXR0aW5ncy4gIElmIHlvdXIgZGF0YSBsb29rcyB3cm9uZyBvciB5b3Ugd2FudCBhIFwiY2xlYW4gc2xhdGVcIiB0byB3b3JrIGZyb20sIHdlJ3ZlIGFkZGVkIHRoZSBhYmlsaXR5IGZvciB5b3UgdG8gZWFzaWx5IHBlcmZvcm0gdGhlc2UgcmVzZXRzIHdpdGhvdXQgd3JpdGluZyBTUUwgb3IgbWFudWFsbHkgZGVsZXRpbmcgcmVjb3Jkcy5cclxuXHJcblRoaXMgcmVsZWFzZSBhbHNvIGNvbWVzIHdpdGggYSBtdWNoIGNsZWFyZXIgVUkgc3Vycm91bmRpbmcgdGhlIFN5bnRoIGRhdGEgcHJvdmlkZXIuICBOZXcgc2VsZiBob3N0ZWQgdXNlcnMgd2lsbCBub3cgc2VlIGEgcHJvbWluZW50IHdhcm5pbmcgbWVzc2FnZSBpZiB0aGV5IGhhdmUgbWlzc2luZyBkYXRhIGFzIGEgcmVzdWx0IG9mIGEgbWlzY29uZmlndXJlZCBvciBhYnNlbnQgZGF0YSBwcm92aWRlci5cclxuXHJcbiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogQWRkIG5ldyBjYXRlZ29yeSBmbG93IGJ5IEBzeWVkYmFyaW1hbmphbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4NTdcclxuKiBGaXggcGFyZW50IGNhdGVnb3J5IHN1bXMgaW4gYnVkZ2V0IGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4OTRcclxuKiBBZGQgYnJlYWRjcnVtYnMgc3VwcG9ydCBhY3Jvc3MgYXBwbGljYXRpb24gYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4OTdcclxuKiBEYXNoYm9hcmQgZGVzaWduIGZpeGVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4OThcclxuKiBBbGxvdyBhY2NvdW50IGJhbGFuY2UgdG8gZHluYW1pY2FsbHkgdXNlIGN1cnJlbmN5IGZvcm1hdCBvbiBwcmVmZXJlbmNlIHBhZ2UgYnkgQEhhcnJ5LWtwIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTkxMFxyXG4qIEZlYXQ6IERhdGEgXCJyZXNldFwiIGJ1dHRvbiBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTkxM1xyXG4qIEZpeDogTWFrZSBUYWdzIHNlbGVjdGlvbiBzY3JvbGxhYmxlIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xOTIxXHJcbiogRml4IHZhbHVlIHdyYXBwaW5nIG9uIGFjY291bnQgYmFsYW5jZSBpbiBzaWRlYmFyIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE5MjJcclxuKiBGaXggaW1wb3J0IGNvbmZpZ3VyYXRpb24gZm9ybSBzbyBudW1iZXIgZm9ybWF0IGlzIGFwcGxpZWQgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTkyM1xyXG4qIEFkZCB0cmFuc2l0aW9ucyB0byBidXR0b25zIGFuZCBvdGhlciBjb21tb24gZGVzaWduIHN5c3RlbSBlbGVtZW50cyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xOTI0XHJcbiogQWxsb3cgb2ZmbGluZSB0cmFkZSB0aWNrZXJzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE5MjVcclxuKiBmaXg6IERvbid0IHNob3cgQmlsbGluZ3Mgb24gc2V0dGluZ3MgbmF2YmFyIHdoZW4gc2VsZi1ob3N0ZWQgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE5MTJcclxuKiBTaG93IFVJIHdhcm5pbmcgdG8gdXNlciB3aGVuIHRoZXkgbmVlZCBwcm92aWRlciBkYXRhIGJ1dCBoYXZlIG5vdCBzZXR1cCBTeW50aCB5ZXQgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTkyNlxyXG4qIEludmVydCBsaWFiaWxpdHkgZ3JhcGhzIHRvIGhhdmUgY29ycmVjdCBzaWduYWdlIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE5MjhcclxuKiBFc2NhcGUgcXVvdGF0aW9ucyBpbiBDU1YgaW1wb3J0cyBwcm9wZXJseSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xOTI5XHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQHN5ZWRiYXJpbWFuamFuIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTg1N1xyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjQuMi4uLnYwLjQuMyIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMjAzMTAyMjc4L3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoyMiwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjIyLCJyb2NrZXQiOjAsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6NX0seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMjAxNzY2MjkyIiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8yMDE3NjYyOTIvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMjAxNzY2MjkyL2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC40LjEiLCJpZCI6MjAxNzY2MjkyLCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00TUJyV1UiLCJ0YWdfbmFtZSI6InYwLjQuMSIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjQuMSIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6ZmFsc2UsImNyZWF0ZWRfYXQiOiIyMDI1LTAyLTIxVDE5OjE5OjUwWiIsInB1Ymxpc2hlZF9hdCI6IjIwMjUtMDItMjFUMTk6MjA6NDNaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC40LjEiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjQuMSIsImJvZHkiOiJQYXRjaCByZWxlYXNlIGZvciBnaXQgdmVyc2lvbmluZyBpbmZvIGNyYXNoIGVycm9yIiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8yMDE3NjYyOTIvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjEzLCIrMSI6MTMsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjAsInJvY2tldCI6MCwiZXllcyI6MH19LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzIwMTc0NTA4NSIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMjAxNzQ1MDg1L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzIwMTc0NTA4NS9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuNC4wIiwiaWQiOjIwMTc0NTA4NSwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNE1CbUs5IiwidGFnX25hbWUiOiJ2MC40LjAiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC40LjAiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOmZhbHNlLCJjcmVhdGVkX2F0IjoiMjAyNS0wMi0yMVQxNzozOTo0OVoiLCJwdWJsaXNoZWRfYXQiOiIyMDI1LTAyLTIxVDE3OjQ0OjI1WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuNC4wIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC40LjAiLCJib2R5IjoiIyMgTWF5YmUgUmVmcmVzaCDwn46JIFxyXG5cclxuVGhpcyBsYXRlc3QgdmVyc2lvbiBjb21lcyB3aXRoIGEgKipicmFuZCBuZXcgYW5kIHNpbXBsaWZpZWQgVUkqKiBwbHVzIGEgdG9uIG9mIGh1Z2UgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIG9uIHRoZSB0cmFuc2FjdGlvbnMsIGRhc2hib2FyZCwgYW5kIGFjY291bnRzIHBhZ2VzLlxyXG5cclxuIVtDbGVhblNob3QgMjAyNS0wMi0yMSBhdCAxMiAzOSAxMl0oaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzLzdjOWQyMjBjLTRhMTMtNGVlZi05ODY2LTA1YTYxMzEwZTJjZilcclxuXHJcbiMjIFdoYXQncyBDaGFuZ2VkXHJcblxyXG4qIEZpeCBhY2NvdW50IGRlbGV0aW9uIGNhc2NhZGUgYnVnIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2NDRcclxuKiBEbyBub3QgcmFpc2Ugb24gUGxhaWQgaXRlbSBub3QgZm91bmQgZXhjZXB0aW9ucyBmb3IgaXRlbSBkZWxldGlvbnMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTY0NlxyXG4qIEFsaWduIGNhc2NhZGUgZGVsZXRlIGJlaGF2aW9yIGZvciB0cmFuc2ZlcnMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTY0N1xyXG4qIGZpeDogT25seSBhZG1pbnMgY2FuIGdlbmVyYXRlIGludml0ZSBjb2RlcyBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTYxMVxyXG4qIE9ubHkgdXBkYXRlIGFjY291bnQgYmFsYW5jZSBpZiBjaGFuZ2VkIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2NzZcclxuKiBBZGp1c3QgcXVldWVzIHRvIHByaW9yaXRpemUgYWNjb3VudCBzeW5jcywgaGFuZGxlIG1pc3NpbmcgY3VycmVudCBkYXkgdmFsdWVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2ODJcclxuKiBBZGRlZCBEZWNpbWFsIFN1cHBvcnQgaW4gbWluIHRyYW5zYWN0aW9uIGJ5IEBIYXJyeS1rcCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2ODFcclxuKiBGaXggbisxIGZvciBjYXRlZ29yaWVzIGluIGZvciB0b19kb251dF9zZWdtZW50c19qc29uIGluIGJ1ZGdldCBieSBAdGFwYWxpbG92IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTY5M1xyXG4qIEFkZCBNb3JlIFRpbWVsaW5lcyBieSBAbmlraGlsYmFkeWFsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTcxNFxyXG4qIEFkZCBjYWJpbiAvIGNvdHRhZ2UgYXMgYSBwcm9wZXJ0eSB0eXBlIGJ5IEBlaXRoZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2NThcclxuKiBBZGQgUmVqZWN0ZWRUcmFuc2ZlciBtb2RlbCwgc2ltcGxpZnkgYXV0byBtYXRjaGluZyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNjkwXHJcbiogRml4OiBFZGl0aW5nIGEgY2F0ZWdvcnkgZG9lcyBub3Qgc2hvdyBub3RpZmljYXRpb24gdW50aWwgbmV4dCBwYWdlIHJlZnJlc2ggYnkgQGplc3Rpbmpvc2hpIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTcyMFxyXG4qIEJ1bXAgdG8gUnVieSAzLjQuMSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNzIxXHJcbiogTGF6eSBsb2FkIHN5bnRoIGxvZ29zIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3MzFcclxuKiBPbmx5IGJ1aWxkIGFybXY3IG9uIG9mZmljaWFsIHJlbGVhc2VzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3MzJcclxuKiBEb24ndCBhbGxvdyBhIHN1YmNhdGVnb3J5IHRvIGJlIGFzc2lnbmVkIHRvIGFub3RoZXIgc3ViY2F0ZWdvcnkgdG8gZW5zdXJlIDEgbGV2ZWwgb2YgbmVzdGluZyBtYXggYnkgQGVsdmlzc2VycmFvIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTczMFxyXG4qIFByZXNlcnZlIHRyYW5zYWN0aW9uIGZpbHRlcnMgYW5kIHRyYW5zYWN0aW9uIGZvY3VzIGFjcm9zcyBwYWdlIHZpc2l0cyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNzMzXHJcbiogQWRkL3JlbW92ZSBtZW1iZXJzIGFuZCBpbnZpdGF0aW9ucyBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTc0NFxyXG4qIEVuc3VyZSBDb25zaXN0ZW50IENhdGVnb3J5IENvbG9ycyBieSBASkxhbWJlcnRhenpvIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTcyMlxyXG4qIEFsbG93IHVzZXJzIHRvIHVwZGF0ZSB0aGVpciBlbWFpbCBhZGRyZXNzIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNzQ1XHJcbiogSW5pdGlhbCBwYXNzIGF0IFBsYWlkIEVVIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTU1XHJcbiogRml4IEVVIHBsYWlkIGZsb3cgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTc2MVxyXG4qIEltcHJvdmUgc3BlZWQgb2YgdHJhbnNhY3Rpb25zIHBhZ2UgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTc1MlxyXG4qIEZpeDogdW5hYmxlIHRvIGFkZCBhY2NvdW50cyB3aXRob3V0IHBsYWluIHNldCB1cCBieSBARjIyMTAgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNzY5XHJcbiogRml4OiBtYWtlIGRhdGUgZm9ybWF0IHllYXIgY29uc2lzdGVudCBvdmVyYWxsICMxNzEyIGJ5IEBzY29kZXM3MyBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3MjZcclxuKiBDdXJzb3IgcnVsZXMgYW5kIHByb2plY3QgZGVzaWduIG92ZXJ2aWV3IGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3ODhcclxuKiBGaXggY3J5cHRvLnJhbmRvbVVVSUQgZXJyb3JzIHdoZW4gYWRkaW5nIGhvbGRpbmdzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3OTVcclxuKiBTcGxpdCBmYW1pbHkgYW5kIFBsYWlkIGl0ZW0gc3luY3MgaW50byBtdWx0aXBsZSBqb2JzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3OTlcclxuKiBGaXg6IEluY29ycmVjdCBDdXJyZW5jeSBBc3NpZ25tZW50IGZvciBTdG9jayBQcmljZXMgKCMxNjIzKSBieSBAc2FwaHAgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNzk4XHJcbiogRml4IGJ1ZGdldCBhbGxvY2F0aW9uIGZvcm1zIGZyb20gcmVzZXR0aW5nIGFuZCBjbGVhcmluZyBkYXRhIG9uIHNsb3cgbmV0d29ya3MgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTgwNFxyXG4qIFJlZmFjdG9yIHRyYW5zYWN0aW9uIGVucmljaG1lbnQgdG8gc3VwcG9ydCBiYXRjaCBwcm9jZXNzaW5nIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xODAzXHJcbiogQWRkIHNjb3BlIHRvIGZpbHRlciB0cmFuc2FjdGlvbnMgZnJvbSBhY3RpdmUgYWNjb3VudHMgYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4MTBcclxuKiBmaXg6IFNhdmUgY29tcGxldGVseSBhbGxvY2F0ZWQgYnVkZ2V0IGJ5IEBNMTIzLWRldiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4MTFcclxuKiBmZWF0OiBBZGQgaW5zdGl0dXRpb24gZGV0YWlscyB0byBQbGFpZCBpdGVtcyBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTgxNlxyXG4qIE11bHRpLWZhY3RvciBhdXRoZW50aWNhdGlvbiBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTgxN1xyXG4qIGZpeDogUGxhaWQgd2ViaG9vayB2ZXJpZmljYXRpb24gYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTgyNFxyXG4qIFBsYWlkIEVVIHdlYmhvb2tzIG1pZ3JhdGlvbiB0YXNrIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4MjVcclxuKiBGaXggQWNjb3VudCBIb2xkaW5nIHZhbGlkYXRpb24gYW5kIHN5bmNocm9uaXphdGlvbiBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTgxOFxyXG4qIEZlYXR1cmU6IEFkZCB0aGUgYWJpbGl0eSB0byBcInJldmVydFwiIGEgQ1NWIGltcG9ydCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xODE0XHJcbiogZmVhdChpbXBvcnQpOiBhZGQgY3VycmVuY3kgYW5kIG51bWJlciBmb3JtYXQgc3VwcG9ydCBmb3IgQ1NWIGltcG9ydHMgYnkgQGRhbmVzdHZlcyBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4MTlcclxuKiBmaXg6IHN1YmNhdGVnb3JpZXMgYXJlIG5vdCBwcm9wZXJseSBoYW5kbGVkIGZvciBidWRnZXQgYWxsb2NhdGlvbnMgYnkgQHBhdWxla2U2NSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4NDRcclxuKiBFbmhhbmNlIHNlY3VyaXR5IGluZm9ybWF0aW9uIHJldHJpZXZhbCBhbmQgaGFuZGxpbmcgYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4MjZcclxuKiBmaXg6IExpYWJpbGl0aWVzIGZhdm9yYWJsZSBkaXJlY3Rpb24gaXMgXCJkb3duXCIgYnkgQE0xMjMtZGV2IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTg0OVxyXG4qIFVwZ3JhZGUgdG8gVGFpbHdpbmQgdjQgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTg1M1xyXG4qIEVuaGFuY2UgUGxhaWQgY29ubmVjdGlvbiBtYW5hZ2VtZW50IHdpdGggcmUtYXV0aGVudGljYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xODU0XHJcbiogTWF5YmUgRGVzaWduIFN5c3RlbSBVcGRhdGVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4NTZcclxuKiBmaXg6IFRyYW5zZmVycyBzaG91bGQgYWx3YXlzIHRvdGFsIHRvIHplcm8gYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4NTlcclxuKiBmaXg6IEdob3N0IHN1YmNhdGVnb3JpZXMgd2hlbiBwYXJlbnQgY2F0ZWdvcnkgaXMgZGVsZXRlZCBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTg3NFxyXG4qIEZpeCBpbXBvcnQgY29uZmlndXJhdGlvbiBmYWlsdXJlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xODc2XHJcbiogTmV3IERlc2lnbiBTeXN0ZW0gKyBDb2RlYmFzZSBSZWZyZXNoIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4MjNcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBASkxhbWJlcnRhenpvIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTY5OVxyXG4qIEB0YXBhbGlsb3YgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNjkzXHJcbiogQGVpdGhlIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTY1OFxyXG4qIEBlbHZpc3NlcnJhbyBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3MzBcclxuKiBARjIyMTAgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNzY5XHJcbiogQHNjb2RlczczIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTcyNlxyXG4qIEBzYXBocCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE3OThcclxuKiBATTEyMy1kZXYgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xODExXHJcbiogQGRhbmVzdHZlcyBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE4MTlcclxuKiBAcGF1bGVrZTY1IG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTg0NFxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjMuMC4uLnYwLjQuMCIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMjAxNzQ1MDg1L3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoyOCwiKzEiOjUsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5Ijo3LCJjb25mdXNlZCI6MCwiaGVhcnQiOjExLCJyb2NrZXQiOjUsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6MTZ9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE5NTQxNTE3NyIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTk1NDE1MTc3L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE5NTQxNTE3Ny9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMy4wIiwiaWQiOjE5NTQxNTE3NywiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNExwY3lKIiwidGFnX25hbWUiOiJ2MC4zLjAiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4zLjAiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOmZhbHNlLCJjcmVhdGVkX2F0IjoiMjAyNS0wMS0xN1QyMjowMToyNloiLCJwdWJsaXNoZWRfYXQiOiIyMDI1LTAxLTE3VDIyOjA1OjE5WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMy4wIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4zLjAiLCJib2R5IjoiIyMgQnVkZ2V0aW5nIGlzIGhlcmUhXHJcblxyXG5BIGxvbmcgYXdhaXRlZCBmZWF0dXJlLCBNYXliZSBub3cgc3VwcG9ydHMgYnVkZ2V0aW5nISAgV2UgYmVsaWV2ZSBidWRnZXRpbmcgc2hvdWxkIGJlIGVhc3kgYW5kIHNpbXBsZS4gIENhdGVnb3JpemUgeW91ciB0cmFuc2FjdGlvbnMsIG1hcmsgdHJhbnNmZXJzLCBvbmUtdGltZSBleHBlbnNlcywgYW5kIGdldCBhIGNsZWFyIGJyZWFrZG93biBvZiB3aGVyZSB5b3VyIG1vbmV5IGlzIGdvaW5nIGVhY2ggbW9udGguXHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvNGRjZjNmNjYtN2IyNi00MmU3LTljNmItNDhkZjdlMTlhNzk4XHJcblxyXG4jIyBXaGF0J3MgQ2hhbmdlZFxyXG4qIEFkZCBhY2NvdW50IGRhdGEgZW5yaWNobWVudCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTMyXHJcbiogSGFuZGxlIG5pbCBuYW1lIGZvciBlbnRyaWVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1NTBcclxuKiBGaXggZGF0ZSBmb3JtYXQgdmFsaWRhdGlvbiBlcnJvciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTUxXHJcbiogTWFrZSB0cmFuc2FjdGlvbiBlbnJpY2htZW50IG9wdC1pbiBmb3IgYWxsIHVzZXJzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1NTJcclxuKiBQcmVzZXJ2ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBuYW1lcyB3aGVuIGVucmljaGluZyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTU2XHJcbiogUHJlc2VydmUgcGFnaW5hdGlvbiBvbiBlbnRyeSB1cGRhdGVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1NjNcclxuKiBOZXN0ZWQgQ2F0ZWdvcmllcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTYxXHJcbiogU2F2ZSBlcnJvciBiYWNrdHJhY2UgZm9yIHN5bmMgZXJyb3JzIGZvciBiZXR0ZXIgZGVidWdnaW5nIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTc4XHJcbiogZml4OiBCdWcgfCBjcmVhdGluZyBkdXBsaWNhdGUgY2F0ZWdvcnkgbGVhZHMgdG8gY3Jhc2ggc2NyZWVuIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTc3XHJcbiogRml4IHVua25vd24gYXR0cmlidXRlICdwYXJlbnRfY2F0ZWdvcnknIGZvciBDYXRlZ29yeSBpbiBkZW1vIGdlbmVyYXRvciBieSBAYWthYmlydSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1NzVcclxuKiBGaXg6IGJyZWFraW5nIGNoYW5nZSBhZnRlciBidW1waW5nIGhvdHdpcmUtbGl2ZXJlbG9hZCB0byAyLjAuMCBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTU4OVxyXG4qIFRyYW5zZmVyIGFuZCBQYXltZW50IGF1dG8tbWF0Y2hpbmcsIG1vZGVsIGFuZCBVSSBpbXByb3ZlbWVudHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTU4NVxyXG4qIEJ1ZGdldGluZyBWMSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNjA5XHJcbiogRml4IHRyYW5zZmVyIG1hdGNoaW5nIGxvZ2ljIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2MjVcclxuKiBGaXggYnVkZ2V0IG1vbmV5IGZvcm1hdHRpbmcgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTYyNlxyXG4qIFVwZGF0ZSBzbmFwc2hvdF9hY2NvdW50X3RyYW5zYWN0aW9ucyB0byBvbmx5IGdpdmUgdHJhbnNhY3Rpb25zIGJ5IGZpbHRlcmluZyBvbiBlbnRyeWFibGVfdHlwZSBieSBAUmVwc2F5IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTYyOVxyXG4qIEZJWDogY29ycmVjdCBkaXNwbGF5IG9mIHBlcmNlbnRhZ2VzIGJ5IEBNclRvYiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2MjJcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAYWthYmlydSBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1NzVcclxuKiBAUmVwc2F5IG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTYyOVxyXG4qIEBNclRvYiBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE2MjJcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4yLjAuLi52MC4zLjAiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE5NTQxNTE3Ny9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6NzMsIisxIjoyMywiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjIsImNvbmZ1c2VkIjowLCJoZWFydCI6MzcsInJvY2tldCI6MTEsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6NX0seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTkwNjk1NDQyIiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xOTA2OTU0NDIvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTkwNjk1NDQyL2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4yLjAiLCJpZCI6MTkwNjk1NDQyLCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00TFhjZ1MiLCJ0YWdfbmFtZSI6InYwLjIuMCIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjIuMCIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6ZmFsc2UsImNyZWF0ZWRfYXQiOiIyMDI0LTEyLTEzVDE3OjE2OjIxWiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMTItMTNUMTg6MTk6MjdaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4yLjAiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjIuMCIsImJvZHkiOiIjIyBQbGFpZCBJbnRlZ3JhdGlvbiArIE11bHRpLWN1cnJlbmN5IEludmVzdG1lbnQgUG9ydGZvbGlvIFN1cHBvcnRcclxuXHJcbldlIGhhdmUgY29tcGxldGVkIHRoZSBmaXJzdCBwYXNzIGF0IG91ciBmdWxseSBhdXRvbWF0ZWQgYmFuayBzeW5jaW5nIHdpdGggUGxhaWQgb24gb3VyIF9ob3N0ZWQgdmVyc2lvbl8gb2YgdGhlIGFwcCFcclxuXHJcbkF1dG9tYXRlZCBiYW5rIHN5bmNpbmcgaXMgYSBodWdlIG1pbGVzdG9uZSBmb3IgdGhlIGFwcCBhbmQgaW5jbHVkZXMgbWFueSBVSSBpbXByb3ZlbWVudHMsIGFjY3VyYWN5IGltcHJvdmVtZW50cywgYW5kIGJ1ZyBmaXhlczpcclxuXHJcbi0gRWRpdGluZyB0cmFuc2FjdGlvbnMgaXMgbm93IG11Y2ggc21vb3RoZXJcclxuLSBBY2NvdW50IGhpc3RvcnkgY2FuIGJlIGNhbGN1bGF0ZWQgY2hyb25vbG9naWNhbGx5IGFuZCByZXZlcnNlLWNocm9ub2xvZ2ljYWxseSAocmVxdWlyZWQgZm9yIFBsYWlkIGFjY291bnRzKVxyXG4tIE11bHRpLWN1cnJlbmN5IGludmVzdG1lbnQgYWNjb3VudHMgYXJlIG5vdyBhdmFpbGFibGVcclxuLSBJbnZlc3RtZW50IGFjY291bnRzIG5vdyBwcm9wZXJseSBjYWxjdWxhdGUgXCJicm9rZXJhZ2UgY2FzaFwiIHZzLiBcImhvbGRpbmdzIHZhbHVlXCIgYW5kIGJyZWFrIHRoaXMgb3V0IGNsZWFybHkgaW4gdGhlIHZpZXdcclxuLSBJbnZlc3RtZW50IGFjY291bnRzIGNhbGN1bGF0ZSBjb3N0IGJhc2lzIG1vcmUgYWNjdXJhdGVseVxyXG5cclxuIVtDbGVhblNob3QgMjAyNC0xMi0xMyBhdCAxMiAzMSAwM10oaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzLzFmZGJhYjc5LTdiYzUtNDYzMS04MGI0LWE3MDhkZjE3ODNmZClcclxuXHJcbiMjIyBDYW4gSSBzZWxmLWhvc3QgUGxhaWQ/XHJcblxyXG5BcyBhbiBvcGVuLXNvdXJjZSBwcm9qZWN0LCBzZWxmLWhvc3RlcnMgYXJlIG1vcmUgdGhhbiB3ZWxjb21lIHRvIGNvbmZpZ3VyZSAoYW5kIHBheSBmb3IpIHRoZWlyIG93biBQbGFpZCBhY2NvdW50cy4gIFlvdSBjYW4gc2VlIHRoZSBgLmVudi5leGFtcGxlYCBmaWxlIGZvciB0aGUgcmVxdWlyZWQgYXBpIGtleXMgdGhhdCBuZWVkIHRvIGJlIHByb3ZpZGVkIHRvIHRoZSBhcHAuXHJcblxyXG5UaGF0IHNhaWQsIGR1ZSB0byB0aGUgY29tcGxleGl0eSBhcm91bmQgT0F1dGgsIFBsYWlkJ3MgcHJpY2luZyBzdHJ1Y3R1cmUsIGFuZCBjb3N0cyBhc3NvY2lhdGVkIHdpdGggYSBwZXJzb25hbCBQbGFpZCBzdWJzY3JpcHRpb24sIHdlIHdpbGwgbm90IGJlIG9mZmljaWFsbHkgc3VwcG9ydGluZyB0aGlzIHNldHVwLiAgVGhlIGhvc3RlZCB2ZXJzaW9uIG9mIG91ciBhcHAgaGFzIGZ1bGwgUGxhaWQgc3VwcG9ydCBhbmQgaXMgb3VyIHJlY29tbWVuZGVkIHdheSB0byBnZXQgYWNjZXNzIHRvIGF1dG9tYXRlZCBiYW5rIHN5bmNpbmcgKG1vcmUgaW52aXRlcyBjb21pbmcgc29vbiEpLlxyXG5cclxuIyMgV2hhdCdzIENoYW5nZWRcclxuXHJcbiogRml4IHJlZ2lzdHJhdGlvbiBmYWlscyBzaWxlbnRseSB3aGVuIHRoZXJlIGFyZSBlcnJvcnMgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0NTVcclxuKiBBZGRzIGEgY29tbW9uIERFIGRhdGUgZm9ybWF0IGJ5IEBzYmVocmVuZHMgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDQ1XHJcbiogQmFzaWMgUGxhaWQgSW50ZWdyYXRpb24gYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTQzM1xyXG4qIE1ha2UgZW5jcnlwdGlvbiBjb25maWcgb3B0aW9uYWwgZm9yIHNlbGYgaG9zdGluZyB1c2VycyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDc2XHJcbiogQWxsb3cgY3VzdG9tIGNvbHVtbiBzZXBhcmF0b3IgZm9yIENTViBwYXJzaW5nIGluIHVwbG9hZHMgY29udHJvbGxlciBieSBAYWNmbGludCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0NzBcclxuKiBGaXggdHJhbnNmZXJzIGFuZCBmb3JtIGN1cnJlbmNpZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTQ3N1xyXG4qIERvbid0IHJlZnJlc2ggcGFnZSB3aGVuIHRyYW5zYWN0aW9uIGRldGFpbHMgYXJlIGVkaXRlZCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDc5XHJcbiogQWRkIHBvc3Qtc3luYyBVSSBzdHJlYW0gdXBkYXRlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDgyXHJcbiogQ2FsY3VsYXRlcyB0cmVuZCBiYXNlZCBvbiBwcmV2aW91cyB0cmFuc2FjdGlvbidzIGJhbGFuY2Ugb24gdGhlIHNhbWUgZGF0ZSBieSBAbmljb2dhbGRhbWV6IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTQ4M1xyXG4qIFJlcGxhY2VkIE5hdGl2ZSBTY3JvbGxiYXJzIHdpdGggVGFpbHdpbmQgU2Nyb2xsYmFycyBvbiBXaW5kb3dzIGJ5IEBqZXN0aW5qb3NoaSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0OTNcclxuKiBGaXggYnVnOiBMb2FuICUgZG9lc24ndCBhbGxvdyBleGFjdCByYXRlIGJ5IEBhcnNlbnN0b3JtIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTQ5MlxyXG4qIEZpeCBBY2NvdW50IERpc2FibGluZyBVSSBieSBAYXJzZW5zdG9ybSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0OTFcclxuKiBGZWF0dXJlOiBBZGQgc3VwcG9ydCBmb3IgY3VzdG9taXplZCBzeW50aCBVUkwgZnJvbSBlbnYgdmFyaWFibGUgYnkgQEV2bG9zIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTQ5MFxyXG4qIFN5bnRoIGVycm9yIGhhbmRsaW5nIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTAyXHJcbiogVXBkYXRlZCB1c2FnZSBjaGVjayB0aHJlc2hvbGQgdG8gMTAwcGMgaW5zdGVhZCBvZiAxIGJ5IEBuaWtoaWxiYWR5YWwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTA0XHJcbiogSW1wcm92ZSBhY2NvdW50IHRyYW5zYWN0aW9uLCB0cmFkZSwgYW5kIHZhbHVhdGlvbiBlZGl0aW5nIGFuZCBzeW5jIGV4cGVyaWVuY2UgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTUwNlxyXG4qIEhhbmRsZSBpbnZhbGlkIEFQSSBrZXkgYnkgQG5pa2hpbGJhZHlhbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1MTVcclxuKiBQbGFpZCBwb3J0Zm9saW8gc3luYyBhbGdvcml0aG0gYW5kIGNhbGN1bGF0aW9uIGltcHJvdmVtZW50cyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNTI2XHJcbiogUGxhaWQgc3luYyB0ZXN0cyBhbmQgbXVsdGktY3VycmVuY3kgaW52ZXN0bWVudCBzdXBwb3J0IGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1MzFcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuXHJcbiogQHNiZWhyZW5kcyBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0NDVcclxuKiBAYWNmbGludCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0NzBcclxuKiBARXZsb3MgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDkwXHJcbiogQG5pa2hpbGJhZHlhbCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE1MDRcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAuLi52MC4yLjAiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE5MDY5NTQ0Mi9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MzQsIisxIjoxNCwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjAsImNvbmZ1c2VkIjowLCJoZWFydCI6NCwicm9ja2V0IjoxNiwiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50IjoxMH0seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTg0NDM5NDc4IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xODQ0Mzk0NzgvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTg0NDM5NDc4L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4yLjAtYWxwaGEuMiIsImlkIjoxODQ0Mzk0NzgsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInVzZXJfdmlld190eXBlIjoicHVibGljIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRLX2xLMiIsInRhZ19uYW1lIjoidjAuMi4wLWFscGhhLjIiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4yLjAtYWxwaGEuMiIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMTEtMDhUMTk6NTU6NTZaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0xMS0wOFQyMDowMzowMloiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjIuMC1hbHBoYS4yIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4yLjAtYWxwaGEuMiIsImJvZHkiOiIjIyBBY3Rpdml0eSBWaWV3IFxyXG5cclxuQWxvbmdzaWRlIHNldmVyYWwgYnVnIGZpeGVzLCB0aGlzIHByZS1yZWxlYXNlIGNvbWVzIHdpdGggYSBicmFuZCBuZXcgXCJBY3Rpdml0eSBWaWV3XCIgYmFzZWQgb24gdG9ucyBvZiB1c2VyIGZlZWRiYWNrLiAgVGhpcyBuZXcgYWN0aXZpdHkgdmlldyBhbGxvd3MgeW91IHRvIHNlZSB0aGUgY2hyb25vbG9naWNhbCB1cGRhdGVzIG9mIGVhY2ggYWNjb3VudCBhbGwgaW4gb25lIHBsYWNlLiAgSW4gYWRkaXRpb24sIGl0IHNob3VsZCBob3cgZWFjaCB0cmFuc2FjdGlvbiBhbmQgYmFsYW5jZSB1cGRhdGUgYWZmZWN0cyB0aGUgb3ZlcmFsbCBoaXN0b3JpY2FsIGJhbGFuY2Ugb24gdGhlIGFjY291bnQuICBZb3UgY2FuIHNlZSBpdCBpbiBhY3Rpb24gYmVsb3c6XHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvMmVmN2U2OTEtYTJmZS00ZGM2LWI4YmItMDg5NmI5NjM0MjU4XHJcblxyXG4jIyBXaGF0J3MgQ2hhbmdlZFxyXG5cclxuKiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBzdG9jayBleGNoYW5nZSB0YWJsZSBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTM2OFxyXG4qIGZpeCBidWxrIGFjdGlvbiBiYXIgcG9zaXRpb25pbmcgYnkgQGdhcmlhc2YgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzcwXHJcbiogU3RvY2sgZmlsdGVyIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzc2XHJcbiogUmVtb3ZlIG1pc3NpbmcgcHJpY2VzIGlzc3VlIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzOTBcclxuKiBGaXJzdCBwYXNzIGF0IHNlY3VyaXR5IHByaWNlIHJlZmVyZW5jZSBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTM4OFxyXG4qIEluaXRpYWwgcGFzcyBhdCBTeW50aC1iYXNlZCB0aWNrZXIgc2VsZWN0aW9uIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzkyXHJcbiogR3JvdW5kd29yayBmb3Igc2VjdXJpdHkgaW5mbyBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTM5NlxyXG4qIEFkZHMgY29uZGl0aW9uIHRvIHNraXAgbGluayB0byB0cmFuc2FjdGlvbiBmb3JtIGlmIGl0J3Mgbm90IGVkaXRhYmxlIGJ5IEBuaWNvZ2FsZGFtZXogaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzk0XHJcbiogRG8gbm90IGluY2x1ZGUgaW5jb21lIHRyYW5zYWN0aW9ucyBpbiBsaWFiaWxpdHkgYWNjb3VudHMgZm9yIHNhdmluZ3MgcmF0ZSBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTM4NVxyXG4qIEF1dG8gbmFtaW5nIG9mIFRyYW5zZmVyIFRyYW5zYWN0aW9uIGJ5IEBIYXJyeS1rcCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzOTNcclxuKiBGYW1pbHkgaW52aXRlcyBieSBAU2hwaWdmb3JkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTM5N1xyXG4qIEVuIHRyYW5zbGF0aW9uIGZpeCBieSBAYWxla3NleXAgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDAxXHJcbiogQWNjb3VudCBBY3Rpdml0eSBWaWV3ICsgQWNjb3VudCBGb3JtcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDA2XHJcbiogRml4IGFjY291bnQgbmFtZXMgYXJlIG5vdCB0cnVuY2F0ZWQgcHJvcGVybHkgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0MzFcclxuKiBFeGNsdWRlIGluYWN0aXZlIGFjY291bnRzIGZyb20gbmV0LXdvcnRoIGNhbGN1bGF0aW9uIGFuZCBmcm9tIHNpZGViYXIgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0MzJcclxuKiBGaXggdGltZWZyYW1lIGRyb3Bkb3duIG5leHQgdG8gUG9ydGZvbGlvIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDM0XHJcbiogU2tpcCBhY2NvdW50IHZhbHVhdGlvbiBvbiBlbnRyeSBiYWxhbmNlX2FmdGVyX2VudHJ5IGJ5IEBicnVuby1jb3N0YW56byBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0MzVcclxuKiBGaXggZHVwbGljYXRlIGludml0ZXMgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzE0MzdcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAYWxla3NleXAgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xNDAxXHJcbiogQDN6Y3VyZGlhIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTQwMlxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjIuMC1hbHBoYS4xLi4udjAuMi4wLWFscGhhLjIiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE4NDQzOTQ3OC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MjMsIisxIjo1LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MCwiY29uZnVzZWQiOjAsImhlYXJ0IjowLCJyb2NrZXQiOjE4LCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjl9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE4MTk0NTc0NCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTgxOTQ1NzQ0L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE4MTk0NTc0NC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMi4wLWFscGhhLjEiLCJpZCI6MTgxOTQ1NzQ0LCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00SzJFV1EiLCJ0YWdfbmFtZSI6InYwLjIuMC1hbHBoYS4xIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMi4wLWFscGhhLjEiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTEwLTI1VDEzOjM3OjUwWiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMTAtMjVUMTM6NTA6NTJaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4yLjAtYWxwaGEuMSIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMi4wLWFscGhhLjEiLCJib2R5IjoiIyMgSW1wcm92ZWQgQWNjb3VudCBGbG93cyArIE9uYm9hcmRpbmdcclxuXHJcbldpdGggdGhpcyByZWxlYXNlLCB3ZSBraWNrIG9mZiB3b3JrIHRvd2FyZHMgYHYwLjIuMGAsIHdoaWNoIHdpbGwgYWRkIGEgYmFzaWMgYmFuayBwcm92aWRlciBpbnRlZ3JhdGlvbiAoUGxhaWQpIVxyXG5cclxuSW4gdGhpcyByZWxlYXNlLCB3ZSd2ZSBhZGRlZCBvbmJvYXJkaW5nIHRvIHRoZSBhcHAgc28gdGhhdCB1c2VycyBjYW4gc2VsZWN0IGFsbCBvZiB0aGVpciBwcmVmZXJlbmNlcyBhbG9uZyB3aXRoIG11Y2ggc2ltcGxlciBhbmQgaW50dWl0aXZlIGFjY291bnQgYWRkaXRpb24gZmxvd3MuXHJcblxyXG5IZXJlJ3MgYSBxdWljayBkZW1vIG9mIGhvdyBlYXN5IGl0IGlzIHRvIGdldCBzdGFydGVkIHdpdGggTWF5YmUhXHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvZGZkZDg4Y2ItMjNmNC00MGI4LWI0ODctZDk3YWRkOTYxN2ZhXHJcblxyXG4jIyBXaGF0J3MgQ2hhbmdlZFxyXG4qIEFkZCBwZXJpb2QgdG8gdmFsdWUgZGVsZXRlIG1vZGFsIGJ5IEBhaGF0enoxMSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyOTdcclxuKiBBZGQgQmlvbWVKUyBmb3IgTGludGluZyBhbmQgRm9ybWF0dGluZyBKYXZhU2NyaXB0IHJlbGF0ZXMgdG8gIzEyOTUgYnkgQG94ZGV2MDMgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjk5XHJcbiogQWNjb3VudHMgaW4gc2lkZWJhciBzaG91bGQgYmUgb3JkZXJlZCB0aGUgc2FtZSBhcyBpbiB0aGUgYWNjb3VudHMgc3VtbWFyeSBwYWdlIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzE4XHJcbiogYWRkIGRhc2hib2FyZCBhY2NvdW50IHBpbGwgdG9vbHRpcHMgYnkgQGdhcmlhc2YgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzE1XHJcbiogUmVkaXJlY3QgdXBsb2FkIHN0ZXAgYnkgQGVuZGVyYWhtZXR5dXJ0IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTMyM1xyXG4qIEltcGVyc29uYXRpb24gYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzMjVcclxuKiBSZXdvcmsgYWNjb3VudCB2aWV3cyBhbmQgYWRkaXRpb24gZmxvdyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzI0XHJcbiogQmFzaWMgYWNjb3VudCBvbmJvYXJkaW5nIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzMjhcclxuKiBGaXhlcyBpc3N1ZSB3aXRoIG1hcHBpbmcgdmFsdWVzIGR1cmluZyB0aGUgdHJhbnNhY3Rpb25zIGltcG9ydCBieSBAbmljb2dhbGRhbWV6IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTMyN1xyXG4qIFN0b2NrIEV4Y2hhbmdlcyB3aXRoIHNlZWQgYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzNTFcclxuKiBVc2VyIE9uYm9hcmRpbmcgKyBCdWcgRml4ZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTM1MlxyXG4qIEJldGEgVGVzdGluZyBSb3VuZCAzIEJ1ZyBGaXhlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzU3XHJcbiogQWRkIGdvb2Qgam9iIGRhc2hib2FyZCB3aXRoIGF1dGggYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTM2NFxyXG4qIFN0b2NrIGltcG9ydHMgYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzNjNcclxuKiBGZWF0dXJlIHwgRmlsdGVyIG9uIHVuY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zIGJ5IEBicnVuby1jb3N0YW56byBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzNTlcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAb3hkZXYwMyBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyOTlcclxuKiBAZW5kZXJhaG1ldHl1cnQgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzIzXHJcbiogQG5pY29nYWxkYW1leiBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEzMjdcclxuKiBAYnJ1bm8tY29zdGFuem8gbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMzU5XHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLi4udjAuMi4wLWFscGhhLjEiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE4MTk0NTc0NC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MzIsIisxIjo5LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MTcsImNvbmZ1c2VkIjowLCJoZWFydCI6Niwicm9ja2V0IjowLCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjl9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3OTU4MTU5OCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTc5NTgxNTk4L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3OTU4MTU5OC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wIiwiaWQiOjE3OTU4MTU5OCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEt0REtlIiwidGFnX25hbWUiOiJ2MC4xLjAiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOmZhbHNlLCJjcmVhdGVkX2F0IjoiMjAyNC0xMC0xMVQxNzoxNTo0NloiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTEwLTExVDE3OjUyOjA3WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAiLCJib2R5IjoiIyMgV2UncmUgbGl2ZSEg8J+MriDwn6WzIFxyXG5cclxuIVt0aGUtb2ZmaWNlLXRoZV0oaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzLzI4YTNlMWUxLTAyN2ItNGY5NC1hYmQzLTg5ZDM0Yzc2ZDA1YilcclxuXHJcbkFmdGVyIGh1bmRyZWRzIG9mIGNvbnRyaWJ1dG9ycyBhbmQgaHVuZHJlZHMgb2YgdGhvdXNhbmRzIG9mIGxpbmVzIG9mIGNvZGUsIGB2MC4xLjBgIGlzIGhlcmUhXHJcblxyXG5UaGlzIHJlbGVhc2UgY29tZXMgd2l0aCBhIFRPTiBvZiBidWcgZml4ZXMgYW5kIG1hcmtzIHRoZSBsYXVuY2ggb2YgXCJob3N0ZWRcIiBNYXliZS4gIFdlJ3ZlIHN0aWxsIGdvdCBhIF90b25fIG9mIHdvcmsgYWhlYWQsIGJ1dCB3ZSdyZSBleGNpdGVkIHRvIHJlbGVhc2Ugb3VyIGZpcnN0IHByb2R1Y3Rpb24tcmVhZHkgdmVyc2lvbiBvZiBNYXliZS5cclxuXHJcbldlJ3JlIGN1cnJlbnRseSBpbiBhIHByaXZhdGUsIGludml0ZS1vbmx5IGFscGhhLiAgQmUgc3VyZSB0byBbam9pbiBvdXIgRGlzY29yZF0oaHR0cHM6Ly9saW5rLm1heWJlLmNvL2Rpc2NvcmQpIGZvciBhbm5vdW5jZW1lbnRzIHdoZW4gbmV3IHNwb3RzIGJlY29tZSBhdmFpbGFibGUhXHJcblxyXG5JbiB0aGlzIGZpcnN0IHZlcnNpb24sIHlvdSBjYW46XHJcblxyXG4tIEFkZCBhbGwgb2YgeW91ciBhY2NvdW50c1xyXG4tIEltcG9ydCBhY2NvdW50cywgdHJhbnNhY3Rpb25zLCBhbmQgdHJhZGVzIGJ5IENTVlxyXG4tIFNlZSB5b3VyIG5ldCB3b3J0aCwgdG90YWwgc3BlbmRpbmcsIGFuZCB0b3RhbCBpbmNvbWVcclxuLSBNYW5hZ2UgdHJhbnNhY3Rpb25zIChjYXRlZ29yaWVzLCB0YWdzLCBub3RlcylcclxuLSBNYW5hZ2UgaW52ZXN0bWVudCBwb3J0Zm9saW9zIChidXlzLCBzZWxscywgZGVwb3NpdHMsIHdpdGhkcmF3YWxzKVxyXG5cclxuQWZ0ZXIgd2UgaW5jb3Jwb3JhdGUgYWxsIHRoZSBmZWVkYmFjayBjb21pbmcgaW4sIG91ciBob3N0ZWQgYXBwIHdpbGwgYmUgaW50cm9kdWNpbmcgYXV0b21hdGVkIGJhbmsgc3luY2luZyFcclxuXHJcbiMjIFdoYXQncyBDaGFuZ2VkXHJcblxyXG4qIEhpZGUgY3VycmVuY3kgZm9yIHRyYW5zZmVycyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjYwXHJcbiogSGlkZSBpbmZpbml0eSB0cmVuZCBwZXJjZW50YWdlIGNoYW5nZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTI2MVxyXG4qIEZpbmFsaXplIG90aGVyIGFzc2V0cyBhbmQgbGlhYmlsaXRpZXMgdmlldyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjY0XHJcbiogSW50ZXJjb20gaW50ZWdyYXRpb24gYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNjdcclxuKiBBZGQgZW1wdHkgc3RhdGVzIHRvIGFjY291bnQgc3VtbWFyeSBwYWdlIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNjVcclxuKiBCaWxsaW5nIGJ5IEBTaHBpZ2ZvcmQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjY5XHJcbiogQWRkIGxvYW4gYW5kIGNyZWRpdCBjYXJkIHZpZXdzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNjhcclxuKiBTZXQgMzAwMCBhcyB0aGUgZGVmYXVsdCB3ZWIgcG9ydCBieSBAYWxhZ29zIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTIxNVxyXG4qIEZpeCBhY2NvdW50IHBpbGwgb24gZGFzaGJvYXJkIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNzBcclxuKiBFYXJseSBhY2Nlc3MgYnkgQFNocGlnZm9yZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNzJcclxuKiBCYXNpYyB0cmFkZSBhbmQgaG9sZGluZ3MgdmlldyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjcxXHJcbiogTGluayB0byBDU1YgaW1wb3J0cyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjczXHJcbiogQnVnIGZpeGVzIGZvciBzcGVjaWFsaXplZCBhY2NvdW50IHBhZ2VzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNzVcclxuKiBGaXggY3VycmVuY3kgZm9ybWF0dGluZyBmb3IgMCB2YWx1ZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTI3NlxyXG4qIEZpeCBncm91cCB0cmVuZCBjb2xvciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjc3XHJcbiogZml4OiB1c2UgY29ycmVjdCBkZWxpbWl0ZXIgb24gY3JlZGl0IGNhcmQgemVybyB2YWx1ZXMgYnkgQGdhcmlhc2YgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjgwXHJcbiogZml4OiBhbWVuZCBpbnB1dHMgb24gbG9hbiwgYy5jLiwgdmVoaWNsZSwgYW5kIHByb3BlcnR5IHBhcnRpYWxzIGJ5IEBnYXJpYXNmIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTI4MVxyXG4qIEJldHRlciBpbXBvcnQgaW5zdHJ1Y3Rpb25zLCByZW1vdmUgYW1iaWd1b3VzIGZpZWxkIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyODRcclxuKiBBbGxvdyBpbmxpbmUgYWNjb3VudCBjcmVhdGlvbiB3aGVuIGltcG9ydGluZyBDU1YgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTI5MVxyXG4qIE1pbm9yIGltcHJvdmVtZW50cyB0byBjYXRlZ29yaWVzICYgY2hhbmdlbG9nIHBhZ2VzIGJ5IEBhcnNlbnN0b3JtIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTI3NFxyXG4qIEhhbmRsZSBtYXJrZXQgaG9saWRheXMgZHVyaW5nIGhvbGRpbmcgc3luYyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjkyXHJcbiogZml4OiBkZWZhdWx0IHZhbHVlIGlmIHVzZXIncyBuYW1lIGlzbid0IHNldCBieSBAYWptZWVzZTcgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjYyXHJcbiogQWRkIGFkZGl0aW9uYWwgc3VidHlwZXMsIGFkZCBOb25lIG9wdGlvbiwgcHJlZmlsbCBlZGl0IHdpdGggcHJldmlvdXNseSBzZWxlY3RlZCBvcHRpb24uIGJ5IEBhaGF0enoxMSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyODZcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAZ2FyaWFzZiBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyODBcclxuKiBAYXJzZW5zdG9ybSBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNzRcclxuKiBAYWptZWVzZTcgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjYyXHJcbiogQGFoYXR6ejExIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTI4NlxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4xOC4uLnYwLjEuMCIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTc5NTgxNTk4L3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoxMzksIisxIjo4LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6ODYsImNvbmZ1c2VkIjowLCJoZWFydCI6MjIsInJvY2tldCI6MjMsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6N30seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTc4NDY5NDg5IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNzg0Njk0ODkvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTc4NDY5NDg5L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuMTgiLCJpZCI6MTc4NDY5NDg5LCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00S296cHgiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS4xOCIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4xOCIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMTAtMDRUMTk6MDk6NThaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0xMC0wNFQxOToxNDoxOVoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS4xOCIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjE4IiwiYm9keSI6IiMjIENTViBJbXBvcnRzXHJcblxyXG5XZSd2ZSBtYWRlIHNvbWUgYmlnIHVwZGF0ZXMgZm9yIHRoZSBDU1YgaW1wb3J0cyBmZWF0dXJlIPCfjK4g8J+OiSBcclxuXHJcbioqWW91IGNhbiBub3cgaW1wb3J0IHRyYW5zYWN0aW9ucywgdHJhZGVzLCBhY2NvdW50cywgYW5kIGV2ZW4gYW4gb2xkIE1pbnQgZXhwb3J0ISoqXHJcblxyXG5IZXJlJ3MgYSBxdWljayBkZW1vIHRoYXQgc2hvd3MgaG93IGl0IGFsbCB3b3JrczogXHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvZTJlZmY1NWEtM2MzZC00ZTQyLThlNGEtYTk2NjQ0MWRjOWRjXHJcblxyXG5JbiBhZGRpdGlvbiB0byB0aGUgQ1NWIGltcG9ydHMsIHdlIGhhdmUgc2V2ZXJhbCBhcHAgc3RhYmlsaXR5IGZpeGVzIGFuZCBpbXByb3ZlbWVudHMgc3VjaCBhczpcclxuXHJcbi0gYEVVUmAgY3VycmVuY2llcyBhbmQgZGF0ZXMgYXJlIG5vdyBmb3JtYXR0ZWQgY29ycmVjdGx5IGJhc2VkIG9uIHVzZXIgbG9jYWxlXHJcbi0gVGhlIHRyYW5zYWN0aW9ucyBwYWdlIG5vdyBoYXMgYSBjb21wbGV0ZWQgbGlzdCBvZiBmaWx0ZXJzIHNvIHlvdSBjYW4gZmluZCB5b3VyIHRyYW5zYWN0aW9ucyBlYXNpZXJcclxuXHJcbiMjIFdoYXQncyBDaGFuZ2VkXHJcblxyXG4qIEZpeCBzdHlsZXMgb24gaW1wb3J0IG1vZGFsIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExODhcclxuKiBBZGQgZXJyb3IgaGFuZGxpbmcgZm9yIHZlaGljbGUgYW5kIHByb3BlcnR5IGFjY291bnQgY3JlYXRpb24gYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExNzlcclxuKiBGaW5pc2ggcmVtYWluaW5nIHRyYW5zYWN0aW9uIGZpbHRlcnMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE4OVxyXG4qIEZpbmFsaXplIHRyYW5zYWN0aW9uIGRyYXdlciwgc2ltcGxpZnkgbW9uZXkgZm9ybSBoZWxwZXJzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExOTFcclxuKiBGaW5hbGl6ZSBwcm9maWxlIHNldHRpbmdzIHBhZ2UgZm9yIHYwLjIuMC1hbHBoYSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTk0XHJcbiogRml4OiBFc2NhcGUgYnV0dG9uIG5vdCBiZWluZyBoYW5kbGVkIG9uIHNldHRpbmdzIHBhZ2VzIGJ5IEBqZXN0aW5qb3NoaSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyMTBcclxuKiBDU1YgSW1wb3J0cyBPdmVyaGF1bCAoVHJhbnNhY3Rpb25zLCBUcmFkZXMsIEFjY291bnRzLCBhbmQgTWludCBpbXBvcnQgc3VwcG9ydCkgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTIwOVxyXG4qIFNvcnQgY3VycmVuY2llcyBieSBuYW1lIGFzIGEgc2Vjb25kIG9yZGVyIGJ5IEBhbGFnb3MgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjE2XHJcbiogRml4IGluY29ycmVjdCBwYXJ0aWFsIHN5bmMgYmFsYW5jZSBnZW5lcmF0aW9uIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyMjNcclxuKiBGaXggaW1wb3J0IG1pZ3JhdGlvbiBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjI3XHJcbiogQWRkIFN5bnRoIHByb3ZpZGVyIHRvIHNlbGYgaG9zdCBzZXR0aW5nIHBhZ2UgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTIzMFxyXG4qIEFsbG93IHVzZXJzIHRvIHNldCBwcmVmZXJyZWQgbG9jYWxlIGluIHNldHRpbmdzIGFuZCBwcm92aWRlIGJhc2ljIGRhdGUgYW5kIHRpbWUgbG9jYWxpemF0aW9uIHN1cHBvcnQgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTIyNlxyXG4qIEFkZCBmb3JtYXR0aW5nIGZvciBFVVIgbG9jYWxlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjMxXHJcbiogVXNlIERCIGZvciBhdXRoIHNlc3Npb25zIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyMzNcclxuKiBGaXggc2lnbmFnZSBvbiB0cmFuc2FjdGlvbiBpbXBvcnRzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyMzZcclxuKiBBZGQgdGFnIGZpbHRlcmluZyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMjQwXHJcbiogSGFuZGxlIG1pc3Npbmcgd2Vla2VuZCBzdG9jayBwcmljZXMgaW4gc3luYyBwcm9jZXNzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEyNDJcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAYWxhZ29zIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTIxNlxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4xNy4uLnYwLjEuMC1hbHBoYS4xOCIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTc4NDY5NDg5L3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjozMSwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjoyMCwiY29uZnVzZWQiOjAsImhlYXJ0Ijo0LCJyb2NrZXQiOjcsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6NH0seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTc1MDQxNTU4IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNzUwNDE1NTgvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTc1MDQxNTU4L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuMTciLCJpZCI6MTc1MDQxNTU4LCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00S2J1d1ciLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS4xNyIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4xNyIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDktMTNUMjE6MjQ6NDZaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wOS0xM1QyMToyODo0NloiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS4xNyIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjE3IiwiYm9keSI6IiMjIFNlbGYgSG9zdGVkIE1heWJlIEluc3RhbmNlcyBjYW4gbm93IGJsb2NrIG5ldyByZWdpc3RyYXRpb25zXHJcblxyXG5UaGlzIHJlbGVhc2UgY29tZXMgd2l0aCB0b25zIG9mIGxpdHRsZSBVSSBpbXByb3ZlbWVudHMsIGJ1ZyBmaXhlcywgYW5kIG1vc3QgaW1wb3J0YW50bHksIHRoZSBhYmlsaXR5IHRvIGJsb2NrIHVzZXIgcmVnaXN0cmF0aW9ucyBvbiB5b3VyIHNlbGYgaG9zdGVkIE1heWJlIGluc3RhbmNlISDwn46JIFxyXG5cclxuQmlnIFMvTyB0byBAdG9ueXZpbmNlIGZvciBnZXR0aW5nIHRoaXMgaW1wbGVtZW50ZWQuICBIZXJlJ3MgYSBxdWljayBkZW1vIG9mIGhvdyB5b3UgY2FuIGJsb2NrIHNpZ251cHMgdG8geW91ciBpbnN0YW5jZSB3aXRoIGludml0ZSBjb2RlczpcclxuXHJcbmh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0cy9lNGRhOWZkZC1hNzZmLTRlZDAtODQzMC1iODZlNzFkYmYzMjBcclxuXHJcbiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogRml4IHVuYWJsZSB0byBjcmVhdGUgRGVwb3NpdCBlbnRyaWVzIGluIGludmVzdG1lbnQgcG9ydGZvbGlvIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTI1XHJcbiogRml4IGFjY291bnQgc3luYyB3aGVuIHByaWNlcyBtaXNzaW5nIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTI3XHJcbiogRml4IGFjY291bnQgdHJhbnNhY3Rpb24gZm9ybSByZXNldHRpbmcgYW1vdW50IHRvIDAgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEzM1xyXG4qIEZpeCBtZXJjaGFudHMgY29sb3IgcGlja2VyIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMzRcclxuKiBDYXRlZ29yaWVzLCB0YWdzLCBtZXJjaGFudHMsIGFuZCBtZW51cyBpbXByb3ZlbWVudHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEzNVxyXG4qIFJlbW92ZSB1bnVzZWQgc2V0dGluZ3MgdGVtcG9yYXJpbHkgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEzNlxyXG4qIEZlZWRiYWNrIHBhZ2UgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE2MFxyXG4qIEZpeCB2YWx1YXRpb24gZnJhbWUgaXNzdWUgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE2MlxyXG4qIENvbnNvbGlkYXRlIHRyYW5zYWN0aW9uIG1lbnUgaXRlbXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE2NFxyXG4qIFVwZGF0ZSBlbXB0eSBhY2NvdW50IHN0YXRlcyBvbiBkYXNoYm9hcmQgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE2NlxyXG4qIEZpeDogV2hlbiB0cmFuc2FjdGlvbiBkcmF3ZXIgY2xvc2VkLCB0dXJibyBmcmFtZSByZW5kZXJzIGJlbG93IG1haW4gY29udGVudCBieSBAamVzdGluam9zaGkgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTY3XHJcbiogQWRkIHNldHRpbmcgdG8gZGlzYWJsZSBuZXcgdXNlciByZWdpc3RyYXRpb24gb24gc2VsZi1ob3N0ZWQgaW5zdGFuY2VzIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTYzXHJcbiogRml4IGd1aWRlIHRleHQgZnJvbSBcInJlZ2lzdGVyXCIgdG8gXCJjcmVhdGUgYW4gYWNjb3VudFwiIGJ5IEB2YWxsZXp3IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE2OFxyXG4qIEFkZCBzeW5jIHN0YXR1cyBhbmQgZXJyb3JzIHRvIGFjY291bnQgc2V0dGluZ3MgcGFnZSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTY5XHJcbiogRml4IG1pc3Npbmcgc3luY19hbGxfYnV0dG9uIHBhcnRpYWwgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExNzJcclxuKiBPbWl0IHRyZW5kIGlmIHplcm8gaW4gc2lkZWJhciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTczXHJcbiogU3VwcG9ydCBtdWx0aS1jdXJyZW5jeSB0cmFuc2ZlcnMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE3NVxyXG4qIEFsbG93IHBhcnRpYWwgaW52ZXN0bWVudCBxdWFudGl0aWVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExNzRcclxuKiBUcmFuc2FjdGlvbiBwYWdlIGRlc2lnbiBmaXhlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTc2XHJcbiogQWRkIGJhc2ljIHNlbGYgaG9zdGVkIG9uYm9hcmRpbmcgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTE3N1xyXG5cclxuIyMgTmV3IENvbnRyaWJ1dG9yc1xyXG4qIEBqZXN0aW5qb3NoaSBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExNjdcclxuKiBAdmFsbGV6dyBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExNjhcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMTYuLi52MC4xLjAtYWxwaGEuMTciLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3NTA0MTU1OC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MjksIisxIjo2LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MCwiY29uZnVzZWQiOjAsImhlYXJ0Ijo3LCJyb2NrZXQiOjEzLCJleWVzIjozfSwibWVudGlvbnNfY291bnQiOjR9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MTY4NDg3MCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTcxNjg0ODcwL2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MTY4NDg3MC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjE2IiwiaWQiOjE3MTY4NDg3MCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEtPN1FHIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuMTYiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuMTYiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTA4LTIzVDE0OjM5OjE0WiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMDgtMjNUMTQ6NDQ6MTVaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4xLjAtYWxwaGEuMTYiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS4xNiIsImJvZHkiOiJUaGlzIHdlZWsncyByZWxlYXNlIGNvbWVzIHdpdGggYSB2YXJpZXR5IG9mIGJ1ZyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIHRoZSBVSS5cclxuXHJcbkFkZGl0aW9uYWxseSwgdXNlcnMgY2FuIG5vdyBpbnB1dCBkZXRhaWxzIGZvciB0aGVpciBwcm9wZXJ0eSBhbmQgdmVoaWNsZSBhY2NvdW50cyBhcyBzaG93biBpbiB0aGUgdmlkZW8gYmVsb3cuICBJbiB0aGUgbmVhciBmdXR1cmUsIE1heWJlIHdpbGwgc3VwcG9ydCBkYXRhIHByb3ZpZGVycyByZWxhdGVkIHRvIHRoZSBcInZhbHVhdGlvblwiIG9mIHByb3BlcnRpZXMgYW5kIHZlaGljbGVzIChpLmUuIFppbGxvdywgS0JCKS4gIFdlIHdpbGwgdXNlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHVzZXIgYWNjb3VudHMgdG8gYXV0b21hdGljYWxseSBmZXRjaCBlc3RpbWF0ZWQgbWFya2V0IHZhbHVlcyBmb3IgdGhlc2UgYXNzZXRzIHdoaWNoIHdpbGwgdGhlbiBiZSBhZGRlZCBwZXJpb2RpY2FsbHkgYXMgXCJWYWx1YXRpb25zXCIgaW4gdGhlIHZhbHVlIHRhYiBvZiBlYWNoIGFjY291bnQuICBUaGlzIHdpbGwgdGhlbiBzaG93IHVwIGluIHRoZSBoaXN0b3J5IGdyYXBoIGZvciB0aGUgYWNjb3VudCBiYWxhbmNlLlxyXG5cclxuaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzL2ZkNzU5YzgyLWEyNWMtNGM4ZC04ZjE2LWY1NzdlMDQxMGZiNVxyXG5cclxuIyMgV2hhdCdzIENoYW5nZWRcclxuXHJcbiogUmVmYWN0b3I6IEFsbG93IG90aGVyIGltcG9ydCBmaWxlcyBieSBAcGVkcm9jYXJtb25hIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA5OVxyXG4qIEJ1bXAgc2VudHJ5LXJ1YnkgZnJvbSA1LjE4LjIgdG8gNS4xOS4wIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEwOFxyXG4qIEJ1bXAgc3RpbXVsdXMtcmFpbHMgZnJvbSAxLjMuMyB0byAxLjMuNCBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMDZcclxuKiBCdW1wIGF3cy1zZGstczMgZnJvbSAxLjE1Ny4wIHRvIDEuMTU4LjAgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTA1XHJcbiogQnVtcCBydWJ5LWxzcC1yYWlscyBmcm9tIDAuMy4xMiB0byAwLjMuMTMgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTA3XHJcbiogQnVtcCBwcm9wc2hhZnQgZnJvbSAwLjkuMCB0byAwLjkuMSBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMDRcclxuKiBCdW1wIGdvb2Rfam9iIGZyb20gNC4xLjEgdG8gNC4yLjAgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTAyXHJcbiogQnVtcCB0YWlsd2luZGNzcy1yYWlscyBmcm9tIDIuNy4yIHRvIDIuNy4zIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTEwM1xyXG4qIEZpeCBxdWVyeSB3aGVuIGFjY291bnQgaGFzIHplcm8gaW5jb21lIGFuZCBleHBlbnNlIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMTJcclxuKiBGaXggaG9sZGluZyBuYW1lIGVycm9yIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMTNcclxuKiBBZGQgUHJvcGVydHkgRGV0YWlscyBWaWV3IGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzExMTZcclxuKiBCYXNpYyBWZWhpY2xlIFZpZXcgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTExN1xyXG4qIFJ1Ym9jb3AgdXBkYXRlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMTE4XHJcbiogRml4IGZpbGUgdXBsb2FkIFVJIG9wZW5pbmcgdHdpY2UgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTExOVxyXG5cclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMTUuLi52MC4xLjAtYWxwaGEuMTYiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MTY4NDg3MC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MjMsIisxIjoxMCwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjAsImNvbmZ1c2VkIjowLCJoZWFydCI6MCwicm9ja2V0IjoxMCwiZXllcyI6M30sIm1lbnRpb25zX2NvdW50IjozfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNzA2NTU5MjQiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MDY1NTkyNC9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNzA2NTU5MjQvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS4xNSIsImlkIjoxNzA2NTU5MjQsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInVzZXJfdmlld190eXBlIjoicHVibGljIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRLTEFDMCIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjE1IiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjE1IiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wOC0xNlQyMDowOTozN1oiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA4LTE2VDIwOjE4OjIyWiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjE1IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTUiLCJib2R5IjoiVGhpcyB3ZWVrLCB3ZSByZWxlYXNlZCB0aGUgZmlyc3QgdmVyc2lvbiBvZiBhbiBpc3N1ZSB0cmFja2luZyBzeXN0ZW0gZGlyZWN0bHkgd2l0aGluIHRoZSBNYXliZSBhcHAhXHJcblxyXG5XaHk/XHJcblxyXG5BcyBhbiBvcGVuLXNvdXJjZSBwZXJzb25hbCBmaW5hbmNlIGFwcCwgTWF5YmUgaGFzIGEgbXVjaCBsYXJnZXIgXCJzZWxmIHNlcnZpY2VcIiBjb21wb25lbnQgdGhhbiBtb3N0IGFwcGxpY2F0aW9ucy4gIFdoaWxlIHdlJ3JlIGluIHRoZSBlYXJseSBkYXlzLCB0aGUgZ29hbCBpcyB0byBzdXBwb3J0IGEgZ2xvYmFsIHVzZXIgYmFzZSwgd2hpY2ggbWVhbnMgd2UgaGF2ZSB0byBzdXBwb3J0IF9hIGxvdF8gb2YgZGF0YSBwcm92aWRlcnMuXHJcblxyXG5FYWNoIGRhdGEgcHJvdmlkZXIgY29tZXMgd2l0aCBpdHMgb3duIHNldCBvZiBudWFuY2VzIGFuZCBlcnJvcnMgdGhhdCBjYW4gYmUgY2hhbGxlbmdpbmcgdG8gZGVidWc7IGVzcGVjaWFsbHkgZm9yIG91ciBzbWFsbCB0ZWFtIHRoYXQgZG9lc24ndCBoYXZlIGFjY2VzcyB0byB5b3VyIHNlbGYgaG9zdGVkIGNvbmZpZ3VyYXRpb24uICBXaGVuIHRoaW5ncyBnbyB3cm9uZywgdGhlcmUgYXJlIGEgaGFuZGZ1bCBvZiBwb3NzaWJsZSBjYXVzZXMuXHJcblxyXG5JbiBvcmRlciB0byBjb21iYXQgdGhpcywgdGhlIGB2MC4xLjAtYWxwaGEuMTVgIHJlbGVhc2UgaW50cm9kdWNlcyBhIFwic2VsZiByZXNvbHV0aW9uXCIgaXNzdWUgdHJhY2tpbmcgc3lzdGVtLiAgVGhlIHZpZGVvIGJlbG93IGRlbW9uc3RyYXRlcyBob3cgYSB1c2VyIHdobyBoYXMgaW5jb3JyZWN0bHkgY29uZmlndXJlZCB0aGVpciBleGNoYW5nZSByYXRlcyBwcm92aWRlciBjYW4gKippZGVudGlmeSwgZGlhZ25vc2UsIGFuZCBmaXggdGhlIGlzc3VlIGFsbCB3aXRoaW4gdGhlIE1heWJlIGFwcCoqOlxyXG5cclxuaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzLzdjYzk4Yzc5LTliNzItNDI2MC1iYzE3LTkwN2JjMzNiMTM5MFxyXG5cclxuIyMgV2hhdCdzIENoYW5nZWRcclxuKiBEZXBvc2l0LCBXaXRoZHJhd2FsLCBhbmQgSW50ZXJlc3QgVHJhbnNhY3Rpb25zIGZvciBJbnZlc3RtZW50IFZpZXcgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA3NVxyXG4qIEJ1bXAgdGFpbHdpbmRjc3MtcmFpbHMgZnJvbSAyLjYuNSB0byAyLjcuMiBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNzhcclxuKiBCdW1wIGJvb3RzbmFwIGZyb20gMS4xOC4zIHRvIDEuMTguNCBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNzlcclxuKiBCdW1wIHJ1YnktbHNwLXJhaWxzIGZyb20gMC4zLjExIHRvIDAuMy4xMiBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwODFcclxuKiBSZWZhY3RvcjogVXNlIG5hdGl2ZSBlcnJvciBpMThuIGxvb2t1cCBieSBAcGVkcm9jYXJtb25hIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA3NlxyXG4qIEJ1bXAgcmFpbHMgZnJvbSBgNDM1MzBiNGAgdG8gYGY2ZDYyYjVgIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA4M1xyXG4qIEZpeDogaTE4biBzeW1ib2wgdHlwbyBieSBAcGVkcm9jYXJtb25hIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA4NVxyXG4qIEJ1bXAgcnVieSBmcm9tIDMuMy4xIHRvIDMuMy40IGJ5IEBDbHVzdGVyNDQ0IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA4NFxyXG4qIEZpeCBmb3IgaW52YWxpZCBhY2NvdW50YWJsZSBkYXRhIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwODZcclxuKiBhZGQgcGFnaW5hdGlvbiB0byBhY2NvdW50IHRyYW5zYWN0aW9ucyBsaXN0IGJ5IEBjb2RlLWNvbnN0cnVjdG9yIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA5NVxyXG4qIEFjY291bnQgSXNzdWUgTW9kZWwgYW5kIFJlc29sdXRpb24gRmxvdyArIFRyb3VibGVzaG9vdGluZyBndWlkZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA5MFxyXG4qIEFkZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgY29sdW1uIHNlcGFyYXRvciBpbiBjc3YgaW1wb3J0IGxvZ2ljIGJ5IEBjb2RlLWNvbnN0cnVjdG9yIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA5NlxyXG4qIEltcHJvdmVkIFVJIHdhcm5pbmcgc3RhdGVzIGZvciBob2xkaW5ncyB3aXRoIG1pc3NpbmcgZGF0YSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDk4XHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQHBlZHJvY2FybW9uYSBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNzZcclxuKiBAQ2x1c3RlcjQ0NCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwODRcclxuKiBAY29kZS1jb25zdHJ1Y3RvciBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwOTVcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMTQuLi52MC4xLjAtYWxwaGEuMTUiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE3MDY1NTkyNC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MTEsIisxIjoxMSwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjAsImNvbmZ1c2VkIjowLCJoZWFydCI6MCwicm9ja2V0IjowLCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjV9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2OTU5MTAyOSIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY5NTkxMDI5L2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2OTU5MTAyOS9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjE0IiwiaWQiOjE2OTU5MTAyOSwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEtHOEQxIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuMTQiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuMTQiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTA4LTA5VDIxOjQyOjQ4WiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMDgtMDlUMjE6NDk6MjBaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4xLjAtYWxwaGEuMTQiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS4xNCIsImJvZHkiOiJCYXNpYyBpbnZlc3RtZW50IHBvcnRmb2xpb3MgYXJlIGhlcmUhIPCfpbMgXHJcblxyXG5XaGlsZSB3ZSdyZSBzdGlsbCBpbiB0aGUgdmVyeSBlYXJseSBkYXlzIGZvciBpbnZlc3RtZW50IGFjY291bnRzLCB0aGlzIHdlZWsgY2FwcGVkIG9mZiBzb21lIHJlYWxseSBpbXBvcnRhbnQgYWRkaXRpb25zIHRvIHRoZSBpbnZlc3RtZW50IGFjY291bnQgcGFnZSB2aWV3LlxyXG5cclxuVXNlcnMgY2FuIG5vdzpcclxuXHJcbi0gU2VlIGEgYnJlYWtkb3duIG9mIHRoZWlyIGNhc2ggKyBob2xkaW5ncyBiYWxhbmNlIGluIGEgdG9vbHRpcFxyXG4tIEFkZCBidXkvc2VsbCBpbnZlc3RtZW50IHRyYWRlcyB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBzeW5jIGFuZCByZWJ1aWxkIHRoZWlyIHBvcnRmb2xpbyBhbmQgaGlzdG9yaWNhbCBncmFwaFxyXG5cclxuTW92aW5nIGZvcndhcmQsIHdlJ2xsIGJlIHJlZmluaW5nIGFuZCBhZGRpbmcgdG8gdGhlIGludmVzdG1lbnQgcG9ydGZvbGlvIGZlYXR1cmUgYW5kIGNvbXBsZW1lbnRpbmcgaXQgd2l0aCB0cm91Ymxlc2hvb3RpbmcgZ3VpZGVzIHNvIHlvdSBrbm93IGV4YWN0bHkgd2hhdCdzIGNhdXNpbmcgYW55IGRpc2NyZXBhbmNpZXMgYmV0d2VlbiBNYXliZSdzIGNhbGN1bGF0aW9ucyBhbmQgeW91ciBicm9rZXJhZ2UncyBjYWxjdWxhdGlvbnMuXHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvZjRjOGJjNjUtMzFmNi00NjI3LWI0ZTctNDc3ZDA2ODdjNTcwXHJcblxyXG4jIyBXaGF0J3MgQ2hhbmdlZFxyXG5cclxuKiBCdW1wIHRhaWx3aW5kY3NzLXJhaWxzIGZyb20gMi42LjQgdG8gMi42LjUgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDU4XHJcbiogQnVtcCBmYXJhZGF5IGZyb20gMi4xMC4wIHRvIDIuMTAuMSBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNTVcclxuKiBCdW1wIGVyYl9saW50IGZyb20gMC41LjAgdG8gMC42LjAgYnkgQGRlcGVuZGFib3QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDU3XHJcbiogQnVtcCBhd3Mtc2RrLXMzIGZyb20gMS4xNTYuMCB0byAxLjE1Ny4wIGJ5IEBkZXBlbmRhYm90IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA1NFxyXG4qIEJ1bXAgZ29vZF9qb2IgZnJvbSA0LjEuMCB0byA0LjEuMSBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNTNcclxuKiBCdW1wIHBhZ3kgZnJvbSA5LjAuMyB0byA5LjAuNSBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNTZcclxuKiBCdW1wIHJhaWxzIGZyb20gYDVjYjVjYWRgIHRvIGA0MzUzMGI0YCBieSBAZGVwZW5kYWJvdCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNTlcclxuKiBBZGQgc291cmNlIGhlYWRlcnMgdG8gU3ludGggY2FsbHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA2MlxyXG4qIEFkZCBzdGltdWx1cyB0b29sdGlwIGNvbnRyb2xsZXIgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNjVcclxuKiBGZXRjaCBleGNoYW5nZSByYXRlcyBpbiBidWxrIGZyb20gc3ludGggYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwNjlcclxuKiBGaXggbWluaXRlc3QgYXNzZXJ0X25pbCB3YXJuaW5nIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDcwXHJcbiogQWxsb3cgdXNlciB0byBhZGQgYnV5IGFuZCBzZWxsIHRyYWRlIHRyYW5zYWN0aW9ucyBmb3IgaW52ZXN0bWVudCBhY2NvdW50cyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDY2XHJcbiogVGVtcCBmaXggZm9yIG1pc3NpbmcgYWNjb3VudGFibGVzIG9uIHNlbGYgaG9zdGVkIGluc3RhbmNlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDcxXHJcblxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4xMy4uLnYwLjEuMC1hbHBoYS4xNCIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY5NTkxMDI5L3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoxNiwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjoxNiwiY29uZnVzZWQiOjAsImhlYXJ0IjowLCJyb2NrZXQiOjAsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6M30seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY4NTEwNTU5IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjg1MTA1NTkvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY4NTEwNTU5L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuMTMiLCJpZCI6MTY4NTEwNTU5LCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00S0MwUmYiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS4xMyIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4xMyIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDgtMDJUMjE6MTA6MTZaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wOC0wMlQyMToxMDo1OVoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS4xMyIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjEzIiwiYm9keSI6IkNvbWluZyBvZmYgdGhlIGJhY2sgb2YgbGFzdCB3ZWVrJ3MgcmVsZWFzZSB3aGljaCBpbnRyb2R1Y2VkIGJhc2ljIGludmVzdG1lbnQgcG9ydGZvbGlvIHZpZXdzIGFuZCB0aGUgYWJpbGl0eSB0byBzeW5jIGludmVzdG1lbnQgaG9sZGluZ3MsIHRoaXMgd2VlaydzIHJlbGVhc2UgaW50cm9kdWNlcyBmdWxsIHN1cHBvcnQgZm9yIHN0b2NrIHByaWNlcyB3aXRoIHRoZSBbU3ludGggQVBJXShodHRwczovL3N5bnRoZmluYW5jZS5jb20vKSEgKHdoaWNoIGhhcyBhIGdlbmVyb3VzIGZyZWUgdGllciB0byBnZXQgc3RhcnRlZClcclxuXHJcblRoaXMgbWVhbnMgdGhhdCBpbnZlc3RtZW50IGFjY291bnQgdmlld3MgY2FuIG5vdyBwcm9wZXJseSBjYWxjdWxhdGUgYW5kIHNob3cgYW4gYWdncmVnYXRlZCBtYXJrZXQgdmFsdWUgb2YgYWxsIHRoZSBpbnZlc3RtZW50cyBpbiBpdCBhbmQgZ3JhY2VmdWxseSBoYW5kbGUgbWlzc2luZyBzdG9jayBwcmljZXMuXHJcblxyXG5JbiBhIGZ1dHVyZSByZWxlYXNlLCB1c2VycyB3aWxsIGhhdmUgZnVsbCBjb250cm9sIHRvIGNyZWF0ZSBidXkgJiBzZWxsIHRyYWRlcywgbWFuYWdlIHRoZWlyIGludmVzdG1lbnQgcG9ydGZvbGlvLCBhbmQgc2VlIHRvdGFsIHJldHVybnMgb3ZlciB2YXJpb3VzIHRpbWUgcGVyaW9kcyBhbG9uZ3NpZGUgdGhlaXIgaGlzdG9yaWNhbCB2YWx1ZSBncmFwaC5cclxuXHJcbmh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0cy9jMzliMTcwNi05N2E3LTRlM2UtYjU2OC05ZDliMDllMzhlMDVcclxuXHJcbiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogRml4OiBPbWl0IGxheW91dCBmb3IgdHVyYm8gZnJhbWVzIHdpdGggY3VzdG9tIHNpZGViYXIgbGF5b3V0IGJ5IEBwcmFuYXZiYWJ1IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAyNFxyXG4qIGZpeDogbG9uZyBlbWFpbHMgb3ZlcmZsb3cgaW4gYWNjb3VudCBtZW51IGRyb3Bkb3duIGJ5IEBNaWtoYWlsV2FoaWIgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDM0XHJcbiogRml4IGRlbW8gZGF0YSByZXNldCBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA0MVxyXG4qIEVuc3VyZSB0cmFuc2ZlciBuYW1lIGlzIHBvcHVsYXRlZCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDQyXHJcbiogQWRkIHNlY3VyaXR5IHByaWNlcyBwcm92aWRlciAoU3ludGggaW50ZWdyYXRpb24pIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMzlcclxuKiBTaG93IGNhc2ggKyBob2xkaW5ncyB2YWx1ZSBmb3IgaW52ZXN0bWVudCBhY2NvdW50IHZpZXcgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTA0NlxyXG5cclxuIyMgTmV3IENvbnRyaWJ1dG9yc1xyXG4qIEBwcmFuYXZiYWJ1IG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAyNFxyXG4qIEBNaWtoYWlsV2FoaWIgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDM0XHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjEyLi4udjAuMS4wLWFscGhhLjEzIiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjg1MTA1NTkvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjMwLCIrMSI6NCwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjEzLCJjb25mdXNlZCI6MCwiaGVhcnQiOjYsInJvY2tldCI6NywiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50Ijo0fSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjczODIyNzciLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NzM4MjI3Ny9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjczODIyNzcvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS4xMiIsImlkIjoxNjczODIyNzcsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInVzZXJfdmlld190eXBlIjoicHVibGljIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKLWcwRiIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjEyIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjEyIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNy0yNlQxNDo0ODoyMVoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA3LTI2VDE0OjUwOjM2WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjEyIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTIiLCJib2R5IjoiIyMgV2hhdCdzIENoYW5nZWRcclxuKiBTZXQgbGFzdF9sb2dpbl9hdCBvbmx5IG9uIGxvZ2luIGluc3RlYWQgb2YgZXZlcnkgc2luZ2xlIGFjdGlvbiBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAxN1xyXG4qIEJ1bXAgcGFneSB3aXRoIGZpeCBmb3IgYnJlYWtpbmcgY2hhbmdlcyAgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMTZcclxuKiBGaXggZm9ybSBsYWJlbHMgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMDRcclxuKiBGaXggY3VyZW5jeSBmb3JtYXQgYnkgQEp1bGl1c01pZWxpYXVza2FzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAyMFxyXG4qIEltcGxlbWVudCBhdXRvIGZhbWlseSBzeW5jcyBvbiBsb2dpbiBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDIxXHJcbiogQmFzaWMgUG9ydGZvbGlvIFZpZXdzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzEwMDBcclxuKiBGaXggY3VycmVuY3kgZm9ybWF0dGluZyBpbiBwaWUgY2hhcnQgdmlzdWFsaXphdGlvbiBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDIyXHJcbiogU2V0IG1pbmltdW0gc3VwcG9ydGVkIGRhdGUgZm9yIGFjY291bnQgZW50cmllcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC8xMDIzXHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQEp1bGl1c01pZWxpYXVza2FzIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvMTAyMFxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4xMS4uLnYwLjEuMC1hbHBoYS4xMiIsIm1lbnRpb25zX2NvdW50IjozfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjYyOTY5NTMiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NjI5Njk1My9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjYyOTY5NTMvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS4xMSIsImlkIjoxNjYyOTY5NTMsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInVzZXJfdmlld190eXBlIjoicHVibGljIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKNlgxNSIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjExIiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjExIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNy0xOVQyMDowOTowNVoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA3LTE5VDIwOjA5OjM4WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjExIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMTEiLCJib2R5IjoiIyMgV2hhdCdzIENoYW5nZWRcclxuKiBXcmFwIGFjY291bnQgdXBkYXRlIGluIGEgdHJhbnNhY3Rpb24gYnkgQGFjY2Vzc2QgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85ODVcclxuKiBBbGxvdyBDU1YgZmlsZSB1cGxvYWQgaW4gaW1wb3J0IGZsb3cgYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk4NlxyXG4qIFNhbml0aXplIGlucHV0IGZvciBpbGlrZSBpbiBBY2NvdW50OjpFbnRyeS5zZWFyY2ggYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk4OFxyXG4qIEludmVzdG1lbnQgUG9ydGZvbGlvIFN5bmMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTc0XHJcbiogTW9yZSBjb21wb3NhYmxlIGZvcm1zIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk4OVxyXG4qIEFkZCBkZWZhdWx0IGN1cnJlbmNpZXMgdG8gZm9ybXMgYmFzZWQgb24gcHJlZmVyZW5jZSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85OTRcclxuKiBCdWlsZCBzYW1wbGUgcG9ydGZvbGlvIGRldGVybWluaXN0aWNhbGx5IGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk5M1xyXG4qIEFkZCBjdXJyZW5jeSB2YWxpZGF0aW9uIHRvIGFjY291bnQsIHVwZGF0ZSBkZW1vIGRhdGEgZ2VuZXJhdG9yIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk5NlxyXG4qIFN5bmMgbm90aWZpY2F0aW9ucyBhbmQgdHJvdWJsZXNob290aW5nIGd1aWRlcyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85OThcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAYWNjZXNzZCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk4NVxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS4xMC4uLnYwLjEuMC1hbHBoYS4xMSIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY2Mjk2OTUzL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoxNCwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjAsInJvY2tldCI6MTQsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6M30seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY1MjYzMzI0IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjUyNjMzMjQvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY1MjYzMzI0L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuMTAiLCJpZCI6MTY1MjYzMzI0LCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00SjJiZmMiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS4xMCIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4xMCIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDctMTJUMjI6Mzg6MTdaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNy0xMlQyMjozOToxMVoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS4xMCIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjEwIiwiYm9keSI6IiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogQWRkIGVycm9yIGhhbmRsaW5nIGZvciBBY2NvdW50c0NvbnRyb2xsZXIjY3JlYXRlIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85NTdcclxuKiBmaXg6ICM5NTEgcG9pbnRlciBjdXJzb3IgYW5kIGJnIGhvdmVyIGZvciBpbXBvcnQgZmxvdyBidXR0b25zIGJ5IEBNYWdudXNISmVuc2VuIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTU0XHJcbiogSGFuZGxlIG1pc3NpbmcgZXhjaGFuZ2UgcmF0ZSBwcm92aWRlciwgYWxsb3cgZmFsbGJhY2sgZm9yIG1pc3NpbmcgcmF0ZXMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTU1XHJcbiogQWRkIG1pc3NpbmcgbWlncmF0aW9ucyBmb3IgZ29vZF9qb2IgNHggYnkgQHRvbnl2aW5jZSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk2N1xyXG4qIEFjY291bnQ6OlN5bmMgbW9kZWwgYW5kIHRlc3QgZml4dHVyZSBzaW1wbGlmaWNhdGlvbnMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTY4XHJcbiogRGVtbyBGYW1pbHkgZGF0YSB1cGRhdGVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk3MlxyXG4qIE1ha2UgYmFsYW5jZSBlZGl0aW5nIGVhc2llciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85NzZcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBATWFnbnVzSEplbnNlbiBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk1NFxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS45Li4udjAuMS4wLWFscGhhLjEwIiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjUyNjMzMjQvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjcsIisxIjo3LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MCwiY29uZnVzZWQiOjAsImhlYXJ0IjowLCJyb2NrZXQiOjAsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6M30seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY0MTk4ODQ4IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjQxOTg4NDgvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTY0MTk4ODQ4L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuOSIsImlkIjoxNjQxOTg4NDgsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInVzZXJfdmlld190eXBlIjoicHVibGljIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKeVhuQSIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjkiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuOSIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDctMDVUMTg6MTY6NDFaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNy0wNVQxODoxNzoyMloiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS45IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuOSIsImJvZHkiOiIjIyBXaGF0J3MgQ2hhbmdlZFxyXG4qIEFjY291bnQ6OkVudHJ5IERlbGVnYXRlZCBUeXBlIChuYW1lc3BhY2UgdXBkYXRlcyBwYXJ0IDcpIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkyM1xyXG4qIEZpeCBkZWNpbWFsIGRpc3BsYXkgZm9yIGV1cm8gY3VycmVuY3kgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTM3XHJcbiogRW5hYmxlIHVwZGF0aW5nIEFjY291bnQ6OkVudHJ5I2Ftb3VudCBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQyXHJcbiogRml4IGJ1ZyB3aGVyZSB0cmFuc2FjdGlvbnMgd2VyZSBkdXBsaWNhdGVkIGluIGltcG9ydCBjb25maXJtIGJ5IEBsamh1cnN0IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQxXHJcbiogRW5xdWUgYWNjb3VudCBzeW5jIGpvYiBhZnRlciBjcmVhdGluZyB0cmFuc2ZlciBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQ2XHJcbiogRW5hYmxlIHN5bmNpbmcgYWxsIGFjY291bnRzIGluIG9uZSBjbGljayBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTQ4XHJcbiogVXBkYXRlIGRvY2tlciBjb21wb3NlIGV4YW1wbGUgd2l0aCBmaXhlZCBzdG9yYWdlIHZvbHVtZSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85NTBcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAbGpodXJzdCBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzk0MVxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS44Li4udjAuMS4wLWFscGhhLjkiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2NDE5ODg0OC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6OSwiKzEiOjksIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjAsInJvY2tldCI6MCwiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50IjozfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjMwNjU4NDQiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MzA2NTg0NC9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjMwNjU4NDQvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS44IiwiaWQiOjE2MzA2NTg0NCwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEp1Q18wIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuOCIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS44IiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNi0yOFQyMToyMjoyNloiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA2LTI4VDIxOjIzOjMzWiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjgiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS44IiwiYm9keSI6IiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogVW5pZnkgcHJpbWFyeSBidXR0b24gc3R5bGVzIGFuZCBjaGFuZ2UgY3Vyc29yIG9uIGFjY291bnQgZ3JvdXAgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTA1XHJcbiogRml4IGlzc3VlICM4NjE6IENvcnJlY3QgaGVhZGVyIHNlbGVjdGlvbiBsb2dpYyBpbiBnZXRfc2VsZWN0ZWRfaGVhZGVyX2Zvcl9maWVsZCBtZXRob2QgYnkgQGlnb3JjYXJ2YWxoaCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkxOFxyXG4qIEZpeCAjOTEwIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MTdcclxuKiBBY2NvdW50IG5hbWVzcGFjZSB1cGRhdGVzOiBwYXJ0IDYgKHRyYW5zYWN0aW9ucykgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTA0XHJcbiogaW1wcm92ZW1lbnQvIzg5MC9jbGVhbl91cF90b2FzdF9ub3RpZmljYXRpb25fc3R5bGVzX2FuZF9hbGxvd191c2VyX3RvX2Nsb3NlX29uLWRlbWFuZCBieSBAZXZhbmdlbG9zLWNvbSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkxOVxyXG4qIEZpeCAjOTIxIGJ5IEB0b255dmluY2UgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MjJcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAaWdvcmNhcnZhbGhoIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTE4XHJcbiogQGV2YW5nZWxvcy1jb20gbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MTlcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuNy4uLnYwLjEuMC1hbHBoYS44IiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjMwNjU4NDQvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjEyLCIrMSI6OSwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjAsImNvbmZ1c2VkIjowLCJoZWFydCI6MSwicm9ja2V0IjoyLCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjV9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MTc0MjEzMCIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTYxNzQyMTMwL2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MTc0MjEzMC9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjciLCJpZCI6MTYxNzQyMTMwLCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00Sm9fMHkiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS43IiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjciLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTA2LTIxVDIxOjA0OjU5WiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMDYtMjFUMjE6MDg6MDRaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4xLjAtYWxwaGEuNyIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjciLCJib2R5IjoiIyMgV2hhdCdzIENoYW5nZWRcclxuXHJcbk1heWJlIG5vdyBzdXBwb3J0cyB0cmFuc2ZlciBtYXRjaGluZyDwn6WzIPCfjK4gXHJcblxyXG5UaGlzIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgaW5jb21lIGFuZCBleHBlbnNlIGNhbGN1bGF0aW9ucyBieSBleGNsdWRpbmcgdHJhbnNmZXJzIGZyb20gdGhlIGNhbGN1bGF0aW9uOlxyXG5cclxuaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvYXNzZXRzLzE2Njc2MTU3L2ExY2RlNDk0LWI4OWYtNDY2YS04Yzc0LWRhMTk0OTM0Mjg4YVxyXG5cclxuKiBBZGQgbWVyY2hhbnQgc2VsZWN0IHdoZW4gZWRpdGluZyB0cmFuc2FjdGlvbiBieSBAamFrdWJrb3R0bmF1ZXIgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84ODVcclxuKiBUcmFuc2FjdGlvbiB0cmFuc2ZlcnMsIHBheW1lbnRzLCBhbmQgbWF0Y2hpbmcgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODgzXHJcbiogRW5zdXJlIGNvcnJlY3QgZm9ybSdzIGhpZGRlbiBpbnB1dCBmb3Igc2VsZWN0ZWRJZHMgYnkgQHppcmFxeW91bmcgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84OTFcclxuKiBBY2NvdW50IG5hbWVzcGFjZSB1cGRhdGVzOiBwYXJ0IDEgKGFjY291bnRhYmxlIHR5cGVzKSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84OTNcclxuKiBBY2NvdW50IG5hbWVzcGFjZSB1cGRhdGVzOiBwYXJ0IDIgKGNhdGVnb3JpZXMpIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg5NFxyXG4qIEFjY291bnQgbmFtZXNwYWNlIHVwZGF0ZXM6IHBhcnQgMyAobWVyY2hhbnRzKSBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84OTVcclxuKiBBY2NvdW50IG5hbWVzcGFjZSB1cGRhdGVzOiBwYXJ0IDQgKHRyYW5zZmVycywgc2luZ3VsYXIgbmFtZXNwYWNpbmcpIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg5NlxyXG4qIEZpeCBCdWc6IGFmdGVyIGVkaXRpbmcgYW4gYWNjb3VudCBoaXN0b3J5IHZhbHVlLCBpdCByZXF1aXJlcyAyIGNsaWNrcyB0byBjbG9zZSB0aGUgbWVudSBieSBAdG9ueXZpbmNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTAwXHJcbiogZmVhdDogVHJhbnNhY3Rpb24gcGFnaW5hdGlvbiBJbXByb3ZlbWVudHMgYnkgQGthcmFua2lyaSBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg3M1xyXG4qIEZpeCB0cmFuc2ZlciBub3RlIG92ZXJmbG93IHN0eWxlIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzkwMlxyXG4qIEFjY291bnQgbmFtZXNwYWNlIHVwZGF0ZXM6IHBhcnQgNSAodmFsdWF0aW9ucykgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvOTAxXHJcbiogQWxsb3cgdHJhbnNmZXJzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBpbiBkaWZmZXJlbnQgY3VycmVuY2llcyBieSBAamFrdWJrb3R0bmF1ZXIgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MDNcclxuXHJcbiMjIE5ldyBDb250cmlidXRvcnNcclxuKiBAemlyYXF5b3VuZyBtYWRlIHRoZWlyIGZpcnN0IGNvbnRyaWJ1dGlvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg5MVxyXG4qIEB0b255dmluY2UgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC85MDBcclxuKiBAa2FyYW5raXJpIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODczXHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjYuLi52MC4xLjAtYWxwaGEuNyIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTYxNzQyMTMwL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjoyNiwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5Ijo5LCJjb25mdXNlZCI6MCwiaGVhcnQiOjcsInJvY2tldCI6OSwiZXllcyI6MX0sIm1lbnRpb25zX2NvdW50Ijo1fSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjA1NjY0NzEiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE2MDU2NjQ3MS9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNjA1NjY0NzEvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS42IiwiaWQiOjE2MDU2NjQ3MSwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEprZ3pIIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuNiIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS42IiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNi0xNFQyMDo1MDowOFoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA2LTE0VDIxOjAxOjA0WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjYiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS42IiwiYm9keSI6IiMjIFdoYXQncyBDaGFuZ2VkXHJcblxyXG5UaGlzIHJlbGVhc2UgY29tZXMgd2l0aCBhIGNvbXBsZXRlIG92ZXJoYXVsIG9mIG91ciBEb2NrZXIgc2V0dXAgZ3VpZGUsIGJldHRlciBpbnRlcm5hbCBuYXZpZ2F0aW9uLCBhbmQgdGhlIGFiaWxpdHkgdG8gZ3JvdXAgeW91ciBhY2NvdW50cyBieSBmaW5hbmNpYWwgaW5zdGl0dXRpb24hXHJcblxyXG5odHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9hc3NldHMvMTY2NzYxNTcvYmU0ZDFjZTgtNzA1NS00ZjcxLTljM2YtYzliYmM5Y2I0NTFjXHJcblxyXG4qIEltcHJvdmUgYWNjb3VudCBpbnRlcm5hbCBsaW5raW5nIGFuZCByZWRpcmVjdCBiZWhhdmlvciBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NjRcclxuKiBBbGxvdyBmb3Igb3B0aW9uYWwgc3RhcnQgZGF0ZSBvbiBhY2NvdW50IGNyZWF0aW9uIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg2NlxyXG4qIEFkZCBpbnN0aXR1dGlvbiBtYW5hZ2VtZW50IGFuZCBhY2NvdW50IGVkaXRpbmcgY29udHJvbHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODY4XHJcbiogTmV3IERvY2tlciBDb21wb3NlIFNlbGYgSG9zdGluZyBHdWlkZSArIFVJIEZpeGVzIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg3MFxyXG4qIFNpbXBsaWZ5IGFjY291bnQgc3luYyBsb2dpYyBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NzFcclxuKiBDaGFuZ2Vsb2cgcGFnZSB0aGF0IHB1bGxzIGZyb20gR2l0aHViIFJlbGVhc2Ugbm90ZXMgYnkgQG1hdHRpYS1tYWxuaXMgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NjdcclxuXHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjUuLi52MC4xLjAtYWxwaGEuNiIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTYwNTY2NDcxL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjozNiwiKzEiOjI3LCItMSI6MCwibGF1Z2giOjAsImhvb3JheSI6MCwiY29uZnVzZWQiOjAsImhlYXJ0Ijo5LCJyb2NrZXQiOjAsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6Mn0seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU5NDUyMjQ0IiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTk0NTIyNDQvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU5NDUyMjQ0L2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuNSIsImlkIjoxNTk0NTIyNDQsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInVzZXJfdmlld190eXBlIjoicHVibGljIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKZ1F4VSIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjUiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuNSIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDYtMDdUMjM6Mjk6MDFaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNi0wN1QyMzozNDoxMVoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS41IiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuNSIsImJvZHkiOiIjIyBXaGF0J3MgQ2hhbmdlZFxyXG5cclxuQnVsayB0cmFuc2FjdGlvbiBlZGl0aW5nIGFuZCBkZWxldGlvbiBpcyBoZXJlISAgQ2hlY2sgb3V0IHRoZSBkZW1vIGJlbG93OlxyXG5cclxuaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvYXNzZXRzLzE2Njc2MTU3L2Q4YTNhZTM5LTQ5MzEtNDc3NS04Yzc2LTIxMWQ2ZGM5NmJmNlxyXG5cclxuKiBBZGQgYnVsayBzZWxlY3Rpb24gVUkgY29udHJvbHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODQwXHJcbiogQnVsayB0cmFuc2FjdGlvbiBkZWxldGlvbiBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84NDVcclxuKiBCdWxrIGVkaXRpbmcgb2YgdHJhbnNhY3Rpb25zIGJ5IEB6YWNoZ29sbCBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzg0NlxyXG5cclxuKipGdWxsIENoYW5nZWxvZyoqOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9jb21wYXJlL3YwLjEuMC1hbHBoYS40Li4udjAuMS4wLWFscGhhLjUiLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1OTQ1MjI0NC9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6NDgsIisxIjozNSwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjYsImNvbmZ1c2VkIjowLCJoZWFydCI6Nywicm9ja2V0IjowLCJleWVzIjowfSwibWVudGlvbnNfY291bnQiOjF9LHsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1ODM5MDY3MSIsImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU4MzkwNjcxL2Fzc2V0cyIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1ODM5MDY3MS9hc3NldHN7P25hbWUsbGFiZWx9IiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy90YWcvdjAuMS4wLWFscGhhLjQiLCJpZCI6MTU4MzkwNjcxLCJhdXRob3IiOnsibG9naW4iOiJ6YWNoZ29sbCIsImlkIjoxNjY3NjE1Nywibm9kZV9pZCI6Ik1EUTZWWE5sY2pFMk5qYzJNVFUzIiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjY3NjE1Nz92PTQiLCJncmF2YXRhcl9pZCI6IiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS96YWNoZ29sbCIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2dpc3Rzey9naXN0X2lkfSIsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N1YnNjcmlwdGlvbnMiLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvb3JncyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVwb3MiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9ldmVudHN7L3ByaXZhY3l9IiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvcmVjZWl2ZWRfZXZlbnRzIiwidHlwZSI6IlVzZXIiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyIsInNpdGVfYWRtaW4iOmZhbHNlfSwibm9kZV9pZCI6IlJFX2t3RE9LX3R4SE00SmNObVAiLCJ0YWdfbmFtZSI6InYwLjEuMC1hbHBoYS40IiwidGFyZ2V0X2NvbW1pdGlzaCI6Im1haW4iLCJuYW1lIjoidjAuMS4wLWFscGhhLjQiLCJkcmFmdCI6ZmFsc2UsInByZXJlbGVhc2UiOnRydWUsImNyZWF0ZWRfYXQiOiIyMDI0LTA1LTMxVDE4OjA5OjEyWiIsInB1Ymxpc2hlZF9hdCI6IjIwMjQtMDUtMzFUMTg6MTA6MzFaIiwiYXNzZXRzIjpbXSwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvdGFyYmFsbC92MC4xLjAtYWxwaGEuNCIsInppcGJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3ppcGJhbGwvdjAuMS4wLWFscGhhLjQiLCJib2R5IjoiIyMgV2hhdCdzIENoYW5nZWRcclxuKiBmaXg6IHBuZyBmaWxlIGNhbiBiZSBzZWxlY3RlZCBhcyBwcm9maWxlIGltYWdlcyBieSBAcGVhLXN5cyBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzgwOVxyXG4qIFZhbGlkYXRlIHRyYW5zYWN0aW9uIGZpbHRlcmluZyBwYXJhbXMgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODEwXHJcbiogRml4IGZvcmVpZ24gYWNjb3VudCBzeW5jIGNyYXNoIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzc5NFxyXG4qIFNvcnQgYWNjb3VudHMgaW4gdGhlIHNpZGViYXIgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODE1XHJcbiogUmV1c2FibGUgQ0kgd29ya2Zsb3cgZm9yIEdIIGFjdGlvbnMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODE5XHJcbiogVHJhbnNhY3Rpb25zIGNsZWFudXAgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODE3XHJcbiogU3luYyBhY2NvdW50IGFmdGVyIHRyYW5zYWN0aW9uIGltcG9ydCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84MjBcclxuKiBGaXggb3ZlcmZsb3cgZXJyb3Igb24gYWNjb3VudCB2YWx1ZSBpbnB1dHMgYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvODIxXHJcblxyXG4jIyBOZXcgQ29udHJpYnV0b3JzXHJcbiogQHBlYS1zeXMgbWFkZSB0aGVpciBmaXJzdCBjb250cmlidXRpb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC84MDlcclxuXHJcbioqRnVsbCBDaGFuZ2Vsb2cqKjogaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvY29tcGFyZS92MC4xLjAtYWxwaGEuMy4uLnYwLjEuMC1hbHBoYS40IiwicmVhY3Rpb25zIjp7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTgzOTA2NzEvcmVhY3Rpb25zIiwidG90YWxfY291bnQiOjIxLCIrMSI6MCwiLTEiOjAsImxhdWdoIjowLCJob29yYXkiOjIxLCJjb25mdXNlZCI6MCwiaGVhcnQiOjAsInJvY2tldCI6MCwiZXllcyI6MH0sIm1lbnRpb25zX2NvdW50IjozfSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTczOTcwOTEiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1NzM5NzA5MS9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTczOTcwOTEvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS4zIiwiaWQiOjE1NzM5NzA5MSwiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEpZYkJqIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuMyIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4zIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNS0yNFQxODoyNDowM1oiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA1LTI0VDE4OjI1OjM3WiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjMiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS4zIiwiYm9keSI6IiMjIFdoYXQncyBDaGFuZ2VkXHJcbiogRml4IGN1cnJlbmN5IHdoZW4gaW1wb3J0aW5nIHRvIGZvcmVpZ24gYWNjb3VudHMgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzYyXHJcbiogU2hvdyBhbiBlcnJvciBub3RpZmljYXRpb24gaWYgYWNjb3VudCBjYW5ub3QgYmUgbWFudWFsbHkgc3luY2VkIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzc2MVxyXG4qIEFkZCBtaWdyYXRpb24gdG8gbWFrZSBhbGwgZXhpc3RpbmcgdXNlcnMgYWRtaW5zIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzc3MFxyXG4qIEZpeCBpc3N1ZSB3aXRoIHN0YXJ0X2RhdGUgbm90IGJlaW5nIHNldCBpbiBhY2NvdW50IGNyZWF0aW9uIGJ5IEBzY3ViYW1hZ2dvIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzgxXHJcbiogRml4IGltcG9ydCBjcmFzaCB3aXRoIGVtcHR5IHRyYW5zYWN0aW9uIG5hbWUgYnkgQGpha3Via290dG5hdWVyIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzgzXHJcbiogTW92ZSBjYXRlZ29yeSBkcm9wZG93biBtZW51IGNvbnRlbnQgaW50byBhIHR1cmJvIGZyYW1lIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzc4MlxyXG4qIElnbm9yZSBlbXB0eSBjYXRlZ29yaWVzIHdoaWxlIGltcG9ydGluZyBieSBAamFrdWJrb3R0bmF1ZXIgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC83ODlcclxuKiBGaXggZHVwbGljYXRlIGNhdGVnb3J5IGNyZWF0aW9uIG9uIGltcG9ydCBieSBAemFjaGdvbGwgaW4gaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcHVsbC83OTFcclxuKiBDcmVhdGUgdGFnZ2luZyBzeXN0ZW0gYnkgQHphY2hnb2xsIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzkyXHJcbiogQWRkIHRhZyBwcmV2aWV3IHdoZW4gaW1wb3J0aW5nIGFuZCBmaXggZW1wdHkgY2F0ZWdvcnkgYnVnIGJ5IEBqYWt1YmtvdHRuYXVlciBpbiBodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9wdWxsLzgwMFxyXG5cclxuIyMgTmV3IENvbnRyaWJ1dG9yc1xyXG4qIEBzY3ViYW1hZ2dvIG1hZGUgdGhlaXIgZmlyc3QgY29udHJpYnV0aW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3B1bGwvNzgxXHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjIuLi52MC4xLjAtYWxwaGEuMyIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU3Mzk3MDkxL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50IjozMSwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5IjowLCJjb25mdXNlZCI6MCwiaGVhcnQiOjUsInJvY2tldCI6MjYsImV5ZXMiOjB9LCJtZW50aW9uc19jb3VudCI6M30seyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU2MzQyMTUyIiwiYXNzZXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTYzNDIxNTIvYXNzZXRzIiwidXBsb2FkX3VybCI6Imh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU2MzQyMTUyL2Fzc2V0c3s/bmFtZSxsYWJlbH0iLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzL3RhZy92MC4xLjAtYWxwaGEuMiIsImlkIjoxNTYzNDIxNTIsImF1dGhvciI6eyJsb2dpbiI6InphY2hnb2xsIiwiaWQiOjE2Njc2MTU3LCJub2RlX2lkIjoiTURRNlZYTmxjakUyTmpjMk1UVTMiLCJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2Njc2MTU3P3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbCIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3phY2hnb2xsIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInVzZXJfdmlld190eXBlIjoicHVibGljIiwic2l0ZV9hZG1pbiI6ZmFsc2V9LCJub2RlX2lkIjoiUkVfa3dET0tfdHhITTRKVVplSSIsInRhZ19uYW1lIjoidjAuMS4wLWFscGhhLjIiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsIm5hbWUiOiJ2MC4xLjAtYWxwaGEuMiIsImRyYWZ0IjpmYWxzZSwicHJlcmVsZWFzZSI6dHJ1ZSwiY3JlYXRlZF9hdCI6IjIwMjQtMDUtMTdUMjI6MjA6MTlaIiwicHVibGlzaGVkX2F0IjoiMjAyNC0wNS0xN1QyMjozMzoyNFoiLCJhc3NldHMiOltdLCJ0YXJiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS90YXJiYWxsL3YwLjEuMC1hbHBoYS4yIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvemlwYmFsbC92MC4xLjAtYWxwaGEuMiIsImJvZHkiOiJTZWNvbmQgYWxwaGEgcmVsZWFzZSBvZiBNYXliZSDwn46JIPCfjK5cclxuXHJcbiMjIE5ldyBmZWF0dXJlc1xyXG5cclxuLSBTZWxmIGhvc3Rpbmcgd2l0aCBEb2NrZXIg8J+QsyAoW3NldHVwIGd1aWRlXShodHRwczovL2dpdGh1Yi5jb20vbWF5YmUtZmluYW5jZS9tYXliZS9ibG9iL21haW4vZG9jcy9ob3N0aW5nL2RvY2tlci5tZCkpXHJcbi0gQ1NWIHRyYW5zYWN0aW9uIGltcG9ydHNcclxuLSBUcmFuc2FjdGlvbiBtYW5hZ2VtZW50IHdpdGggbWVyY2hhbnRzIGFuZCBjYXRlZ29yaWVzXHJcbi0gRnJlc2ggZGVzaWduIG9mIHVzZXIgc2V0dGluZ3NcclxuLSBSZS1kZXNpZ25lZCBkYXNoYm9hcmQgKyBhY2NvdW50cyBzdW1tYXJ5XHJcbi0gQWRtaW4gYWNjb3VudHMsIGFiaWxpdHkgdG8gZGVsZXRlIGFuZCBwdXJnZSBkYXRhXHJcblxyXG4qKkZ1bGwgQ2hhbmdlbG9nKio6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXliZS1maW5hbmNlL21heWJlL2NvbXBhcmUvdjAuMS4wLWFscGhhLjEuLi52MC4xLjAtYWxwaGEuMiIsInJlYWN0aW9ucyI6eyJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvMTU2MzQyMTUyL3JlYWN0aW9ucyIsInRvdGFsX2NvdW50Ijo1MCwiKzEiOjAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5Ijo0OCwiY29uZnVzZWQiOjAsImhlYXJ0IjoyLCJyb2NrZXQiOjAsImV5ZXMiOjB9fSx7InVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTEwMjgxMjMiLCJhc3NldHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1MTAyODEyMy9hc3NldHMiLCJ1cGxvYWRfdXJsIjoiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS9yZWxlYXNlcy8xNTEwMjgxMjMvYXNzZXRzez9uYW1lLGxhYmVsfSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL21heWJlLWZpbmFuY2UvbWF5YmUvcmVsZWFzZXMvdGFnL3YwLjEuMC1hbHBoYS4xIiwiaWQiOjE1MTAyODEyMywiYXV0aG9yIjp7ImxvZ2luIjoiemFjaGdvbGwiLCJpZCI6MTY2NzYxNTcsIm5vZGVfaWQiOiJNRFE2VlhObGNqRTJOamMyTVRVMyIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTY2NzYxNTc/dj00IiwiZ3JhdmF0YXJfaWQiOiIiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vemFjaGdvbGwiLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9naXN0c3svZ2lzdF9pZH0iLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy96YWNoZ29sbC9zdWJzY3JpcHRpb25zIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL29yZ3MiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvemFjaGdvbGwvZXZlbnRzey9wcml2YWN5fSIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3phY2hnb2xsL3JlY2VpdmVkX2V2ZW50cyIsInR5cGUiOiJVc2VyIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMiLCJzaXRlX2FkbWluIjpmYWxzZX0sIm5vZGVfaWQiOiJSRV9rd0RPS190eEhNNEpBSUdiIiwidGFnX25hbWUiOiJ2MC4xLjAtYWxwaGEuMSIsInRhcmdldF9jb21taXRpc2giOiJtYWluIiwibmFtZSI6InYwLjEuMC1hbHBoYS4xIiwiZHJhZnQiOmZhbHNlLCJwcmVyZWxlYXNlIjp0cnVlLCJjcmVhdGVkX2F0IjoiMjAyNC0wNC0xM1QxMzoyODo0NVoiLCJwdWJsaXNoZWRfYXQiOiIyMDI0LTA0LTEzVDEzOjQ5OjAzWiIsImFzc2V0cyI6W10sInRhcmJhbGxfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3RhcmJhbGwvdjAuMS4wLWFscGhhLjEiLCJ6aXBiYWxsX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbWF5YmUtZmluYW5jZS9tYXliZS96aXBiYWxsL3YwLjEuMC1hbHBoYS4xIiwiYm9keSI6IkluaXRpYWwgYWxwaGEgdmVyc2lvbiBvZiBNYXliZSDwn46JIPCfjK4iLCJyZWFjdGlvbnMiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXliZS1maW5hbmNlL21heWJlL3JlbGVhc2VzLzE1MTAyODEyMy9yZWFjdGlvbnMiLCJ0b3RhbF9jb3VudCI6MTY1LCIrMSI6NTAsIi0xIjowLCJsYXVnaCI6MCwiaG9vcmF5Ijo0NiwiY29uZnVzZWQiOjAsImhlYXJ0IjozNSwicm9ja2V0IjoyMywiZXllcyI6MTF9fV0= + recorded_at: Wed, 19 Mar 2025 12:40:58 GMT - request: method: post uri: https://api.github.com/markdown body: encoding: UTF-8 - string: '{"mode":"gfm","context":"maybe-finance/maybe","text":"This week''s - release comes with a variety of bug fixes and improvements to the UI.\r\n\r\nAdditionally, - users can now input details for their property and vehicle accounts as shown - in the video below. In the near future, Maybe will support data providers - related to the \"valuation\" of properties and vehicles (i.e. Zillow, KBB). We - will use the information from user accounts to automatically fetch estimated - market values for these assets which will then be added periodically as \"Valuations\" - in the value tab of each account. This will then show up in the history graph - for the account balance.\r\n\r\nhttps://github.com/user-attachments/assets/fd759c82-a25c-4c8d-8f16-f577e0410fb5\r\n\r\n## - What''s Changed\r\n\r\n* Refactor: Allow other import files by @pedrocarmona - in https://github.com/maybe-finance/maybe/pull/1099\r\n* Bump sentry-ruby - from 5.18.2 to 5.19.0 by @dependabot in https://github.com/maybe-finance/maybe/pull/1108\r\n* - Bump stimulus-rails from 1.3.3 to 1.3.4 by @dependabot in https://github.com/maybe-finance/maybe/pull/1106\r\n* - Bump aws-sdk-s3 from 1.157.0 to 1.158.0 by @dependabot in https://github.com/maybe-finance/maybe/pull/1105\r\n* - Bump ruby-lsp-rails from 0.3.12 to 0.3.13 by @dependabot in https://github.com/maybe-finance/maybe/pull/1107\r\n* - Bump propshaft from 0.9.0 to 0.9.1 by @dependabot in https://github.com/maybe-finance/maybe/pull/1104\r\n* - Bump good_job from 4.1.1 to 4.2.0 by @dependabot in https://github.com/maybe-finance/maybe/pull/1102\r\n* - Bump tailwindcss-rails from 2.7.2 to 2.7.3 by @dependabot in https://github.com/maybe-finance/maybe/pull/1103\r\n* - Fix query when account has zero income and expense by @zachgoll in https://github.com/maybe-finance/maybe/pull/1112\r\n* - Fix holding name error by @zachgoll in https://github.com/maybe-finance/maybe/pull/1113\r\n* - Add Property Details View by @zachgoll in https://github.com/maybe-finance/maybe/pull/1116\r\n* - Basic Vehicle View by @zachgoll in https://github.com/maybe-finance/maybe/pull/1117\r\n* - Rubocop updates by @zachgoll in https://github.com/maybe-finance/maybe/pull/1118\r\n* - Fix file upload UI opening twice by @zachgoll in https://github.com/maybe-finance/maybe/pull/1119\r\n\r\n\r\n**Full - Changelog**: https://github.com/maybe-finance/maybe/compare/v0.1.0-alpha.15...v0.1.0-alpha.16"}' + string: '{"mode":"gfm","context":"maybe-finance/maybe","text":"## Data resets, + offline investment trades, and miscellaneous stability improvements\r\n\r\nThis + release comes with a wide mix of stability improvements and quality of life + updates; particularly for self hosted apps, which can now be \"reset\" in + user settings. If your data looks wrong or you want a \"clean slate\" to + work from, we''ve added the ability for you to easily perform these resets + without writing SQL or manually deleting records.\r\n\r\nThis release also + comes with a much clearer UI surrounding the Synth data provider. New self + hosted users will now see a prominent warning message if they have missing + data as a result of a misconfigured or absent data provider.\r\n\r\n## What''s + Changed\r\n* Add new category flow by @syedbarimanjan in https://github.com/maybe-finance/maybe/pull/1857\r\n* + Fix parent category sums in budget by @zachgoll in https://github.com/maybe-finance/maybe/pull/1894\r\n* + Add breadcrumbs support across application by @Shpigford in https://github.com/maybe-finance/maybe/pull/1897\r\n* + Dashboard design fixes by @zachgoll in https://github.com/maybe-finance/maybe/pull/1898\r\n* + Allow account balance to dynamically use currency format on preference page + by @Harry-kp in https://github.com/maybe-finance/maybe/pull/1910\r\n* Feat: + Data \"reset\" button by @tonyvince in https://github.com/maybe-finance/maybe/pull/1913\r\n* + Fix: Make Tags selection scrollable by @tonyvince in https://github.com/maybe-finance/maybe/pull/1921\r\n* + Fix value wrapping on account balance in sidebar by @zachgoll in https://github.com/maybe-finance/maybe/pull/1922\r\n* + Fix import configuration form so number format is applied by @zachgoll in + https://github.com/maybe-finance/maybe/pull/1923\r\n* Add transitions to buttons + and other common design system elements by @zachgoll in https://github.com/maybe-finance/maybe/pull/1924\r\n* + Allow offline trade tickers by @zachgoll in https://github.com/maybe-finance/maybe/pull/1925\r\n* + fix: Don''t show Billings on settings navbar when self-hosted by @tonyvince + in https://github.com/maybe-finance/maybe/pull/1912\r\n* Show UI warning to + user when they need provider data but have not setup Synth yet by @zachgoll + in https://github.com/maybe-finance/maybe/pull/1926\r\n* Invert liability + graphs to have correct signage by @zachgoll in https://github.com/maybe-finance/maybe/pull/1928\r\n* + Escape quotations in CSV imports properly by @zachgoll in https://github.com/maybe-finance/maybe/pull/1929\r\n\r\n## + New Contributors\r\n* @syedbarimanjan made their first contribution in https://github.com/maybe-finance/maybe/pull/1857\r\n\r\n**Full + Changelog**: https://github.com/maybe-finance/maybe/compare/v0.4.2...v0.4.3"}' headers: Accept: - application/vnd.github.raw User-Agent: - - Octokit Ruby Gem 9.1.0 + - Octokit Ruby Gem 9.2.0 Content-Type: - application/json Accept-Encoding: @@ -121,7 +127,7 @@ http_interactions: message: OK headers: Date: - - Mon, 09 Sep 2024 20:03:35 GMT + - Wed, 19 Mar 2025 12:40:58 GMT Content-Type: - text/html;charset=utf-8 X-Commonmarker-Version: @@ -131,7 +137,7 @@ http_interactions: Vary: - Accept,Accept-Encoding, Accept, X-Requested-With Etag: - - W/"4b6d4a2163bd3920fb140d306008bd394fd881338320e3400547c6833368f2ea" + - W/"bff98cc65001c41f8dd63749dc92891772179ad935cf7a314a5e9a289fd17557" X-Github-Media-Type: - github.v3; param=raw X-Github-Api-Version-Selected: @@ -160,55 +166,45 @@ http_interactions: X-Ratelimit-Limit: - '60' X-Ratelimit-Remaining: - - '56' + - '58' X-Ratelimit-Reset: - - '1725915804' + - '1742391658' X-Ratelimit-Resource: - core X-Ratelimit-Used: - - '4' - Accept-Ranges: - - bytes + - '2' Content-Length: - - '12673' + - '11567' X-Github-Request-Id: - - E97A:2198A3:C56E5C:17C26E8:66DF5497 + - DDEE:10ABF0:184826:30A90D:67DABB5A body: encoding: ASCII-8BIT string: |- -

This week's release comes with a variety of bug fixes and improvements to the UI.

-

Additionally, users can now input details for their property and vehicle accounts as shown in the video below. In the near future, Maybe will support data providers related to the "valuation" of properties and vehicles (i.e. Zillow, KBB). We will use the information from user accounts to automatically fetch estimated market values for these assets which will then be added periodically as "Valuations" in the value tab of each account. This will then show up in the history graph for the account balance.

-
- - - CleanShot.2024-08-23.at.10.37.04.mp4 - - - - -
- +

Data resets, offline investment trades, and miscellaneous stability improvements

+

This release comes with a wide mix of stability improvements and quality of life updates; particularly for self hosted apps, which can now be "reset" in user settings. If your data looks wrong or you want a "clean slate" to work from, we've added the ability for you to easily perform these resets without writing SQL or manually deleting records.

+

This release also comes with a much clearer UI surrounding the Synth data provider. New self hosted users will now see a prominent warning message if they have missing data as a result of a misconfigured or absent data provider.

What's Changed

-

Full Changelog: v0.1.0-alpha.15...v0.1.0-alpha.16

- recorded_at: Mon, 09 Sep 2024 20:03:35 GMT +

New Contributors

+ +

Full Changelog: v0.4.2...v0.4.3

+ recorded_at: Wed, 19 Mar 2025 12:40:58 GMT recorded_with: VCR 6.3.1 diff --git a/test/vcr_cassettes/git_repository_provider/fetch_latest_upgrade_candidates.yml b/test/vcr_cassettes/git_repository_provider/fetch_latest_upgrade_candidates.yml deleted file mode 100644 index 2e44df83..00000000 --- a/test/vcr_cassettes/git_repository_provider/fetch_latest_upgrade_candidates.yml +++ /dev/null @@ -1,235 +0,0 @@ ---- -http_interactions: - - request: - method: get - uri: https://api.github.com/repos/rails/rails/releases - body: - encoding: US-ASCII - string: "" - headers: - Accept: - - application/vnd.github.v3+json - User-Agent: - - Octokit Ruby Gem 8.1.0 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - response: - status: - code: 200 - message: OK - headers: - Server: - - GitHub.com - Date: - - Wed, 10 Apr 2024 19:52:56 GMT - Content-Type: - - application/json; charset=utf-8 - Cache-Control: - - public, max-age=60, s-maxage=60 - Vary: - - Accept, Accept-Encoding, Accept, X-Requested-With - Etag: - - W/"a032e5cc14d6dc10a55126bd742c08afc1365c4cf381d6d5ce3b4014cfbf2de5" - X-Github-Media-Type: - - github.v3; format=json - Link: - - ; rel="next", ; - rel="last" - X-Github-Api-Version-Selected: - - "2022-11-28" - Access-Control-Expose-Headers: - - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, - X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, - X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, - X-GitHub-Request-Id, Deprecation, Sunset - Access-Control-Allow-Origin: - - "*" - Strict-Transport-Security: - - max-age=31536000; includeSubdomains; preload - X-Frame-Options: - - deny - X-Content-Type-Options: - - nosniff - X-Xss-Protection: - - "0" - Referrer-Policy: - - origin-when-cross-origin, strict-origin-when-cross-origin - Content-Security-Policy: - - default-src 'none' - X-Ratelimit-Limit: - - "60" - X-Ratelimit-Remaining: - - "53" - X-Ratelimit-Reset: - - "1712781639" - X-Ratelimit-Resource: - - core - X-Ratelimit-Used: - - "7" - Accept-Ranges: - - bytes - Transfer-Encoding: - - chunked - X-Github-Request-Id: - - C8A7:A3F5F:11C7A6D:1BA83CE:6616EE18 - body: - encoding: ASCII-8BIT - string: '[{"tag_name": "v7.1.3.2", "html_url": "http://localhost"}]' # manually abbreviated for clarity - recorded_at: Wed, 10 Apr 2024 19:52:56 GMT - - request: - method: get - uri: https://api.github.com/repos/rails/rails/branches/main - body: - encoding: US-ASCII - string: "" - headers: - Accept: - - application/vnd.github.v3+json - User-Agent: - - Octokit Ruby Gem 8.1.0 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - response: - status: - code: 200 - message: OK - headers: - Server: - - GitHub.com - Date: - - Wed, 10 Apr 2024 19:52:57 GMT - Content-Type: - - application/json; charset=utf-8 - Cache-Control: - - public, max-age=60, s-maxage=60 - Vary: - - Accept, Accept-Encoding, Accept, X-Requested-With - Etag: - - W/"bbcf30919f0ef5fae2b2a28f58d50e3fb2cea8aa75418d5f2b919a7f857b27d0" - X-Github-Media-Type: - - github.v3; format=json - X-Github-Api-Version-Selected: - - "2022-11-28" - Access-Control-Expose-Headers: - - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, - X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, - X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, - X-GitHub-Request-Id, Deprecation, Sunset - Access-Control-Allow-Origin: - - "*" - Strict-Transport-Security: - - max-age=31536000; includeSubdomains; preload - X-Frame-Options: - - deny - X-Content-Type-Options: - - nosniff - X-Xss-Protection: - - "0" - Referrer-Policy: - - origin-when-cross-origin, strict-origin-when-cross-origin - Content-Security-Policy: - - default-src 'none' - X-Ratelimit-Limit: - - "60" - X-Ratelimit-Remaining: - - "52" - X-Ratelimit-Reset: - - "1712781639" - X-Ratelimit-Resource: - - core - X-Ratelimit-Used: - - "8" - Accept-Ranges: - - bytes - Content-Length: - - "3964" - X-Github-Request-Id: - - C8A8:281896:11B1812:1B69B2F:6616EE19 - body: - encoding: ASCII-8BIT - # manually abbreviated for clarity - string: '{"commit":{"sha":"84997578c59aa88fe114cef176115f1612b6de6b", "html_url":"https://github.com/rails/rails/commit/84997578c59aa88fe114cef176115f1612b6de6b"}}' - recorded_at: Wed, 10 Apr 2024 19:52:57 GMT - - request: - method: get - uri: https://api.github.com/repos/rails/rails/commits/v7.1.3.2 - body: - encoding: US-ASCII - string: "" - headers: - Accept: - - application/vnd.github.v3+json - User-Agent: - - Octokit Ruby Gem 8.1.0 - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - response: - status: - code: 200 - message: OK - headers: - Server: - - GitHub.com - Date: - - Wed, 10 Apr 2024 19:52:57 GMT - Content-Type: - - application/json; charset=utf-8 - Cache-Control: - - public, max-age=60, s-maxage=60 - Vary: - - Accept, Accept-Encoding, Accept, X-Requested-With - Etag: - - W/"0668fc459669113a200777ee9ddd56a6ca2efb647894b006d3966504c7c82f13" - Last-Modified: - - Wed, 21 Feb 2024 21:43:55 GMT - X-Github-Media-Type: - - github.v3; format=json - X-Github-Api-Version-Selected: - - "2022-11-28" - Access-Control-Expose-Headers: - - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, - X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, - X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, - X-GitHub-Request-Id, Deprecation, Sunset - Access-Control-Allow-Origin: - - "*" - Strict-Transport-Security: - - max-age=31536000; includeSubdomains; preload - X-Frame-Options: - - deny - X-Content-Type-Options: - - nosniff - X-Xss-Protection: - - "0" - Referrer-Policy: - - origin-when-cross-origin, strict-origin-when-cross-origin - Content-Security-Policy: - - default-src 'none' - X-Ratelimit-Limit: - - "60" - X-Ratelimit-Remaining: - - "51" - X-Ratelimit-Reset: - - "1712781639" - X-Ratelimit-Resource: - - core - X-Ratelimit-Used: - - "9" - Accept-Ranges: - - bytes - Transfer-Encoding: - - chunked - X-Github-Request-Id: - - C8A9:23AA82:11FFCB8:1C057CD:6616EE19 - body: - encoding: ASCII-8BIT - # manually abbreviated for clarity - string: '{"sha":"6f0d1ad14b92b9f5906e44740fce8b4f1c7075dc"}' - recorded_at: Wed, 10 Apr 2024 19:52:57 GMT -recorded_with: VCR 6.2.0