diff --git a/.rubocop/cop/zammad/exists_db_strategy.rb b/.rubocop/cop/zammad/exists_db_strategy.rb
index f825e2bfc..e2b4dddc8 100644
--- a/.rubocop/cop/zammad/exists_db_strategy.rb
+++ b/.rubocop/cop/zammad/exists_db_strategy.rb
@@ -17,7 +17,7 @@ module RuboCop
PATTERN
def_node_matcher :has_reset?, <<-PATTERN
- $(send _ {:describe :context :it} (_ ...) (hash ... (pair (sym :db_strategy) (sym {:reset :reset_all}))))
+ $(send _ {:describe :context :it :shared_examples} (_ ...) (hash ... (pair (sym :db_strategy) (sym {:reset :reset_all}))))
PATTERN
MSG = 'Add a `db_strategy: :reset` to your context/decribe when you are creating object manager attributes!'.freeze
diff --git a/app/assets/javascripts/app/controllers/import_freshdesk.coffee b/app/assets/javascripts/app/controllers/import_freshdesk.coffee
index 42b16e066..f464449a0 100644
--- a/app/assets/javascripts/app/controllers/import_freshdesk.coffee
+++ b/app/assets/javascripts/app/controllers/import_freshdesk.coffee
@@ -8,7 +8,6 @@ class ImportFreshdesk extends App.ControllerWizardFullScreen
'#freshdesk-subdomain-addon': 'freshdeskSubdomainAddon'
'.freshdesk-subdomain-error': 'linkErrorMessage'
'.freshdesk-api-token-error': 'apiTokenErrorMessage'
- '#freshdesk-email': 'freshdeskEmail'
'#freshdesk-api-token': 'freshdeskApiToken'
'.js-ticket-count-info': 'ticketCountInfo'
updateMigrationDisplayLoop: 0
diff --git a/app/assets/javascripts/app/controllers/import_kayako.coffee b/app/assets/javascripts/app/controllers/import_kayako.coffee
new file mode 100644
index 000000000..49ebb5765
--- /dev/null
+++ b/app/assets/javascripts/app/controllers/import_kayako.coffee
@@ -0,0 +1,194 @@
+class ImportKayako extends App.ControllerWizardFullScreen
+ className: 'getstarted fit'
+ elements:
+ '.input-feedback': 'urlStatus'
+ '[data-target=kayako-credentials]': 'nextEnterCredentials'
+ '[data-target=kayako-start-migration]': 'nextStartMigration'
+ '#kayako-subdomain': 'kayakoSubdomain'
+ '#kayako-subdomain-addon': 'kayakoSubdomainAddon'
+ '.kayako-subdomain-error': 'linkErrorMessage'
+ '.kayako-password-error': 'apiTokenErrorMessage'
+ '#kayako-email': 'kayakoEmail'
+ '#kayako-password': 'kayakoPassword'
+ '.js-ticket-count-info': 'ticketCountInfo'
+ updateMigrationDisplayLoop: 0
+
+ events:
+ 'click .js-kayako-credentials': 'showCredentials'
+ 'click .js-migration-start': 'startMigration'
+ 'keyup #kayako-subdomain': 'updateUrl'
+ 'keyup #kayako-password': 'updateCredentials'
+
+ constructor: ->
+ super
+
+ # set title
+ @title 'Import'
+
+ @kayakoDomain = '.kayako.com'
+
+ # redirect to login if admin user already exists
+ if @Config.get('system_init_done')
+ @navigate '#login'
+ return
+
+ @fetch()
+
+ fetch: ->
+
+ # get data
+ @ajax(
+ id: 'getting_started'
+ type: 'GET'
+ url: "#{@apiPath}/getting_started"
+ processData: true
+ success: (data, status, xhr) =>
+
+ # check if import is active
+ if data.import_mode == true && data.import_backend != 'kayako'
+ @navigate "#import/#{data.import_backend}", { emptyEl: true }
+ return
+
+ # render page
+ @render()
+
+ if data.import_mode == true
+ @showImportState()
+ @updateMigration()
+ )
+
+ render: ->
+ @replaceWith App.view('import/kayako')(
+ kayakoDomain: @kayakoDomain
+ )
+
+ updateUrl: (e) =>
+ @urlStatus.attr('data-state', 'loading')
+ @kayakoSubdomainAddon.attr('style', 'padding-right: 42px')
+ @linkErrorMessage.text('')
+
+ # get data
+ callback = =>
+ @ajax(
+ id: 'import_kayako_url'
+ type: 'POST'
+ url: "#{@apiPath}/import/kayako/url_check"
+ data: JSON.stringify(url: "https://#{@kayakoSubdomain.val()}#{@kayakoDomain}")
+ processData: true
+ success: (data, status, xhr) =>
+
+ # validate form
+ if data.result is 'ok'
+ @urlStatus.attr('data-state', 'success')
+ @linkErrorMessage.text('')
+ @nextEnterCredentials.removeClass('hide')
+ else
+ @urlStatus.attr('data-state', 'error')
+ @linkErrorMessage.text( data.message_human || data.message)
+ @nextEnterCredentials.addClass('hide')
+
+ )
+ @delay( callback, 700, 'import_kayako_url' )
+
+ updateCredentials: (e) =>
+ @urlStatus.attr('data-state', 'loading')
+ @apiTokenErrorMessage.text('')
+
+ # get data
+ callback = =>
+ @ajax(
+ id: 'import_kayako_api_token'
+ type: 'POST'
+ url: "#{@apiPath}/import/kayako/credentials_check"
+ data: JSON.stringify(username: @kayakoEmail.val(), password: @kayakoPassword.val())
+ processData: true
+ success: (data, status, xhr) =>
+
+ # validate form
+ if data.result is 'ok'
+ @urlStatus.attr('data-state', 'success')
+ @apiTokenErrorMessage.text('')
+ @nextStartMigration.removeClass('hide')
+ else
+ @urlStatus.attr('data-state', 'error')
+ @apiTokenErrorMessage.text(data.message_human || data.message)
+ @nextStartMigration.addClass('hide')
+
+ )
+ @delay(callback, 700, 'import_kayako_api_token')
+
+ showCredentials: (e) =>
+ e.preventDefault()
+ @urlStatus.attr('data-state', '')
+ @$('[data-slide=kayako-subdomain]').toggleClass('hide')
+ @$('[data-slide=kayako-credentials]').toggleClass('hide')
+
+ showImportState: =>
+ @$('[data-slide=kayako-subdomain]').addClass('hide')
+ @$('[data-slide=kayako-credentials]').addClass('hide')
+ @$('[data-slide=kayako-import]').removeClass('hide')
+
+ startMigration: (e) =>
+ e.preventDefault()
+ @showImportState()
+ @ajax(
+ id: 'import_start'
+ type: 'POST'
+ url: "#{@apiPath}/import/kayako/import_start"
+ processData: true
+ success: (data, status, xhr) =>
+
+ # validate form
+ if data.result is 'ok'
+ @delay(@updateMigration, 3000)
+ )
+
+ updateMigration: =>
+ @updateMigrationDisplayLoop += 1
+ @showImportState()
+ @ajax(
+ id: 'import_status'
+ type: 'GET'
+ url: "#{@apiPath}/import/kayako/import_status"
+ processData: true
+ success: (data, status, xhr) =>
+
+ if _.isEmpty(data.result) && @updateMigrationDisplayLoop > 16
+ @$('.js-error').removeClass('hide')
+ @$('.js-error').html(App.i18n.translateContent('Background process did not start or has not finished! Please contact your support.'))
+ return
+
+ if !_.isEmpty(data.result['error'])
+ @$('.js-error').removeClass('hide')
+ @$('.js-error').html(App.i18n.translateContent(data.result['error']))
+ else
+ @$('.js-error').addClass('hide')
+
+ if !_.isEmpty(data.finished_at) && _.isEmpty(data.result['error'])
+ window.location.reload()
+ return
+
+ if !_.isEmpty(data.result)
+ for model, stats of data.result
+ if stats.sum > stats.total
+ stats.sum = stats.total
+
+ element = @$('.js-' + model.toLowerCase() )
+ element.find('.js-done').text(stats.sum)
+ element.find('.js-total').text(stats.total)
+ element.find('progress').attr('max', stats.total )
+ element.find('progress').attr('value', stats.sum )
+ if stats.total <= stats.sum
+ element.addClass('is-done')
+ else
+ element.removeClass('is-done')
+ @delay(@updateMigration, 5000)
+ )
+
+App.Config.set('import/kayako', ImportKayako, 'Routes')
+App.Config.set('kayako', {
+ title: 'Kayako'
+ name: 'Kayako'
+ class: 'js-kayako'
+ url: '#import/kayako'
+}, 'ImportPlugins')
diff --git a/app/assets/javascripts/app/views/import/kayako.jst.eco b/app/assets/javascripts/app/views/import/kayako.jst.eco
new file mode 100644
index 000000000..d4659d33b
--- /dev/null
+++ b/app/assets/javascripts/app/views/import/kayako.jst.eco
@@ -0,0 +1,113 @@
+
+ <%- @Icon('full-logo', 'wizard-logo') %>
+
+
+
<%- @T('%s URL', 'Kayako') %>
+
+
+ <%- @T('Enter the Subdomain of your %s system', 'Kayako') %>:
+
+
+
+
+
+
+
+
<%- @T('%s credentials', 'Kayako') %>
+
+
+ <%- @T('Enter your email address and password from your %s account which should be used for the import.', 'Kayako') %>
+
+
+ <%- @T('Attention: These will also your login password after the import is completed.') %>
+
+
+
+
+
+
+
+
<%- @T('%s Migration', 'Kayako') %>
+
+
+
+
+ -/-
+ | <%- @T('Groups') %>
+ |
+
+
+ <%- @Icon('checkmark') %>
+
+ |
+
+ -/-
+ | <%- @T('Organizations') %>
+ |
+
+
+ <%- @Icon('checkmark') %>
+
+ |
+
+ -/-
+ | <%- @T('Users') %>
+ |
+
+
+ <%- @Icon('checkmark') %>
+
+ |
+
+ -/-
+ | <%- @T('Tickets') %>
+ |
+
+
+ <%- @Icon('checkmark') %>
+
+ |
+
+
+
+
+
+
+
diff --git a/app/controllers/import_kayako_controller.rb b/app/controllers/import_kayako_controller.rb
new file mode 100644
index 000000000..9a72ebc5b
--- /dev/null
+++ b/app/controllers/import_kayako_controller.rb
@@ -0,0 +1,146 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class ImportKayakoController < ApplicationController
+ def url_check
+ return if setup_done_response
+
+ url = params[:url]
+
+ # validate
+ if !valid_url_syntax?(url)
+ render json: {
+ result: 'invalid',
+ message: 'Invalid URL!',
+ }
+ return
+ end
+
+ endpoint = build_endpoint_url(url)
+
+ return if !valid_endpoint?(endpoint)
+
+ Setting.set('import_kayako_endpoint', endpoint)
+
+ render json: {
+ result: 'ok',
+ url: url,
+ }
+ end
+
+ def credentials_check
+ return if setup_done_response
+
+ if !params[:username] || !params[:password]
+ render json: {
+ result: 'invalid',
+ message_human: 'Incomplete credentials',
+ }
+ return
+ end
+
+ save_endpoint_settings(params[:username], params[:password])
+
+ return if !valid_connection?
+
+ render json: {
+ result: 'ok',
+ }
+ end
+
+ def import_start
+ return if setup_done_response
+
+ Setting.set('import_mode', true)
+ Setting.set('import_backend', 'kayako')
+
+ job = ImportJob.create(name: 'Import::Kayako')
+ AsyncImportJob.perform_later(job)
+
+ render json: {
+ result: 'ok',
+ }
+ end
+
+ def import_status
+ job = ImportJob.find_by(name: 'Import::Kayako')
+
+ if job.finished_at.present?
+ Setting.reload
+ end
+
+ model_show_render_item(job)
+ end
+
+ private
+
+ def setup_done
+ count = User.all.count()
+ done = true
+ if count <= 2
+ done = false
+ end
+ done
+ end
+
+ def setup_done_response
+ if !setup_done
+ return false
+ end
+
+ render json: {
+ setup_done: true,
+ }
+ true
+ end
+
+ def valid_url_syntax?(url)
+ return false if url.blank? || url !~ %r{^(http|https)://.+?$}
+
+ true
+ end
+
+ def valid_endpoint?(endpoint)
+ response = UserAgent.request("#{endpoint}/teams", verify_ssl: true)
+
+ if response.header.nil? || !response.header['x-api-version']
+ render json: {
+ result: 'invalid',
+ message: response.error.to_s,
+ message_human: 'Hostname not found!',
+ }
+ return false
+ end
+
+ true
+ end
+
+ def build_endpoint_url(url)
+ endpoint = "#{url}/api/v1"
+ endpoint.gsub(%r{([^:])//+}, '\\1/')
+ end
+
+ def valid_connection?
+ result = Sequencer.process('Import::Kayako::ConnectionTest')
+
+ if !result[:connected]
+ reset_endpoint_settings
+
+ render json: {
+ result: 'invalid',
+ message_human: 'Invalid credentials!',
+ }
+ return false
+ end
+
+ true
+ end
+
+ def save_endpoint_settings(username, possword)
+ Setting.set('import_kayako_endpoint_username', username)
+ Setting.set('import_kayako_endpoint_password', possword)
+ end
+
+ def reset_endpoint_settings
+ save_endpoint_settings(nil, nil)
+ end
+end
diff --git a/config/routes/import_kayako.rb b/config/routes/import_kayako.rb
new file mode 100644
index 000000000..0a84d519d
--- /dev/null
+++ b/config/routes/import_kayako.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+Zammad::Application.routes.draw do
+ api_path = Rails.configuration.api_path
+
+ # import kayako
+ match api_path + '/import/kayako/url_check', to: 'import_kayako#url_check', via: :post
+ match api_path + '/import/kayako/credentials_check', to: 'import_kayako#credentials_check', via: :post
+ match api_path + '/import/kayako/import_start', to: 'import_kayako#import_start', via: :post
+ match api_path + '/import/kayako/import_status', to: 'import_kayako#import_status', via: :get
+
+end
diff --git a/db/migrate/20210827095053_add_ticket_article_type_facebook_direct_message.rb b/db/migrate/20210827095053_add_ticket_article_type_facebook_direct_message.rb
new file mode 100644
index 000000000..667b82e04
--- /dev/null
+++ b/db/migrate/20210827095053_add_ticket_article_type_facebook_direct_message.rb
@@ -0,0 +1,15 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class AddTicketArticleTypeFacebookDirectMessage < ActiveRecord::Migration[6.0]
+ def change
+ # return if it's a new setup
+ return if !Setting.exists?(name: 'system_init_done')
+
+ Ticket::Article::Type.create_if_not_exists(
+ name: 'facebook direct-message',
+ communication: true,
+ updated_by_id: 1,
+ created_by_id: 1,
+ )
+ end
+end
diff --git a/db/seeds/settings.rb b/db/seeds/settings.rb
index 6704464d5..5d2b7b606 100644
--- a/db/seeds/settings.rb
+++ b/db/seeds/settings.rb
@@ -3282,6 +3282,61 @@ Setting.create_if_not_exists(
frontend: false
)
+Setting.create_if_not_exists(
+ title: 'Import Endpoint',
+ name: 'import_kayako_endpoint',
+ area: 'Import::Kayako',
+ description: 'Defines Kayako endpoint to import users, ticket, states and articles.',
+ options: {
+ form: [
+ {
+ display: '',
+ null: false,
+ name: 'import_kayako_endpoint',
+ tag: 'input',
+ },
+ ],
+ },
+ state: 'https://yours.kayako.com/api/v1',
+ frontend: false
+)
+Setting.create_if_not_exists(
+ title: 'Import User for requesting the Kayako API',
+ name: 'import_kayako_endpoint_username',
+ area: 'Import::Kayako',
+ description: 'Defines Kayako endpoint authentication user.',
+ options: {
+ form: [
+ {
+ display: '',
+ null: false,
+ name: 'import_kayako_endpoint_username',
+ tag: 'input',
+ },
+ ],
+ },
+ state: '',
+ frontend: false
+)
+Setting.create_if_not_exists(
+ title: 'Import Password for requesting the Kayako API',
+ name: 'import_kayako_endpoint_password',
+ area: 'Import::Kayako',
+ description: 'Defines Kayako endpoint authentication password.',
+ options: {
+ form: [
+ {
+ display: '',
+ null: false,
+ name: 'import_kayako_endpoint_password',
+ tag: 'input',
+ },
+ ],
+ },
+ state: '',
+ frontend: false
+)
+
Setting.create_if_not_exists(
title: 'Import Backends',
name: 'import_backends',
diff --git a/db/seeds/ticket_article_types.rb b/db/seeds/ticket_article_types.rb
index e29f59b20..071230974 100644
--- a/db/seeds/ticket_article_types.rb
+++ b/db/seeds/ticket_article_types.rb
@@ -12,3 +12,4 @@ Ticket::Article::Type.create_if_not_exists(id: 9, name: 'facebook feed comment',
Ticket::Article::Type.create_if_not_exists(id: 10, name: 'note', communication: false)
Ticket::Article::Type.create_if_not_exists(id: 11, name: 'web', communication: true)
Ticket::Article::Type.create_if_not_exists(id: 12, name: 'telegram personal-message', communication: true)
+Ticket::Article::Type.create_if_not_exists(id: 13, name: 'facebook direct-message', communication: true)
diff --git a/lib/import/kayako.rb b/lib/import/kayako.rb
new file mode 100644
index 000000000..0ad5b71e7
--- /dev/null
+++ b/lib/import/kayako.rb
@@ -0,0 +1,15 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+module Import
+ class Kayako < Import::Base
+ include Import::Mixin::Sequence
+
+ def start
+ process
+ end
+
+ def sequence_name
+ 'Import::Kayako::Full'
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/case.rb b/lib/sequencer/sequence/import/kayako/case.rb
new file mode 100644
index 000000000..3ff571407
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/case.rb
@@ -0,0 +1,45 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class Case < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket',
+ 'Import::Kayako::Case::Skip::Deleted',
+ 'Import::Kayako::Case::Skip::Suspended',
+ 'Import::Kayako::Common::CreatedById',
+ 'Import::Kayako::Common::ArticleSenderId',
+ 'Import::Kayako::Case::UpdatedById',
+ 'Import::Kayako::Case::CustomerId',
+ 'Import::Kayako::Case::OwnerId',
+ 'Import::Kayako::Case::GroupId',
+ 'Import::Kayako::Case::OrganizationId',
+ 'Import::Kayako::Case::PriorityId',
+ 'Import::Kayako::Case::StateId',
+ 'Import::Kayako::Case::Type',
+ 'Import::Kayako::Common::ArticleSourceChannel',
+ 'Import::Kayako::Case::Mapping',
+ 'Import::Kayako::Mapping::Timestamps',
+ 'Import::Kayako::Mapping::CustomFields',
+ 'Import::Common::Model::FindBy::Id',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Common::Model::ResetPrimaryKeySequence',
+ 'Import::Kayako::MapId',
+ 'Import::Kayako::Case::Tags',
+ 'Import::Kayako::Case::Posts',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/case_field.rb b/lib/sequencer/sequence/import/kayako/case_field.rb
new file mode 100644
index 000000000..2d51421a4
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/case_field.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class CaseField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket',
+ 'Import::Kayako::ObjectAttribute::Skip',
+ 'Import::Kayako::ObjectAttribute::SanitizedName',
+ 'Import::Kayako::ObjectAttribute::Config',
+ 'Import::Kayako::ObjectAttribute::Add',
+ 'Import::Kayako::ObjectAttribute::MigrationExecute',
+ 'Import::Kayako::ObjectAttribute::FieldMap',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/connection_test.rb b/lib/sequencer/sequence/import/kayako/connection_test.rb
new file mode 100644
index 000000000..968504bdb
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/connection_test.rb
@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class ConnectionTest < Sequencer::Sequence::Base
+ def self.expecting
+ [:connected]
+ end
+
+ def self.sequence
+ [
+ 'Kayako::Connected',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/full.rb b/lib/sequencer/sequence/import/kayako/full.rb
new file mode 100644
index 000000000..8c58bc079
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/full.rb
@@ -0,0 +1,34 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class Full < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Common::ImportMode::Check',
+ 'Import::Common::SystemInitDone::Check',
+ 'Import::Common::ImportJob::DryRun',
+ 'Import::Kayako::DefaultLanguage',
+ 'Import::Kayako::IdMap',
+ 'Import::Kayako::Teams',
+ 'Import::Kayako::FieldMap',
+ 'Import::Kayako::OrganizationFields',
+ 'Import::Kayako::Organizations',
+ 'Import::Kayako::UserFields',
+ 'Import::Kayako::Users',
+ 'Import::Kayako::CaseFields',
+ 'Import::Kayako::Cases',
+ 'Import::Kayako::TimeEntries',
+ 'Import::Common::SystemInitDone::Set',
+ 'Import::Kayako::ImportSettingsUnset',
+ 'Import::Common::ImportMode::Unset',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/generic_field.rb b/lib/sequencer/sequence/import/kayako/generic_field.rb
new file mode 100644
index 000000000..cb18b971b
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/generic_field.rb
@@ -0,0 +1,20 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class GenericField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Kayako::Request',
+ 'Import::Kayako::Resources',
+ 'Import::Kayako::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/generic_object.rb b/lib/sequencer/sequence/import/kayako/generic_object.rb
new file mode 100644
index 000000000..ac834052f
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/generic_object.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class GenericObject < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Kayako::Request',
+ 'Import::Kayako::Resources',
+ 'Import::Kayako::ModelClass',
+ 'Import::Kayako::ObjectCount',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ 'Import::Kayako::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/organization.rb b/lib/sequencer/sequence/import/kayako/organization.rb
new file mode 100644
index 000000000..30a63a693
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/organization.rb
@@ -0,0 +1,29 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class Organization < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Organization',
+ 'Import::Kayako::Organization::Mapping',
+ 'Import::Kayako::Mapping::CustomFields',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::FindBy::Name',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Kayako::MapId',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/organization_field.rb b/lib/sequencer/sequence/import/kayako/organization_field.rb
new file mode 100644
index 000000000..0b16dc23a
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/organization_field.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class OrganizationField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Organization',
+ 'Import::Kayako::ObjectAttribute::Skip',
+ 'Import::Kayako::ObjectAttribute::SanitizedName',
+ 'Import::Kayako::ObjectAttribute::Config',
+ 'Import::Kayako::ObjectAttribute::Add',
+ 'Import::Kayako::ObjectAttribute::MigrationExecute',
+ 'Import::Kayako::ObjectAttribute::FieldMap',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/post.rb b/lib/sequencer/sequence/import/kayako/post.rb
new file mode 100644
index 000000000..3a94daebc
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/post.rb
@@ -0,0 +1,30 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class Post < Sequencer::Sequence::Base
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket::Article',
+ 'Import::Kayako::Common::CreatedById',
+ 'Import::Kayako::Common::ArticleSenderId',
+ 'Import::Kayako::Common::ArticleSourceChannel',
+ 'Import::Kayako::Post::Mapping',
+ 'Import::Kayako::Post::InlineImages',
+ 'Import::Kayako::Mapping::Timestamps',
+ 'Import::Kayako::Post::UnsetInstance',
+ 'Import::Common::Model::FindBy::MessageId',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Kayako::MapId',
+ 'Import::Kayako::Post::Attachments',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/posts.rb b/lib/sequencer/sequence/import/kayako/posts.rb
new file mode 100644
index 000000000..48252ecdf
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/posts.rb
@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class Posts < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Kayako::Request',
+ 'Import::Kayako::Resources',
+ 'Import::Kayako::ModelClass',
+ 'Import::Kayako::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/team.rb b/lib/sequencer/sequence/import/kayako/team.rb
new file mode 100644
index 000000000..fd3aa1945
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/team.rb
@@ -0,0 +1,28 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class Team < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Group',
+ 'Import::Kayako::Team::Mapping',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::FindBy::Name',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Kayako::MapId',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/time_entries.rb b/lib/sequencer/sequence/import/kayako/time_entries.rb
new file mode 100644
index 000000000..f19156a2f
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/time_entries.rb
@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class TimeEntries < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Kayako::Request',
+ 'Import::Kayako::Resources',
+ 'Import::Kayako::ModelClass',
+ 'Import::Kayako::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/time_entry.rb b/lib/sequencer/sequence/import/kayako/time_entry.rb
new file mode 100644
index 000000000..f2311f93c
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/time_entry.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class TimeEntry < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket::TimeAccounting',
+ 'Import::Kayako::TimeEntry::Skip',
+ 'Import::Kayako::Common::CreatedById',
+ 'Import::Kayako::TimeEntry::Mapping',
+ 'Import::Kayako::Mapping::Timestamps',
+ 'Import::Common::Model::FindBy::TimeAccountingAttributes',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/user.rb b/lib/sequencer/sequence/import/kayako/user.rb
new file mode 100644
index 000000000..0aa7d8c9d
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/user.rb
@@ -0,0 +1,37 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class User < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Kayako::User::Identifier',
+ 'Import::Kayako::User::Login',
+ 'Import::Kayako::User::Initiator',
+ 'Import::Kayako::User::Password',
+ 'Import::Kayako::User::Roles',
+ 'Import::Kayako::User::GroupIds',
+ 'Import::Kayako::User::OrganizationId',
+ 'Common::ModelClass::User',
+ 'Import::Kayako::User::Mapping',
+ 'Import::Kayako::Mapping::Timestamps',
+ 'Import::Kayako::Mapping::CustomFields',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::FindBy::UserAttributes',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Kayako::MapId',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/kayako/user_field.rb b/lib/sequencer/sequence/import/kayako/user_field.rb
new file mode 100644
index 000000000..eb0a6490d
--- /dev/null
+++ b/lib/sequencer/sequence/import/kayako/user_field.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Sequence
+ module Import
+ module Kayako
+ class UserField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::User',
+ 'Import::Kayako::ObjectAttribute::Skip',
+ 'Import::Kayako::ObjectAttribute::SanitizedName',
+ 'Import::Kayako::ObjectAttribute::Config',
+ 'Import::Kayako::ObjectAttribute::Add',
+ 'Import::Kayako::ObjectAttribute::MigrationExecute',
+ 'Import::Kayako::ObjectAttribute::FieldMap',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/common/model_class/object_manager/attribute.rb b/lib/sequencer/unit/common/model_class/object_manager/attribute.rb
new file mode 100644
index 000000000..0868401be
--- /dev/null
+++ b/lib/sequencer/unit/common/model_class/object_manager/attribute.rb
@@ -0,0 +1,14 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Common
+ module ModelClass
+ module ObjectManager
+ class Attribute < Sequencer::Unit::Common::ModelClass::Base
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb b/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb
index 01c5701f9..d1c8b7bba 100644
--- a/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb
+++ b/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb
@@ -14,10 +14,6 @@ class Sequencer
uses :resource
- def object
- 'Conversation'
- end
-
def sequence_name
'Sequencer::Sequence::Import::Freshdesk::Conversations'.freeze
end
diff --git a/lib/sequencer/unit/import/kayako/case/customer_id.rb b/lib/sequencer/unit/import/kayako/case/customer_id.rb
new file mode 100644
index 000000000..8da3a0581
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/customer_id.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class CustomerId < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def customer_id
+ id_map['User'].fetch(resource['requester']&.fetch('id'), 1)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/group_id.rb b/lib/sequencer/unit/import/kayako/case/group_id.rb
new file mode 100644
index 000000000..708b4f901
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/group_id.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class GroupId < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def group_id
+ id_map['Group'].fetch(resource['assigned_team']&.fetch('id'), 1)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/mapping.rb b/lib/sequencer/unit/import/kayako/case/mapping.rb
new file mode 100644
index 000000000..d3227b942
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/mapping.rb
@@ -0,0 +1,37 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :customer_id, :owner_id, :group_id, :organization_id, :priority_id, :state_id,
+ :created_by_id, :updated_by_id, :type
+
+ def process
+ provide_mapped do
+ {
+ id: resource['id'],
+ number: resource['id'],
+ title: resource['subject'],
+ owner_id: owner_id,
+ group_id: group_id,
+ customer_id: customer_id,
+ organization_id: organization_id,
+ priority_id: priority_id,
+ state_id: state_id,
+ type: type,
+ updated_by_id: updated_by_id,
+ created_by_id: created_by_id,
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/organization_id.rb b/lib/sequencer/unit/import/kayako/case/organization_id.rb
new file mode 100644
index 000000000..feb4340c6
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/organization_id.rb
@@ -0,0 +1,28 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class OrganizationId < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def organization_id
+ return if organization.nil?
+
+ id_map['Organization'][organization['id']]
+ end
+
+ def organization
+ resource['requester']&.fetch('organization')
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/owner_id.rb b/lib/sequencer/unit/import/kayako/case/owner_id.rb
new file mode 100644
index 000000000..b1eae5ea3
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/owner_id.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class OwnerId < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def owner_id
+ id_map['User'].fetch(resource['assigned_agent']&.fetch('id'), 1)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/posts.rb b/lib/sequencer/unit/import/kayako/case/posts.rb
new file mode 100644
index 000000000..64d73a3f3
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/posts.rb
@@ -0,0 +1,35 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class Posts < Sequencer::Unit::Import::Kayako::SubSequence::SubObject
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ optional :action
+
+ skip_action :skipped, :failed
+
+ uses :resource
+
+ def object
+ 'Post'
+ end
+
+ def sequence_name
+ 'Sequencer::Sequence::Import::Kayako::Posts'.freeze
+ end
+
+ def request_params
+ super.merge(
+ ticket: resource,
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/priority_id.rb b/lib/sequencer/unit/import/kayako/case/priority_id.rb
new file mode 100644
index 000000000..d0ca0f755
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/priority_id.rb
@@ -0,0 +1,36 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class PriorityId < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource
+
+ private
+
+ def priority_id
+ ::Ticket::Priority.select(:id).find_by(name: local).id
+ end
+
+ def local
+ mapping.fetch(resource['priority']&.fetch('level'), mapping[nil])
+ end
+
+ def mapping
+ {
+ 1 => '1 low',
+ nil => '2 normal',
+ 2 => '2 normal',
+ 3 => '3 high',
+ 4 => '3 high',
+ }.freeze
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/skip/deleted.rb b/lib/sequencer/unit/import/kayako/case/skip/deleted.rb
new file mode 100644
index 000000000..18924aa39
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/skip/deleted.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ module Skip
+ class Deleted < Sequencer::Unit::Base
+
+ uses :resource
+ provides :action
+
+ def process
+ return if resource['state'] != 'TRASH'
+
+ logger.info { "Skipping. Kayako Case ID '#{resource['id']}' is in 'TRASH' state." }
+ state.provide(:action, :skipped)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/skip/suspended.rb b/lib/sequencer/unit/import/kayako/case/skip/suspended.rb
new file mode 100644
index 000000000..d16030d80
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/skip/suspended.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ module Skip
+ class Suspended < Sequencer::Unit::Base
+
+ uses :resource
+ provides :action
+
+ def process
+ return if resource['state'] != 'SUSPENDED'
+
+ logger.info { "Skipping. Kayako Case ID '#{resource['id']}' is in 'SUSPENDED' state." }
+ state.provide(:action, :skipped)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/state_id.rb b/lib/sequencer/unit/import/kayako/case/state_id.rb
new file mode 100644
index 000000000..8ea079033
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/state_id.rb
@@ -0,0 +1,37 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class StateId < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource
+
+ private
+
+ def state_id
+ ::Ticket::State.select(:id).find_by(name: local).id
+ end
+
+ def local
+ mapping.fetch(resource['status']['type'], 'open')
+ end
+
+ def mapping
+ {
+ 'NEW' => 'new',
+ 'OPEN' => 'open',
+ 'PENDING' => 'pending reminder',
+ 'COMPLETED' => 'closed',
+ 'CLOSED' => 'closed',
+ 'CUSTOM' => 'open',
+ }.freeze
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/tags.rb b/lib/sequencer/unit/import/kayako/case/tags.rb
new file mode 100644
index 000000000..78b0a3136
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/tags.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class Tags < Sequencer::Unit::Common::Model::Tags
+
+ uses :resource
+
+ private
+
+ def tags
+ resource['tags']&.map { |tag| tag['name'] }
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/type.rb b/lib/sequencer/unit/import/kayako/case/type.rb
new file mode 100644
index 000000000..3914237ea
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/type.rb
@@ -0,0 +1,23 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class Type < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource
+
+ private
+
+ def type
+ type = resource['type']&.fetch('type')
+ type&.capitalize
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case/updated_by_id.rb b/lib/sequencer/unit/import/kayako/case/updated_by_id.rb
new file mode 100644
index 000000000..ab82beb9d
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case/updated_by_id.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Case
+ class UpdatedById < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map, :created_by_id
+
+ private
+
+ def updated_by_id
+ id_map['User'].fetch(resource['last_updated_by']&.fetch('id'), created_by_id)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/case_fields.rb b/lib/sequencer/unit/import/kayako/case_fields.rb
new file mode 100644
index 000000000..ffb40f5c3
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/case_fields.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class CaseFields < Sequencer::Unit::Import::Kayako::SubSequence::Field
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/cases.rb b/lib/sequencer/unit/import/kayako/cases.rb
new file mode 100644
index 000000000..966f8ca55
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/cases.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Cases < Sequencer::Unit::Import::Kayako::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/common/article_sender_id.rb b/lib/sequencer/unit/import/kayako/common/article_sender_id.rb
new file mode 100644
index 000000000..6dd94b7b9
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/common/article_sender_id.rb
@@ -0,0 +1,33 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Common
+ class ArticleSenderId < Sequencer::Unit::Common::Provider::Named
+
+ uses :created_by_id
+
+ private
+
+ def article_sender_id
+ return article_sender('Customer') if author.role?('Customer')
+ return article_sender('Agent') if author.role?('Agent')
+
+ article_sender('System')
+ end
+
+ def author
+ @author ||= ::User.find(created_by_id)
+ end
+
+ def article_sender(name)
+ ::Ticket::Article::Sender.select(:id).find_by(name: name).id
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/common/article_source_channel.rb b/lib/sequencer/unit/import/kayako/common/article_source_channel.rb
new file mode 100644
index 000000000..3d52c5f92
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/common/article_source_channel.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Common
+ class ArticleSourceChannel < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def article_source_channel
+ channel = resource['source_channel']&.fetch('type')
+
+ return if !channel
+
+ "Sequencer::Unit::Import::Kayako::Post::Channel::#{channel.capitalize}".constantize.new(resource)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/common/created_by_id.rb b/lib/sequencer/unit/import/kayako/common/created_by_id.rb
new file mode 100644
index 000000000..326a93fe0
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/common/created_by_id.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Common
+ class CreatedById < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def created_by_id
+ id_map['User'].fetch(resource['creator']&.fetch('id'), 1)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/default_language.rb b/lib/sequencer/unit/import/kayako/default_language.rb
new file mode 100644
index 000000000..42bab6c1b
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/default_language.rb
@@ -0,0 +1,43 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class DefaultLanguage < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Kayako::Requester
+
+ provides :default_language
+
+ def process
+ state.provide(:default_language, default_language)
+ end
+
+ private
+
+ def default_language
+ settings = fetch_settings
+
+ default_language_setting = settings.detect { |item| item['name'] == 'default_language' }
+
+ default_language_setting['value'] || 'en-us'
+ end
+
+ def fetch_settings
+ response = request(
+ api_path: 'settings'
+ )
+
+ body = JSON.parse(response.body)
+ body['data']
+ rescue => e
+ logger.error 'Error when fetching settings for default language'
+ logger.error e
+
+ nil
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/field_map.rb b/lib/sequencer/unit/import/kayako/field_map.rb
new file mode 100644
index 000000000..639d1704f
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/field_map.rb
@@ -0,0 +1,16 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class FieldMap < Sequencer::Unit::Common::Provider::Named
+
+ def field_map
+ {}
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/id_map.rb b/lib/sequencer/unit/import/kayako/id_map.rb
new file mode 100644
index 000000000..19770e77c
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/id_map.rb
@@ -0,0 +1,16 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class IdMap < Sequencer::Unit::Common::Provider::Named
+
+ def id_map
+ {}
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/import_settings_unset.rb b/lib/sequencer/unit/import/kayako/import_settings_unset.rb
new file mode 100644
index 000000000..074f49dd6
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/import_settings_unset.rb
@@ -0,0 +1,16 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class ImportSettingsUnset < Sequencer::Unit::Base
+ def process
+ Setting.set('import_kayako_endpoint_username', nil)
+ Setting.set('import_kayako_endpoint_password', nil)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/map_id.rb b/lib/sequencer/unit/import/kayako/map_id.rb
new file mode 100644
index 000000000..a43abf9e9
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/map_id.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class MapId < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ optional :action
+
+ skip_action :skipped, :failed
+
+ uses :id_map, :model_class, :resource, :instance
+
+ def process
+ id_map[model_class.name] ||= {}
+ id_map[model_class.name][resource['id']] = instance.id
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/mapping/custom_fields.rb b/lib/sequencer/unit/import/kayako/mapping/custom_fields.rb
new file mode 100644
index 000000000..4ab910abc
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/mapping/custom_fields.rb
@@ -0,0 +1,48 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Mapping
+ class CustomFields < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :field_map, :model_class, :default_language
+
+ def process
+ provide_mapped do
+ custom_fields || {}
+ end
+ end
+
+ private
+
+ def custom_fields
+ resource['custom_fields']&.each_with_object({}) do |item, result|
+ field = item['field']
+ local_name = custom_fields_map[field['key']]
+
+ next if local_name.nil? || item['value'].empty?
+
+ field_type_instance = attribute_type_instance(field)
+
+ result[ local_name.to_sym ] = field_type_instance.local_value(item['value'])
+ end
+ end
+
+ def custom_fields_map
+ @custom_fields_map ||= field_map[model_class.name]
+ end
+
+ def attribute_type_instance(field)
+ "Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::#{field['type'].capitalize}".constantize.new(field, default_language)
+ rescue
+ nil
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/mapping/timestamps.rb b/lib/sequencer/unit/import/kayako/mapping/timestamps.rb
new file mode 100644
index 000000000..0fe5a0e9f
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/mapping/timestamps.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Mapping
+ class Timestamps < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource
+
+ def process
+ provide_mapped do
+ {
+ created_at: resource['created_at'],
+ updated_at: resource['updated_at'],
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/model_class.rb b/lib/sequencer/unit/import/kayako/model_class.rb
new file mode 100644
index 000000000..1d18be336
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/model_class.rb
@@ -0,0 +1,29 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class ModelClass < Sequencer::Unit::Common::Provider::Named
+
+ uses :object
+
+ MAP = {
+ 'Organization' => ::Organization,
+ 'User' => ::User,
+ 'Team' => ::Group,
+ 'Case' => ::Ticket,
+ 'Post' => ::Ticket::Article,
+ 'TimeEntry' => ::Ticket::TimeAccounting,
+ }.freeze
+
+ private
+
+ def model_class
+ MAP[object]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/add.rb b/lib/sequencer/unit/import/kayako/object_attribute/add.rb
new file mode 100644
index 000000000..08295809c
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/add.rb
@@ -0,0 +1,23 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ class Add < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ uses :config
+
+ def process
+ ObjectManager::Attribute.add(config)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/base.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/base.rb
new file mode 100644
index 000000000..da879199a
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/base.rb
@@ -0,0 +1,91 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Base
+ attr_reader :attribute, :default_language
+
+ def initialize(attribute, default_language)
+ @attribute = attribute
+ @default_language = default_language
+ end
+
+ def config
+ {
+ display: attribute['title'],
+ data_type: data_type,
+ data_option: data_option,
+ editable: true,
+ active: attribute['is_enabled'],
+ screens: screens,
+ position: attribute['sort_order'],
+ created_by_id: 1,
+ updated_by_id: 1,
+ }
+ end
+
+ def local_value(value)
+ value
+ end
+
+ private
+
+ def screens
+ default = {
+ view: {
+ '-all-' => {
+ shown: true,
+ null: true,
+ },
+ Customer: {
+ shown: attribute['is_visible_to_customers'],
+ null: true,
+ },
+ },
+ edit: {
+ '-all-' => {
+ shown: true,
+ null: true,
+ },
+ Customer: {
+ shown: attribute['is_customer_editable'],
+ null: !attribute['is_required_for_customers'],
+ },
+ }
+ }
+
+ if attribute['is_required_for_agents']
+ default[:edit]['ticket.agent'] = {
+ shown: true,
+ required: true,
+ }
+ end
+
+ default
+ end
+
+ def data_option
+ {
+ null: true,
+ note: '',
+ }.merge(data_type_specific_options)
+ end
+
+ def data_type_specific_options
+ {}
+ end
+
+ def data_type
+ attribute['type'].downcase
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/cascadingselect.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/cascadingselect.rb
new file mode 100644
index 000000000..8d87a0ab7
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/cascadingselect.rb
@@ -0,0 +1,64 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Cascadingselect < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Select
+ def local_value(value)
+ super.gsub('\\', '::')
+ end
+
+ private
+
+ def data_type
+ 'tree_select'
+ end
+
+ def options
+ result = []
+
+ attribute['options'].each do |item|
+ locale_item = item['values'].detect { |value| value['locale'] == default_language }
+
+ next if locale_item['translation'].nil?
+
+ transformed_tree_path = locale_item['translation'].gsub('\\', '::')
+
+ process_option(transformed_tree_path, result)
+ end
+
+ result
+ end
+
+ def process_option(tree_path, current_options, parent_tree_path = nil)
+ fragments = tree_path.split('::')
+
+ current_fragment = fragments.shift
+
+ current_tree_path = parent_tree_path.nil? ? current_fragment : "#{parent_tree_path}::#{current_fragment}"
+
+ current_option = current_options.detect { |option| option[:value] == current_tree_path }
+
+ remaining_tree_path = fragments.join('::')
+
+ if current_option.nil?
+ current_options.push({ name: current_fragment, value: current_tree_path })
+
+ current_option = current_options.last
+ end
+
+ return if remaining_tree_path.empty?
+
+ current_option[:children] ||= []
+ process_option(remaining_tree_path, current_option[:children], current_tree_path)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/date.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/date.rb
new file mode 100644
index 000000000..7682758ce
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/date.rb
@@ -0,0 +1,25 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Date < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base
+ private
+
+ def data_type_specific_options
+ {
+ future: true,
+ past: true,
+ diff: 0,
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/decimal.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/decimal.rb
new file mode 100644
index 000000000..b4c1c13a1
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/decimal.rb
@@ -0,0 +1,16 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Decimal < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Text
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/numeric.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/numeric.rb
new file mode 100644
index 000000000..17b1bfc7d
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/numeric.rb
@@ -0,0 +1,28 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Numeric < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base
+ private
+
+ def data_type
+ 'integer'
+ end
+
+ def data_type_specific_options
+ {
+ min: 0,
+ max: 999_999_999,
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/radio.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/radio.rb
new file mode 100644
index 000000000..4586ca7d9
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/radio.rb
@@ -0,0 +1,16 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Radio < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Select
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/regex.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/regex.rb
new file mode 100644
index 000000000..cb768f0c6
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/regex.rb
@@ -0,0 +1,23 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Regex < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Text
+ private
+
+ def data_type_specific_options
+ super.merge(
+ regex: attribute['regular_expression'],
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/select.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/select.rb
new file mode 100644
index 000000000..f4e55ec48
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/select.rb
@@ -0,0 +1,44 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Select < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base
+ def local_value(value)
+ option_value = attribute['options'].detect { |option| option['id'] == value.to_i }
+ value_locale = option_value['values'].detect { |locale_item| locale_item['locale'] == default_language }
+
+ value_locale['translation']
+ end
+
+ private
+
+ def data_type
+ 'select'
+ end
+
+ def data_type_specific_options
+ {
+ default: '',
+ options: options,
+ }
+ end
+
+ def options
+ result = {}
+ attribute['options'].each do |item|
+ locale_item = item['values'].detect { |value| value['locale'] == default_language }
+ result[ locale_item['translation'] ] = locale_item['translation']
+ end
+ result
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/text.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/text.rb
new file mode 100644
index 000000000..22e36abed
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/text.rb
@@ -0,0 +1,28 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Text < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base
+ private
+
+ def data_type
+ 'input'
+ end
+
+ def data_type_specific_options
+ {
+ type: 'text',
+ maxlength: 255,
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/textarea.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/textarea.rb
new file mode 100644
index 000000000..5024d6120
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/textarea.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Textarea < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base
+ private
+
+ def data_type_specific_options
+ {
+ type: 'textarea',
+ maxlength: 255,
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/type.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/type.rb
new file mode 100644
index 000000000..68b1177e2
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/type.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Type < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Select
+ private
+
+ def options
+ super.merge(
+ 'Question' => 'Question',
+ 'Task' => 'Task',
+ 'Problem' => 'Problem',
+ 'Incident' => 'Incident',
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/yesno.rb b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/yesno.rb
new file mode 100644
index 000000000..a59c41a17
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/attribute_type/yesno.rb
@@ -0,0 +1,35 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ module AttributeType
+ class Yesno < Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::Base
+ def local_value(value)
+ value == 'yes'
+ end
+
+ private
+
+ def data_type
+ 'boolean'
+ end
+
+ def data_type_specific_options
+ {
+ default: false,
+ options: {
+ true => 'yes',
+ false => 'no',
+ },
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/config.rb b/lib/sequencer/unit/import/kayako/object_attribute/config.rb
new file mode 100644
index 000000000..9b8e2903d
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/config.rb
@@ -0,0 +1,41 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ class Config < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+ include ::Sequencer::Unit::Import::Common::Model::Mixin::HandleFailure
+
+ skip_any_action
+
+ uses :resource, :sanitized_name, :model_class, :default_language
+ provides :config
+
+ def process
+ attribute_config = attribute_type.config
+
+ state.provide(:config) do
+ {
+ object: model_class.to_s,
+ name: sanitized_name,
+ }.merge(attribute_config)
+ end
+ rescue => e
+ logger.error "The custom field type '#{resource['type']}' can not be mapped to an internal field."
+ handle_failure(e)
+ end
+
+ private
+
+ def attribute_type
+ "Sequencer::Unit::Import::Kayako::ObjectAttribute::AttributeType::#{resource['type'].capitalize}".constantize.new(resource, default_language)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/field_map.rb b/lib/sequencer/unit/import/kayako/object_attribute/field_map.rb
new file mode 100644
index 000000000..9c9cf1c4b
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/field_map.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ class FieldMap < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ optional :action
+
+ uses :field_map, :model_class, :resource, :sanitized_name
+
+ def process
+ field_map[model_class.name] ||= {}
+ field_map[model_class.name][ resource['key'] ] = sanitized_name
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/migration_execute.rb b/lib/sequencer/unit/import/kayako/object_attribute/migration_execute.rb
new file mode 100644
index 000000000..85c762c87
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/migration_execute.rb
@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ class MigrationExecute < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ def process
+ ObjectManager::Attribute.migration_execute(false)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/sanitized_name.rb b/lib/sequencer/unit/import/kayako/object_attribute/sanitized_name.rb
new file mode 100644
index 000000000..807c8ca1f
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/sanitized_name.rb
@@ -0,0 +1,25 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ class SanitizedName < Sequencer::Unit::Import::Common::ObjectAttribute::SanitizedName
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ uses :resource
+
+ private
+
+ def unsanitized_name
+ resource['key']
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_attribute/skip.rb b/lib/sequencer/unit/import/kayako/object_attribute/skip.rb
new file mode 100644
index 000000000..d1bcf3740
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_attribute/skip.rb
@@ -0,0 +1,33 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module ObjectAttribute
+ class Skip < Sequencer::Unit::Base
+
+ uses :resource
+ provides :action
+
+ def process
+ return if (!resource['is_system'] && skip_attribute_types.exclude?(resource['type'])) || allowed_system_attributes.include?(resource['key'])
+
+ state.provide(:action, :skipped)
+ end
+
+ private
+
+ def skip_attribute_types
+ @skip_attribute_types ||= %w[FILE CHECKBOX]
+ end
+
+ def allowed_system_attributes
+ @allowed_system_attributes ||= %w[type]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/object_count.rb b/lib/sequencer/unit/import/kayako/object_count.rb
new file mode 100644
index 000000000..1f97c4f6a
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/object_count.rb
@@ -0,0 +1,32 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class ObjectCount < Sequencer::Unit::Common::Provider::Attribute
+ include ::Sequencer::Unit::Import::Common::Model::Statistics::Mixin::EmptyDiff
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_action :skipped, :failed
+
+ uses :model_class, :resources
+
+ private
+
+ def statistics_diff
+ {
+ model_key => empty_diff.merge!(
+ total: resources.count
+ )
+ }
+ end
+
+ def model_key
+ model_class.name.pluralize.to_sym
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/organization/mapping.rb b/lib/sequencer/unit/import/kayako/organization/mapping.rb
new file mode 100644
index 000000000..c63e90213
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/organization/mapping.rb
@@ -0,0 +1,36 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Organization
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource
+
+ def process
+ provide_mapped do
+ {
+ name: resource['name'],
+ domain: domain,
+ domain_assignment: domain.present?,
+ }
+ end
+ end
+
+ private
+
+ def domain
+ @domain ||= begin
+ primary_domain = resource['domains']&.detect { |item| item['is_primary'] }
+ primary_domain&.fetch('domain')
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/organization_fields.rb b/lib/sequencer/unit/import/kayako/organization_fields.rb
new file mode 100644
index 000000000..5414b5b5f
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/organization_fields.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class OrganizationFields < Sequencer::Unit::Import::Kayako::SubSequence::Field
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/organizations.rb b/lib/sequencer/unit/import/kayako/organizations.rb
new file mode 100644
index 000000000..fa89b37a9
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/organizations.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Organizations < Sequencer::Unit::Import::Kayako::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/perform.rb b/lib/sequencer/unit/import/kayako/perform.rb
new file mode 100644
index 000000000..418620545
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/perform.rb
@@ -0,0 +1,33 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Perform < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_action :skipped, :failed
+
+ uses :resources, :object, :import_job, :dry_run, :field_map, :id_map, :default_language
+ optional :instance
+
+ def process
+ resources.each do |resource|
+ ::Sequencer.process("Import::Kayako::#{object}",
+ parameters: {
+ import_job: import_job,
+ dry_run: dry_run,
+ resource: resource,
+ default_language: default_language,
+ field_map: field_map,
+ id_map: id_map,
+ instance: instance,
+ })
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/attachments.rb b/lib/sequencer/unit/import/kayako/post/attachments.rb
new file mode 100644
index 000000000..cfebd3646
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/attachments.rb
@@ -0,0 +1,71 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ class Attachments < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Kayako::Requester
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ optional :action
+
+ skip_action :skipped, :failed
+
+ uses :resource, :instance, :model_class, :dry_run
+
+ def self.mutex
+ @mutex ||= Mutex.new
+ end
+
+ def process
+ return if resource['attachments'].blank?
+
+ download_threads.each(&:join)
+ end
+
+ private
+
+ def download_threads
+ resource['attachments'].map do |attachment|
+ Thread.new do
+ sync(attachment)
+ end
+ end
+ end
+
+ def sync(attachment)
+ logger.debug { "Downloading attachment #{attachment}" }
+
+ response = request(
+ api_path: attachment['url_download'].gsub("#{Setting.get('import_kayako_endpoint')}/", ''),
+ )
+
+ return if dry_run
+
+ store_attachment(attachment, response)
+ rescue => e
+ logger.error(e)
+ end
+
+ def store_attachment(attachment, response)
+ self.class.mutex.synchronize do
+ ::Store.add(
+ object: model_class.name,
+ o_id: instance.id,
+ data: response.body,
+ filename: attachment['name'],
+ preferences: {
+ 'Content-Type' => attachment['type']
+ },
+ created_by_id: 1
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/channel/base.rb b/lib/sequencer/unit/import/kayako/post/channel/base.rb
new file mode 100644
index 000000000..0f2739a15
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/channel/base.rb
@@ -0,0 +1,60 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ module Channel
+ class Base
+ attr_reader :resource
+
+ def initialize(resource)
+ @resource = resource
+ end
+
+ def mapping
+ {
+ message_id: resource['id'],
+ internal: internal?,
+ from: from,
+ type_id: article_type_id,
+ }
+ end
+
+ def article_type_id
+ return if article_type_name.nil?
+
+ ::Ticket::Article::Type.select(:id).find_by(name: article_type_name).id
+ end
+
+ private
+
+ def internal?
+ false
+ end
+
+ def original_post
+ resource['original']
+ end
+
+ def article_type_name
+ raise NotImplementedError
+ end
+
+ def identify_key
+ raise NotImplementedError
+ end
+
+ def from
+ return if resource['identity'].nil?
+
+ resource['identity'][identify_key]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/channel/facebook.rb b/lib/sequencer/unit/import/kayako/post/channel/facebook.rb
new file mode 100644
index 000000000..3a2dbcaaf
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/channel/facebook.rb
@@ -0,0 +1,42 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ module Channel
+ class Facebook < Sequencer::Unit::Import::Kayako::Post::Channel::Base
+ def mapping
+ super.merge(
+ message_id: original_post['id'],
+ to: to,
+ body: original_post['contents'],
+ )
+ end
+
+ private
+
+ def article_type_name
+ return 'facebook direct-message' if original_post['resource_type'] == 'facebook_message'
+ return 'facebook feed comment' if original_post['resource_type'] == 'facebook_post_comment'
+
+ 'facebook feed post'
+ end
+
+ def identify_key
+ 'facebook_id'
+ end
+
+ def to
+ return if original_post['recipient'].nil?
+
+ original_post['recipient'][identify_key]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/channel/helpcenter.rb b/lib/sequencer/unit/import/kayako/post/channel/helpcenter.rb
new file mode 100644
index 000000000..3dcfc1a31
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/channel/helpcenter.rb
@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ module Channel
+ class Helpcenter < Sequencer::Unit::Import::Kayako::Post::Channel::Mail
+ private
+
+ def article_type_name
+ 'web'
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/channel/mail.rb b/lib/sequencer/unit/import/kayako/post/channel/mail.rb
new file mode 100644
index 000000000..75a0559aa
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/channel/mail.rb
@@ -0,0 +1,65 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ module Channel
+ class Mail < Sequencer::Unit::Import::Kayako::Post::Channel::Base
+ def mapping
+ super.merge(
+ to: to,
+ cc: cc,
+ body: original_post['body_html'] || original_post['body_text'] || '',
+ content_type: 'text/html',
+ )
+ end
+
+ private
+
+ def article_type_name
+ 'email'
+ end
+
+ def identify_key
+ 'email'
+ end
+
+ def from
+ return super if resource['is_requester'] || original_post['mailbox'].blank?
+
+ original_post['mailbox']['address']
+ end
+
+ def to
+ recipients = build_recipients('TO')
+
+ # Add the mailbox address to the 'TO' field if it's a requester post.
+ if resource['is_requester'] && original_post['mailbox'].present?
+ recipients = "#{original_post['mailbox']['address']}#{", #{recipients}" if recipients.present?}"
+ end
+
+ recipients
+ end
+
+ def cc
+ build_recipients('CC')
+ end
+
+ def build_recipients(field_type)
+ return if !original_post.key?('recipients') || original_post['recipients'].empty?
+
+ original_post['recipients'].filter_map do |recipient|
+ next if recipient['type'] != field_type
+
+ recipient[identify_key]
+ end.join(', ')
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/channel/messenger.rb b/lib/sequencer/unit/import/kayako/post/channel/messenger.rb
new file mode 100644
index 000000000..ce9f2f887
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/channel/messenger.rb
@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ module Channel
+ class Messenger < Sequencer::Unit::Import::Kayako::Post::Channel::Mail
+ private
+
+ def article_type_name
+ 'chat'
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/channel/note.rb b/lib/sequencer/unit/import/kayako/post/channel/note.rb
new file mode 100644
index 000000000..b6ba9830d
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/channel/note.rb
@@ -0,0 +1,36 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ module Channel
+ class Note < Sequencer::Unit::Import::Kayako::Post::Channel::Base
+ def mapping
+ super.merge(
+ body: original_post['body_html'] || original_post['body_text'] || '',
+ content_type: 'text/html',
+ )
+ end
+
+ private
+
+ def identify_key
+ 'email'
+ end
+
+ def article_type_name
+ 'note'
+ end
+
+ def internal?
+ true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/channel/twitter.rb b/lib/sequencer/unit/import/kayako/post/channel/twitter.rb
new file mode 100644
index 000000000..10815ccd5
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/channel/twitter.rb
@@ -0,0 +1,41 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ module Channel
+ class Twitter < Sequencer::Unit::Import::Kayako::Post::Channel::Base
+ def mapping
+ super.merge(
+ message_id: original_post['id'],
+ to: to,
+ body: original_post['contents'],
+ )
+ end
+
+ private
+
+ def article_type_name
+ return 'twitter direct-message' if original_post['resource_type'] == 'twitter_message'
+
+ 'twitter status'
+ end
+
+ def identify_key
+ 'screen_name'
+ end
+
+ def to
+ return if original_post['recipient'].nil?
+
+ original_post['recipient'][identify_key]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/email_address_fields.rb b/lib/sequencer/unit/import/kayako/post/email_address_fields.rb
new file mode 100644
index 000000000..e3374571f
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/email_address_fields.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ class EmailAddressFields < Sequencer::Unit::Base
+
+ uses :resource, :id_map
+ provides :from, :to, :cc
+
+ def process
+ state.provide(:user_id) do
+ user_map.fetch(resource.author_id, 1)
+ end
+ end
+
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/inline_images.rb b/lib/sequencer/unit/import/kayako/post/inline_images.rb
new file mode 100644
index 000000000..734ce072e
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/inline_images.rb
@@ -0,0 +1,77 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ class InlineImages < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :mapped
+
+ def process
+ return if !contains_inline_image?(mapped[:body])
+
+ provide_mapped do
+ {
+ body: replaced_inline_images,
+ }
+ end
+ end
+
+ def self.inline_data(kayako_url)
+ @cache ||= {}
+ return @cache[kayako_url] if @cache[kayako_url]
+
+ image_data = download(kayako_url)
+ return if image_data.blank?
+
+ @cache[kayako_url] = "data:image/png;base64,#{Base64.strict_encode64(image_data)}"
+ @cache[kayako_url]
+ end
+
+ def self.download(kayako_url)
+ logger.debug { "Downloading inline image from #{kayako_url}" }
+
+ response = UserAgent.get(
+ kayako_url,
+ {},
+ {
+ open_timeout: 20,
+ read_timeout: 240,
+ verify_ssl: true,
+ },
+ )
+
+ return response.body if response.success?
+
+ logger.error response.error
+ nil
+ end
+
+ private
+
+ def contains_inline_image?(string)
+ return false if string.blank?
+
+ string.include?('kayako.com/media/url')
+ end
+
+ def replaced_inline_images
+ body_html = Nokogiri::HTML(mapped[:body])
+
+ body_html.css('img').each do |node|
+ next if !contains_inline_image?(node['src'])
+
+ node.attributes['src'].value = self.class.inline_data(node['src'])
+ end
+
+ body_html.to_html
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/mapping.rb b/lib/sequencer/unit/import/kayako/post/mapping.rb
new file mode 100644
index 000000000..8c3411eff
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/mapping.rb
@@ -0,0 +1,29 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :instance, :resource, :created_by_id, :article_sender_id, :article_source_channel
+ provides :mapped
+
+ def process
+ provide_mapped do
+ {
+ ticket_id: instance.id,
+ sender_id: article_sender_id,
+ created_by_id: created_by_id,
+ updated_by_id: created_by_id,
+ }.merge(article_source_channel.mapping)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/post/unset_instance.rb b/lib/sequencer/unit/import/kayako/post/unset_instance.rb
new file mode 100644
index 000000000..4b9eda937
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/post/unset_instance.rb
@@ -0,0 +1,15 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Post
+ class UnsetInstance < Sequencer::Unit::Common::UnsetAttributes
+ uses :instance
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request.rb b/lib/sequencer/unit/import/kayako/request.rb
new file mode 100644
index 000000000..1cb2cacab
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request.rb
@@ -0,0 +1,40 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ extend ::Sequencer::Unit::Import::Kayako::Requester
+
+ uses :object, :request_params
+ provides :response
+
+ private
+
+ def response
+
+ builder = backend.new(
+ object: object,
+ request_params: request_params
+ )
+
+ self.class.request(
+ api_path: builder.api_path,
+ params: builder.params,
+ )
+ end
+
+ def backend
+ request_class = "::Sequencer::Unit::Import::Kayako::Request::#{object}".safe_constantize
+
+ return request_class if request_class.present?
+ return ::Sequencer::Unit::Import::Kayako::Request::GenericField if object.include?('Field')
+
+ ::Sequencer::Unit::Import::Kayako::Request::Generic
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request/case.rb b/lib/sequencer/unit/import/kayako/request/case.rb
new file mode 100644
index 000000000..2497291c8
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request/case.rb
@@ -0,0 +1,20 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class Case < Sequencer::Unit::Import::Kayako::Request::Generic
+ def params
+ super.merge(
+ include: 'user,case_priority,case_status,channel,tag,case_type',
+ fields: '+tags',
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request/generic.rb b/lib/sequencer/unit/import/kayako/request/generic.rb
new file mode 100644
index 000000000..357854e0e
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request/generic.rb
@@ -0,0 +1,30 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class Generic
+ attr_reader :object, :request_params
+
+ def initialize(object:, request_params:)
+ @object = object
+ @request_params = request_params
+ end
+
+ def api_path
+ object.underscore.split('_').map(&:pluralize).join('/')
+ end
+
+ def params
+ request_params.merge(
+ limit: 100,
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request/generic_field.rb b/lib/sequencer/unit/import/kayako/request/generic_field.rb
new file mode 100644
index 000000000..ba34439cf
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request/generic_field.rb
@@ -0,0 +1,19 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class GenericField < Sequencer::Unit::Import::Kayako::Request::Generic
+ def params
+ super.merge(
+ include: 'field_option,locale_field',
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request/organization.rb b/lib/sequencer/unit/import/kayako/request/organization.rb
new file mode 100644
index 000000000..bf00c3dc7
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request/organization.rb
@@ -0,0 +1,19 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class Organization < Sequencer::Unit::Import::Kayako::Request::Generic
+ def params
+ super.merge(
+ include: 'organization_field,field_option,locale_field,identity_domain',
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request/post.rb b/lib/sequencer/unit/import/kayako/request/post.rb
new file mode 100644
index 000000000..6f0935887
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request/post.rb
@@ -0,0 +1,30 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class Post < Sequencer::Unit::Import::Kayako::Request::Generic
+ attr_reader :ticket
+
+ def initialize(...)
+ super
+ @ticket = request_params.delete(:ticket)
+ end
+
+ def api_path
+ "cases/#{ticket['id']}/posts"
+ end
+
+ def params
+ super.merge(
+ include: 'mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet',
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request/time_entry.rb b/lib/sequencer/unit/import/kayako/request/time_entry.rb
new file mode 100644
index 000000000..9890aac8e
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request/time_entry.rb
@@ -0,0 +1,17 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class TimeEntry < Sequencer::Unit::Import::Kayako::Request::Generic
+ def api_path
+ 'timetracking'
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/request/user.rb b/lib/sequencer/unit/import/kayako/request/user.rb
new file mode 100644
index 000000000..c9dc60c13
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/request/user.rb
@@ -0,0 +1,19 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class User < Sequencer::Unit::Import::Kayako::Request::Generic
+ def params
+ super.merge(
+ include: 'user_field,field_option,locale_field,identity_email,identify_phone,identity_twitter,identity_facebook,role',
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/requester.rb b/lib/sequencer/unit/import/kayako/requester.rb
new file mode 100644
index 000000000..06b37f126
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/requester.rb
@@ -0,0 +1,86 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Requester
+ mattr_accessor :session_id
+
+ def request(api_path:, params: nil)
+ 10.times do |iteration|
+ response = perform_request(
+ api_path: api_path,
+ params: params,
+ )
+
+ if response.is_a? Net::HTTPOK
+ refresh_session_id(response)
+ return response
+ end
+
+ handle_error response, iteration
+ rescue Net::HTTPClientError => e
+ handle_exception e, iteration
+ end
+
+ nil
+ end
+
+ def handle_error(response, iteration)
+ reset_session_id if response.is_a? Net::HTTPUnauthorized
+
+ sleep_for = 10
+ case response
+ when Net::HTTPTooManyRequests
+ sleep_for = response.header['retry-after'].to_i + 10
+ logger.info "Rate limit: #{response.header.to_hash} (429 Too Many Requests). Sleeping #{sleep_for} seconds and retry (##{iteration + 1}/10)."
+ else
+ logger.info "Unknown response: #{response.inspect}. Sleeping 10 seconds and retry (##{iteration + 1}/10)."
+ end
+ sleep sleep_for
+ end
+
+ def handle_exception(e, iteration)
+ logger.error e
+ logger.info "Sleeping 10 seconds after #{e.class.name} and retry (##{iteration + 1}/10)."
+ sleep 10
+ end
+
+ def refresh_session_id(response)
+ return if response.header['content-type'] != 'application/json'
+
+ body = JSON.parse(response.body)
+
+ return if body['session_id'].blank?
+
+ self.session_id = body['session_id']
+ end
+
+ def reset_session_id
+ self.session_id = nil
+ end
+
+ def perform_request(api_path:, params: nil)
+ uri = URI("#{Setting.get('import_kayako_endpoint')}/#{api_path}")
+ uri.query = URI.encode_www_form(params) if params.present?
+ headers = {
+ 'Content-Type' => 'application/json',
+ 'X-Session-ID' => session_id
+ }
+
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 600) do |http|
+ # for those special moments...
+ # http.set_debug_output($stdout)
+ request = Net::HTTP::Get.new(uri, headers)
+ if session_id.blank?
+ request.basic_auth(Setting.get('import_kayako_endpoint_username'), Setting.get('import_kayako_endpoint_password'))
+ end
+ return http.request(request)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/resources.rb b/lib/sequencer/unit/import/kayako/resources.rb
new file mode 100644
index 000000000..eba0f41d8
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/resources.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Resources < Sequencer::Unit::Common::Provider::Named
+ include ::Sequencer::Unit::Import::Common::Model::Mixin::HandleFailure
+
+ uses :response
+
+ private
+
+ def resources
+ body = JSON.parse(response.body)
+
+ body['data']
+ rescue => e
+ logger.error "Won't be continued, because no response is available."
+ handle_failure(e)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/field.rb b/lib/sequencer/unit/import/kayako/sub_sequence/field.rb
new file mode 100644
index 000000000..4bb8a8ec2
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/sub_sequence/field.rb
@@ -0,0 +1,18 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module SubSequence
+ class Field < Sequencer::Unit::Import::Kayako::SubSequence::Generic
+
+ def sequence_name
+ 'Sequencer::Sequence::Import::Kayako::GenericField'.freeze
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/generic.rb b/lib/sequencer/unit/import/kayako/sub_sequence/generic.rb
new file mode 100644
index 000000000..f068351f4
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/sub_sequence/generic.rb
@@ -0,0 +1,99 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module SubSequence
+ class Generic < Sequencer::Unit::Base
+
+ uses :dry_run, :import_job, :field_map, :id_map, :default_language
+
+ attr_accessor :iteration, :result
+
+ EXPECTING = %i[action response].freeze
+
+ def process
+ loop.each_with_index do |_, iteration|
+ @iteration = iteration
+ @result = ::Sequencer.process(sequence_name,
+ parameters: sequence_params,
+ expecting: self.class.const_get(:EXPECTING))
+ break if iteration_should_stop?
+ end
+ end
+
+ def sequence_params
+ {
+ request_params: request_params,
+ import_job: import_job,
+ dry_run: dry_run,
+ object: object,
+ default_language: default_language,
+ field_map: field_map,
+ id_map: id_map,
+ }
+ end
+
+ def request_params
+ return {} if iteration.zero?
+
+ if cursor_pagination?
+ return cursor_pagination
+ end
+
+ offset_pagination
+ end
+
+ def object
+ @object ||= self.class.name.demodulize.singularize
+ end
+
+ def sequence_name
+ raise NotImplementedError
+ end
+
+ private
+
+ def offset_pagination
+ {
+ offset: offset,
+ }
+ end
+
+ def offset
+ iteration * 5 # TODO: only ddebug, normally 100
+ end
+
+ def cursor_pagination?
+ return if result.nil?
+
+ @cursor_pagination ||= result[:response].header['link'].include?('after_id')
+ end
+
+ def cursor_pagination
+ {
+ after_id: cursor_after_id
+ }
+ end
+
+ def cursor_after_id
+ unescaped_header_next_link.match(%r{after_id=(\d+)})[1]
+ end
+
+ def unescaped_header_next_link
+ CGI.unescape(CGI.unescape(result[:response].header['link']))
+ end
+
+ def iteration_should_stop?
+ return true if result[:action] == :failed
+ return true if result[:response].header['link'].blank? || result[:response].header['link'].exclude?('rel="next"')
+
+ false
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/object.rb b/lib/sequencer/unit/import/kayako/sub_sequence/object.rb
new file mode 100644
index 000000000..8a48de5ee
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/sub_sequence/object.rb
@@ -0,0 +1,18 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module SubSequence
+ class Object < Sequencer::Unit::Import::Kayako::SubSequence::Generic
+
+ def sequence_name
+ 'Sequencer::Sequence::Import::Kayako::GenericObject'.freeze
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/sub_sequence/sub_object.rb b/lib/sequencer/unit/import/kayako/sub_sequence/sub_object.rb
new file mode 100644
index 000000000..3ce424a36
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/sub_sequence/sub_object.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module SubSequence
+ class SubObject < Sequencer::Unit::Import::Kayako::SubSequence::Generic
+
+ uses :instance
+
+ def sequence_params
+ super.merge(
+ instance: instance,
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/team/mapping.rb b/lib/sequencer/unit/import/kayako/team/mapping.rb
new file mode 100644
index 000000000..68a22604e
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/team/mapping.rb
@@ -0,0 +1,25 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module Team
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource
+
+ def process
+ provide_mapped do
+ {
+ name: resource['title'],
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/teams.rb b/lib/sequencer/unit/import/kayako/teams.rb
new file mode 100644
index 000000000..19258653a
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/teams.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Teams < Sequencer::Unit::Import::Kayako::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/time_entries.rb b/lib/sequencer/unit/import/kayako/time_entries.rb
new file mode 100644
index 000000000..c0ae3b5c3
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/time_entries.rb
@@ -0,0 +1,15 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class TimeEntries < Sequencer::Unit::Import::Kayako::SubSequence::Object
+ def sequence_name
+ 'Sequencer::Sequence::Import::Kayako::TimeEntries'.freeze
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/time_entry/mapping.rb b/lib/sequencer/unit/import/kayako/time_entry/mapping.rb
new file mode 100644
index 000000000..bfc0a22b3
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/time_entry/mapping.rb
@@ -0,0 +1,38 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module TimeEntry
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :id_map, :created_by_id
+ provides :action
+
+ def process
+ provide_mapped do
+ {
+ time_unit: time_unit,
+ ticket_id: ticket_id,
+ created_by_id: created_by_id,
+ }
+ end
+ end
+
+ private
+
+ def time_unit
+ resource['time_spent'].to_i / 60
+ end
+
+ def ticket_id
+ id_map['Ticket'][resource['case']['id']]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/time_entry/skip.rb b/lib/sequencer/unit/import/kayako/time_entry/skip.rb
new file mode 100644
index 000000000..91e69a8b9
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/time_entry/skip.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module TimeEntry
+ class Skip < Sequencer::Unit::Base
+ uses :resource
+ provides :action
+
+ def process
+ return if resource['log_type'] != 'VIEWED'
+
+ state.provide(:action, :skipped)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/group_ids.rb b/lib/sequencer/unit/import/kayako/user/group_ids.rb
new file mode 100644
index 000000000..13715d501
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/group_ids.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class GroupIds < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def group_ids
+ Array(resource['teams']).map do |team|
+ id_map['Group'][team['id']]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/identifier.rb b/lib/sequencer/unit/import/kayako/user/identifier.rb
new file mode 100644
index 000000000..d80943d25
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/identifier.rb
@@ -0,0 +1,32 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class Identifier < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource
+
+ private
+
+ def identifier
+ {
+ email: primary_value('emails', 'email'),
+ phone: primary_value('phones', 'number'),
+ twitter: primary_value('twitter', 'screen_name'),
+ facebook: primary_value('facebook', 'facebook_id'),
+ }
+ end
+
+ def primary_value(type, field_name)
+ primary_item = resource[type]&.detect { |item| item['is_primary'] }
+ primary_item&.fetch(field_name)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/initiator.rb b/lib/sequencer/unit/import/kayako/user/initiator.rb
new file mode 100644
index 000000000..0b2e5ec75
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/initiator.rb
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class Initiator < Sequencer::Unit::Common::Provider::Named
+
+ uses :login
+
+ private
+
+ def initiator
+ return false if login.blank?
+
+ login == Setting.get('import_kayako_endpoint_username')
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/login.rb b/lib/sequencer/unit/import/kayako/user/login.rb
new file mode 100644
index 000000000..63fbbdd30
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/login.rb
@@ -0,0 +1,23 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class Login < Sequencer::Unit::Common::Provider::Named
+
+ uses :identifier
+
+ private
+
+ def login
+ # Check the differnt identifier types
+ identifier[:email] || identifier[:phone] || identifier[:twitter] || identifier[:facebook]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/mapping.rb b/lib/sequencer/unit/import/kayako/user/mapping.rb
new file mode 100644
index 000000000..62b778f34
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/mapping.rb
@@ -0,0 +1,40 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :login, :password, :roles, :group_ids, :organization_id, :identifier
+
+ def process
+ provide_mapped do
+ {
+ login: login,
+ firstname: resource['full_name'],
+ email: identifier[:email],
+ phone: identifier[:phone],
+ password: password,
+ active: active?,
+ group_ids: group_ids,
+ roles: roles,
+ organization_id: organization_id,
+ last_login: resource['last_logged_in_at'],
+ }
+ end
+ end
+
+ private
+
+ def active?
+ resource['is_enabled']
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/organization_id.rb b/lib/sequencer/unit/import/kayako/user/organization_id.rb
new file mode 100644
index 000000000..42eab556f
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/organization_id.rb
@@ -0,0 +1,25 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class OrganizationId < Sequencer::Unit::Common::Provider::Named
+
+ uses :resource, :id_map
+
+ private
+
+ def organization_id
+ remote_id = resource['organization']&.fetch('id')
+ return if remote_id.blank?
+
+ id_map['Organization'][remote_id]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/password.rb b/lib/sequencer/unit/import/kayako/user/password.rb
new file mode 100644
index 000000000..7cfc9a7a1
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/password.rb
@@ -0,0 +1,29 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class Password < Sequencer::Unit::Common::Provider::Named
+
+ uses :initiator
+
+ private
+
+ def password
+ # set the used import key as the admin password
+ # since we have no other confidential value
+ # that is known to Zammad and the User
+ return Setting.get('import_kayako_endpoint_password') if initiator
+
+ # otherwise set an empty password so the user
+ # has to re-set a new password for Zammad
+ ''
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user/roles.rb b/lib/sequencer/unit/import/kayako/user/roles.rb
new file mode 100644
index 000000000..86f41aaf1
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user/roles.rb
@@ -0,0 +1,71 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ module User
+ class Roles < Sequencer::Unit::Common::Provider::Named
+ uses :resource, :initiator
+
+ private
+
+ def roles
+ return admin if initiator
+
+ map_roles
+ end
+
+ def map_roles
+ return send(kayako_role) if kayako_role && respond_to?(kayako_role, true)
+
+ logger.debug "Unknown mapping for role '#{resource['role']['type']}' (method: #{kayako_role})"
+
+ customer
+ end
+
+ def kayako_role
+ @kayako_role ||= resource['role']&.fetch('type')&.downcase
+ end
+
+ def customer
+ [role_customer]
+ end
+
+ def collaborators
+ agent
+ end
+
+ def agent
+ [role_agent]
+ end
+
+ def owner
+ admin
+ end
+
+ def admin
+ [role_admin, role_agent]
+ end
+
+ def role_admin
+ @role_admin ||= lookup('Admin')
+ end
+
+ def role_agent
+ @role_agent ||= lookup('Agent')
+ end
+
+ def role_customer
+ @role_customer ||= lookup('Customer')
+ end
+
+ def lookup(role_name)
+ ::Role.lookup(name: role_name)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/user_fields.rb b/lib/sequencer/unit/import/kayako/user_fields.rb
new file mode 100644
index 000000000..be6e56f9c
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/user_fields.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class UserFields < Sequencer::Unit::Import::Kayako::SubSequence::Field
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/kayako/users.rb b/lib/sequencer/unit/import/kayako/users.rb
new file mode 100644
index 000000000..9de90a1ae
--- /dev/null
+++ b/lib/sequencer/unit/import/kayako/users.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Import
+ module Kayako
+ class Users < Sequencer::Unit::Import::Kayako::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/kayako/connected.rb b/lib/sequencer/unit/kayako/connected.rb
new file mode 100644
index 000000000..2f2db73dd
--- /dev/null
+++ b/lib/sequencer/unit/kayako/connected.rb
@@ -0,0 +1,23 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+class Sequencer
+ class Unit
+ module Kayako
+ class Connected < Sequencer::Unit::Common::Provider::Named
+ extend ::Sequencer::Unit::Import::Kayako::Requester
+
+ private
+
+ def connected
+ response = self.class.perform_request(
+ api_path: 'me',
+ )
+ response.is_a?(Net::HTTPOK)
+ rescue => e
+ logger.error e
+ nil
+ end
+ end
+ end
+ end
+end
diff --git a/spec/factories/object_manager_attribute.rb b/spec/factories/object_manager_attribute.rb
index 02732b88e..6920bd886 100644
--- a/spec/factories/object_manager_attribute.rb
+++ b/spec/factories/object_manager_attribute.rb
@@ -55,6 +55,21 @@ FactoryBot.define do
end
end
+ factory :object_manager_attribute_textarea, parent: :object_manager_attribute do
+ data_type { 'textarea' }
+ data_option do
+ {
+ 'type' => 'textarea',
+ 'maxlength' => 255,
+ 'null' => true,
+ 'translate' => false,
+ 'default' => default || '',
+ 'options' => {},
+ 'relation' => '',
+ }
+ end
+ end
+
factory :object_manager_attribute_integer, parent: :object_manager_attribute do
data_type { 'integer' }
data_option do
diff --git a/spec/integration/kayako_spec.rb b/spec/integration/kayako_spec.rb
new file mode 100644
index 000000000..2df17b03a
--- /dev/null
+++ b/spec/integration/kayako_spec.rb
@@ -0,0 +1,71 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe 'Kayako import', type: :integration, use_vcr: true, db_strategy: :reset, required_envs: %w[IMPORT_KAYAKO_ENDPOINT IMPORT_KAYAKO_ENDPOINT_PASSWORD IMPORT_KAYAKO_ENDPOINT_USERNAME] do # rubocop:disable RSpec/DescribeClass
+ let(:job) { ImportJob.last }
+
+ before do
+ Setting.set('import_kayako_endpoint', ENV['IMPORT_KAYAKO_ENDPOINT'])
+ Setting.set('import_kayako_endpoint_password', ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD'])
+ Setting.set('import_kayako_endpoint_username', ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME'])
+ Setting.set('import_mode', true)
+ Setting.set('system_init_done', false)
+
+ VCR.use_cassette 'kayako_import' do
+ ImportJob.create(name: 'Import::Kayako').start
+ end
+ end
+
+ context 'when performing the full Kayako import' do
+ let(:job) { ImportJob.last }
+ let(:expected_stats) do
+ {
+ 'Groups' => {
+ 'skipped' => 0,
+ 'created' => 4,
+ 'updated' => 0,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 4,
+ 'total' => 4,
+ },
+ 'Users' => {
+ 'skipped' => 0,
+ 'created' => 7,
+ 'updated' => 0,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 7,
+ 'total' => 7,
+ },
+ 'Organizations' => {
+ 'skipped' => 0,
+ 'created' => 2,
+ 'updated' => 1,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 3,
+ 'total' => 3,
+ },
+ 'Tickets' => {
+ 'skipped' => 0,
+ 'created' => 4,
+ 'updated' => 1,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 5,
+ 'total' => 5,
+ },
+ }
+ end
+
+ it 'imports the correct number of expected objects' do
+ expect(job.result).to eq expected_stats
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/case_field_spec.rb b/spec/lib/sequencer/sequence/import/kayako/case_field_spec.rb
new file mode 100644
index 000000000..36ebfc8dd
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/case_field_spec.rb
@@ -0,0 +1,54 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+require 'lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::CaseField, sequencer: :sequence do
+
+ context 'when trying to import ticket fields from Kayako', db_strategy: :reset do
+ let(:imported_type_options) do
+ {
+ 'Question' => 'Question',
+ 'Task' => 'Task',
+ 'Problem' => 'Problem',
+ 'Incident' => 'Incident',
+ }
+ end
+
+ include_examples 'Object custom fields', klass: Ticket
+
+ context 'when importing system fields' do
+ let(:resource) do
+ {
+ 'id' => 80_000_387_409,
+ 'fielduuid' => 'cad5295c-495a-4605-8eda-861d4a19d6f2',
+ 'title' => 'Type',
+ 'type' => 'TYPE',
+ 'key' => 'type',
+ 'is_required_for_agents' => false,
+ 'is_required_on_resolution' => false,
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 5,
+ 'is_enabled' => true,
+ 'is_system' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-12T11:48:51+00:00',
+ 'updated_at' => '2021-08-12T11:48:51+00:00',
+ }
+ end
+
+ it "activate the already existing ticket 'type' field" do
+ expect { process(process_payload) }.to change { ObjectManager::Attribute.get(object: 'Ticket', name: 'type').active }.from(false).to(true)
+ end
+
+ it "import the fixed option list for the ticket 'type' field" do
+ process(process_payload)
+ expect(ObjectManager::Attribute.get(object: 'Ticket', name: 'type').data_option[:options]).to a_hash_including(imported_type_options)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/case_spec.rb b/spec/lib/sequencer/sequence/import/kayako/case_spec.rb
new file mode 100644
index 000000000..9a49b4f06
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/case_spec.rb
@@ -0,0 +1,292 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+require 'lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::Case, sequencer: :sequence, db_strategy: :reset do
+
+ context 'when importing cases from Kayako' do
+
+ let(:group) { create :group }
+ let(:owner) { create :agent, group_ids: [group.id] }
+ let(:organization) { create :organization }
+ let(:customer) { create :customer, organization: organization }
+
+ let(:resource) do
+ {
+ 'id' => 9999,
+ 'legacy_id' => nil,
+ 'subject' => 'Getting comfortable with Kayako: a sample conversation',
+ 'portal' => 'SETUP',
+ 'source_channel' => {
+ 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
+ 'type' => 'MAIL',
+ 'character_limit' => nil,
+ 'resource_type' => 'channel'
+ },
+ 'requester' => {
+ 'id' => 80_014_400_777,
+ 'organization' => {
+ 'id' => 80_014_400_111,
+ 'resource_type' => 'organization'
+ },
+ 'resource_type' => 'user',
+ },
+ 'creator' => {
+ 'id' => 80_014_400_777,
+ 'resource_type' => 'user',
+ },
+ 'identity' => {
+ 'id' => 80_014_400_777,
+ 'resource_type' => 'identity_email'
+ },
+ 'assigned_agent' => {
+ 'id' => 80_014_400_475,
+ 'resource_type' => 'user',
+ },
+ 'assigned_team' => {
+ 'id' => 80_000_374_718,
+ 'resource_type' => 'team'
+ },
+ 'status' => {
+ 'id' => 2,
+ 'label' => 'Open',
+ 'type' => 'OPEN',
+ 'sort_order' => 2,
+ 'is_sla_active' => true,
+ 'is_deleted' => false,
+ 'created_at' => '2021-08-12T11:48:51+00:00',
+ 'updated_at' => '2021-08-12T11:48:51+00:00',
+ 'resource_type' => 'case_status',
+ },
+ 'priority' => {
+ 'id' => 1,
+ 'label' => 'Low',
+ 'level' => 1,
+ 'created_at' => '2021-08-12T11:48:51+00:00',
+ 'updated_at' => '2021-08-12T11:48:51+00:00',
+ 'resource_type' => 'case_priority',
+ },
+ 'type' => {
+ 'id' => 1,
+ 'label' => 'Question',
+ 'type' => 'QUESTION',
+ 'created_at' => '2021-08-12T11:48:51+00:00',
+ 'updated_at' => '2021-08-12T11:48:51+00:00',
+ },
+ 'last_updated_by' => {
+ 'id' => 80_000_374_718,
+ 'resource_type' => 'user',
+ },
+ 'state' => 'ACTIVE',
+ 'tags' => [
+ {
+ 'id' => 1,
+ 'name' => 'example',
+ 'resource_type' => 'tag'
+ },
+ {
+ 'id' => 2,
+ 'name' => 'test',
+ 'resource_type' => 'tag'
+ }
+ ],
+ 'created_at' => '2018-08-18T12:00:00+00:00',
+ 'updated_at' => '2021-08-24T06:30:00+00:00',
+ 'resource_type' => 'case',
+ }
+
+ end
+
+ let(:id_map) do
+ {
+ 'Organization' => {
+ 80_014_400_111 => organization.id,
+ },
+ 'User' => {
+ 80_014_400_475 => owner.id,
+ 80_014_400_777 => customer.id,
+ },
+ 'Group' => {
+ 80_000_374_718 => group.id,
+ },
+ }
+ end
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: id_map,
+ default_language: 'en-us',
+ }
+ end
+
+ let(:posts_response_payload) do
+ {
+ 'data' => [
+ {
+ 'id' => 99_999,
+ 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b',
+ 'client_id' => '',
+ 'subject' => 'Getting comfortable with Kayako: a sample conversation',
+ 'contents' => 'Some text conent\n',
+ 'creator' => {
+ 'id' => 80_014_400_777,
+ 'resource_type' => 'user'
+ },
+ 'identity' => {
+ 'id' => 80_014_400_777,
+ 'email' => customer.email,
+ 'resource_type' => 'identity_email',
+ },
+ 'source_channel' => {
+ 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
+ 'type' => 'MAIL',
+ 'character_limit' => nil,
+ 'account' => {
+ 'id' => 1,
+ 'resource_type' => 'mailbox'
+ },
+ 'resource_type' => 'channel'
+ },
+ 'attachments' => [],
+ 'original' => {
+ 'id' => 4,
+ 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b',
+ 'subject' => 'Getting comfortable with Kayako: a sample conversation',
+ 'body_text' => 'Some text conent\n',
+ 'body_html' => 'Some text conent
',
+ 'recipients' => [],
+ 'fullname' => customer.fullname,
+ 'email' => customer.email,
+ 'creator' => {
+ 'id' => 80_014_400_777,
+ 'resource_type' => 'user'
+ },
+ 'identity' => {
+ 'id' => 80_014_400_777,
+ 'email' => customer.email,
+ 'resource_type' => 'identity_email',
+ },
+ 'mailbox' => {
+ 'id' => 1,
+ 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
+ 'address' => 'info@zammad.org',
+ 'resource_type' => 'mailbox',
+ },
+ 'attachments' => [],
+ 'download_all' => nil,
+ 'locale' => nil,
+ 'response_time' => 0,
+ 'created_at' => '2021-08-16T08:19:40+00:00',
+ 'updated_at' => '2021-08-16T08:19:40+00:00',
+ 'resource_type' => 'case_message',
+ },
+ 'is_requester' => true,
+ 'created_at' => '2021-08-16T08:19:40+00:00',
+ 'updated_at' => '2021-08-16T08:30:11+00:00',
+ 'resource_type' => 'post',
+ }
+ ]
+ }
+ end
+
+ let(:imported_ticket) do
+ {
+ title: 'Getting comfortable with Kayako: a sample conversation',
+ note: nil,
+ create_article_type_id: 1,
+ create_article_sender_id: 2,
+ article_count: 1,
+ state_id: 2,
+ group_id: group.id,
+ priority_id: 1,
+ owner_id: owner.id,
+ customer_id: customer.id,
+ organization_id: organization.id,
+ type: 'Question'
+ }
+ end
+
+ before do
+ # Mock the posts get request (Import::Kayako::Case::Posts).
+ stub_request(:get, 'https://yours.kayako.com/api/v1/cases/9999/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100').to_return(status: 200, body: JSON.generate(posts_response_payload), headers: {})
+ end
+
+ it 'adds tickets' do
+ expect { process(process_payload) }.to change(Ticket, :count).by(1)
+ end
+
+ it 'correct attributes for added ticket' do
+ process(process_payload)
+ expect(Ticket.last).to have_attributes(imported_ticket)
+ end
+
+ it 'correct tags for added ticket' do
+ process(process_payload)
+ expect(Ticket.last.tag_list).to eq(%w[example test])
+ end
+
+ it 'adds article' do
+ expect { process(process_payload) }.to change(Ticket::Article, :count).by(1)
+ end
+
+ it 'correct attributes for added article' do
+ process(process_payload)
+ expect(Ticket::Article.last).to have_attributes(
+ to: 'info@zammad.org',
+ body: "Some text conent
\n
",
+ )
+ end
+
+ context 'when ticket is imported twice' do
+ before do
+ process(process_payload)
+ end
+
+ it 'updates first article for already existing ticket' do
+ expect { process(process_payload) }.to change(Ticket::Article, :count).by(0)
+ end
+ end
+
+ context 'when importing without a type' do
+ before do
+ resource['type'] = nil
+ imported_ticket[:type] = nil
+ end
+
+ it 'correct attributes for added ticket' do
+ process(process_payload)
+ expect(Ticket.last).to have_attributes(imported_ticket)
+ end
+ end
+
+ context "when status is 'PENDING'" do
+ before do
+ resource['status'] = {
+ 'id' => 3,
+ 'label' => 'Pending',
+ 'type' => 'PENDING',
+ 'sort_order' => 3,
+ 'is_sla_active' => false,
+ 'is_deleted' => false,
+ 'created_at' => '2021-08-12T11:48:51+00:00',
+ 'updated_at' => '2021-08-12T11:48:51+00:00',
+ }
+ imported_ticket[:state_id] = 3
+ end
+
+ it 'correct attributes for added ticket' do
+ process(process_payload)
+ expect(Ticket.last).to have_attributes(imported_ticket)
+ end
+ end
+
+ context 'when importing custom fields' do
+ include_examples 'Object custom field values', object_name: 'Ticket', klass: Ticket
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples.rb b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples.rb
new file mode 100644
index 000000000..bf7b1f83c
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples.rb
@@ -0,0 +1,459 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+RSpec.shared_examples 'Object custom field values', db_strategy: :reset do |object_name:, klass:|
+
+ let(:resource) do
+ super().merge(
+ 'custom_fields' => [
+ {
+ 'field' => {
+ 'id' => 1,
+ 'fielduuid' => '82e5393b-e036-45d1-beb9-46f96ebd697a',
+ 'title' => 'Textfield',
+ 'type' => 'TEXT',
+ 'key' => 'custom_textfield',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 1,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T19:34:35+00:00',
+ 'updated_at' => '2021-08-16T19:34:35+00:00',
+ },
+ 'value' => 'Testing',
+ },
+ {
+ 'field' => {
+ 'id' => 2,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'title' => 'Singleselection',
+ 'type' => 'SELECT',
+ 'key' => 'custom_singleselection',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 2,
+ 'is_enabled' => true,
+ 'options' => [
+ {
+ 'id' => 1,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'values' => [
+ {
+ 'id' => 26,
+ 'locale' => 'en-us',
+ 'translation' => 'one',
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ },
+ {
+ 'id' => 2,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'values' => [
+ {
+ 'id' => 27,
+ 'locale' => 'en-us',
+ 'translation' => 'two',
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ },
+ {
+ 'id' => 3,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'values' => [
+ {
+ 'id' => 25,
+ 'locale' => 'en-us',
+ 'translation' => 'three',
+ 'created_at' => '2021-08-16T19:35:01+00:00',
+ 'updated_at' => '2021-08-16T19:35:01+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:35:01+00:00',
+ 'updated_at' => '2021-08-16T19:35:01+00:00',
+ },
+ ],
+ 'created_at' => '2021-08-16T19:35:01+00:00',
+ 'updated_at' => '2021-08-17T14:32:50+00:00',
+ },
+ 'value' => '2',
+ },
+ {
+ 'field' => {
+ 'id' => 4,
+ 'fielduuid' => '9586e37c-b561-4119-8673-726787ceb79d',
+ 'title' => 'Checkbox',
+ 'type' => 'CHECKBOX',
+ 'key' => 'custom_checkbox',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 4,
+ 'is_enabled' => true,
+ 'created_at' => '2021-08-16T19:35:32+00:00',
+ 'updated_at' => '2021-08-16T20:00:47+00:00',
+ },
+ 'value' => '5,6',
+ },
+ {
+ 'field' => {
+ 'id' => 5,
+ 'fielduuid' => '317664dc-66d6-4d60-9814-64905a7e2fb8',
+ 'title' => 'Available?',
+ 'type' => 'YESNO',
+ 'key' => 'custom_boolean',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 5,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T19:35:43+00:00',
+ 'updated_at' => '2021-08-16T19:35:43+00:00',
+ },
+ 'value' => 'yes',
+ },
+ {
+ 'field' => {
+ 'id' => 6,
+ 'fielduuid' => 'b8d5fd67-b446-44a4-9559-f9f4b85c025a',
+ 'title' => 'Regex',
+ 'type' => 'REGEX',
+ 'key' => 'custom_text_regex',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => '\\d\\d\\d',
+ 'sort_order' => 6,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T19:58:57+00:00',
+ 'updated_at' => '2021-08-16T19:58:57+00:00',
+ },
+ 'value' => '999',
+ },
+ {
+ 'field' => {
+ 'id' => 7,
+ 'fielduuid' => 'c06852f7-0c82-45af-9ce0-f5ac6e19db93',
+ 'title' => 'Textarea',
+ 'type' => 'TEXTAREA',
+ 'key' => 'custom_textarea',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 7,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T19:59:07+00:00',
+ 'updated_at' => '2021-08-16T19:59:07+00:00',
+ },
+ 'value' => 'Example textarea content.\nA new line.',
+ },
+ {
+ 'field' => {
+ 'id' => 8,
+ 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca',
+ 'title' => 'Radio',
+ 'type' => 'RADIO',
+ 'key' => 'custom_radio',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 8,
+ 'is_enabled' => true,
+ 'options' => [
+ {
+ 'id' => 7,
+ 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca',
+ 'values' => [
+ {
+ 'id' => 43,
+ 'locale' => 'en-us',
+ 'translation' => 'first',
+ 'created_at' => '2021-08-16T19:59:33+00:00',
+ 'updated_at' => '2021-08-16T19:59:33+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:59:33+00:00',
+ 'updated_at' => '2021-08-16T19:59:33+00:00',
+ },
+ {
+ 'id' => 8,
+ 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca',
+ 'values' => [
+ {
+ 'id' => 44,
+ 'locale' => 'en-us',
+ 'translation' => 'second',
+ 'created_at' => '2021-08-16T19:59:33+00:00',
+ 'updated_at' => '2021-08-16T19:59:33+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:59:33+00:00',
+ 'updated_at' => '2021-08-16T19:59:33+00:00',
+ },
+ {
+ 'id' => 9,
+ 'fielduuid' => 'e5346df5-55ec-4e15-aceb-3360c457aaca',
+ 'values' => [
+ {
+ 'id' => 45,
+ 'locale' => 'en-us',
+ 'translation' => 'third',
+ 'created_at' => '2021-08-16T19:59:33+00:00',
+ 'updated_at' => '2021-08-16T19:59:33+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:59:33+00:00',
+ 'updated_at' => '2021-08-16T19:59:33+00:00',
+ }
+ ],
+ 'created_at' => '2021-08-16T19:59:33+00:00',
+ 'updated_at' => '2021-08-17T14:45:10+00:00',
+ },
+ 'value' => '9',
+ },
+ {
+ 'field' => {
+ 'id' => 9,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'title' => 'Tree Select',
+ 'type' => 'CASCADINGSELECT',
+ 'key' => 'custom_tree_select',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 9,
+ 'is_enabled' => true,
+ 'options' => [
+ {
+ 'id' => 10,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 48,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 1',
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T19:59:52+00:00',
+ }
+ ],
+ 'sort_order' => 1,
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T20:02:03+00:00',
+ },
+ {
+ 'id' => 11,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 49,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 2\\Second-Level 1',
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T20:05:31+00:00',
+ }
+ ],
+ 'sort_order' => 2,
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T20:02:03+00:00',
+ },
+ {
+ 'id' => 22,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 427,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 2\\Second-Level 2',
+ 'created_at' => '2021-08-18T09:41:09+00:00',
+ 'updated_at' => '2021-08-18T13:10:05+00:00',
+ }
+ ],
+ 'sort_order' => 3,
+ 'created_at' => '2021-08-18T09:41:09+00:00',
+ 'updated_at' => '2021-08-18T09:41:54+00:00',
+ },
+ {
+ 'id' => 12,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 50,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 3',
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T19:59:52+00:00',
+ }
+ ],
+ 'sort_order' => 5,
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-18T09:41:54+00:00',
+ },
+ ],
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-18T13:10:05+00:00',
+ },
+ 'value' => '22',
+ },
+ {
+ 'field' => {
+ 'id' => 10,
+ 'fielduuid' => '0c4f20ce-5db4-4e78-83d7-9fb9c7ac62b7',
+ 'title' => 'Decimal',
+ 'type' => 'DECIMAL',
+ 'key' => 'custom_text_decimal',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 10,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T20:01:01+00:00',
+ 'updated_at' => '2021-08-16T20:01:01+00:00',
+ },
+ 'value' => '3.5',
+ },
+ {
+ 'field' => {
+ 'id' => 11,
+ 'fielduuid' => '1a2aa5f9-8128-43be-abe9-8128fcc41005',
+ 'title' => 'Numeric',
+ 'type' => 'NUMERIC',
+ 'key' => 'custom_integer',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 11,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T20:01:07+00:00',
+ 'updated_at' => '2021-08-16T20:01:07+00:00',
+ },
+ 'value' => '3',
+ },
+ {
+ 'field' => {
+ 'id' => 12,
+ 'fielduuid' => '63b3eff6-9405-4857-aa2b-4e1e4639e283',
+ 'title' => 'Attachment',
+ 'type' => 'FILE',
+ 'key' => 'attachment',
+ 'is_visible_to_customers' => true,
+ 'is_customer_editable' => true,
+ 'is_required_for_customers' => true,
+ 'descriptions' => [],
+ 'regular_expression' => nil,
+ 'sort_order' => 12,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T20:59:03+00:00',
+ 'updated_at' => '2021-08-16T20:59:03+00:00',
+ },
+ 'value' => '',
+ },
+ {
+ 'field' => {
+ 'id' => 13,
+ 'fielduuid' => 'bc9d1be5-9a7b-4581-90be-59e75a4e660d',
+ 'title' => 'Founding Date',
+ 'type' => 'DATE',
+ 'key' => 'custom_date',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 13,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-17T20:33:18+00:00',
+ 'updated_at' => '2021-08-17T20:33:18+00:00',
+ },
+ 'value' => '2021-08-13T00:00:00+00:00',
+ }
+ ],
+ )
+ end
+
+ let(:field_map) do
+ {
+ object_name => {
+ 'custom_textfield' => 'custom_textfield',
+ 'custom_singleselection' => 'custom_singleselection',
+ 'custom_boolean' => 'custom_boolean',
+ 'custom_radio' => 'custom_radio',
+ 'custom_text_regex' => 'custom_text_regex',
+ 'custom_tree_select' => 'custom_tree_select',
+ 'custom_textarea' => 'custom_textarea',
+ 'custom_text_decimal' => 'custom_text_decimal',
+ 'custom_integer' => 'custom_integer',
+ 'custom_date' => 'custom_date'
+ }
+ }
+ end
+
+ let(:process_payload) do
+ super().merge(
+ field_map: field_map
+ )
+ end
+
+ let(:imported_resource_fields) do
+ {
+ custom_textfield: 'Testing',
+ custom_singleselection: 'two',
+ custom_boolean: true,
+ custom_radio: 'third',
+ custom_text_regex: '999',
+ custom_textarea: 'Example textarea content.\nA new line.',
+ custom_tree_select: 'First-Level 2::Second-Level 2',
+ custom_text_decimal: '3.5',
+ custom_integer: 3,
+ custom_date: Date.new(2021, 8, 13)
+ }
+ end
+
+ before do
+ create :object_manager_attribute_text, object_name: object_name, name: 'custom_textfield'
+ create :object_manager_attribute_select, object_name: object_name, name: 'custom_singleselection'
+ create :object_manager_attribute_boolean, object_name: object_name, name: 'custom_boolean'
+ create :object_manager_attribute_select, object_name: object_name, name: 'custom_radio'
+ create :object_manager_attribute_text, object_name: object_name, name: 'custom_text_regex'
+ create :object_manager_attribute_textarea, object_name: object_name, name: 'custom_textarea'
+ create :object_manager_attribute_tree_select, object_name: object_name, name: 'custom_tree_select'
+ create :object_manager_attribute_text, object_name: object_name, name: 'custom_text_decimal'
+ create :object_manager_attribute_integer, object_name: object_name, name: 'custom_integer'
+ create :object_manager_attribute_date, object_name: object_name, name: 'custom_date'
+ ObjectManager::Attribute.migration_execute
+ end
+
+ it 'adds correct custom field data' do
+ process(process_payload)
+ expect(klass.last).to have_attributes(imported_resource_fields)
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples.rb b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples.rb
new file mode 100644
index 000000000..4246e51db
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples.rb
@@ -0,0 +1,235 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+RSpec.shared_examples 'Object custom fields' do |klass:|
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: {},
+ default_language: 'en-us',
+ }
+ end
+
+ shared_examples 'import valid custom field' do |field_name|
+ it 'add custom field' do
+ expect { process(process_payload) }.to change(klass, :column_names).by([field_name])
+ end
+ end
+
+ shared_examples 'import skipped custom field' do
+ it 'ignore custom field' do
+ expect { process(process_payload) }.not_to change(klass, :column_names)
+ end
+ end
+
+ context "when custom field type is 'TEXT'" do
+ let(:resource) do
+ {
+ 'id' => 80_000_387_409,
+ 'fielduuid' => '82e5393b-e036-45d1-beb9-46f96ebd697a',
+ 'title' => 'Textfield',
+ 'type' => 'TEXT',
+ 'key' => 'custom_textfield',
+ 'is_visible_to_customers' => false,
+ 'required_for_agents' => true,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 1,
+ 'is_enabled' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T19:34:35+00:00',
+ 'updated_at' => '2021-08-16T19:34:35+00:00',
+ }
+ end
+
+ include_examples 'import valid custom field', 'custom_textfield'
+ end
+
+ context 'when custom field should be skipped' do
+ let(:resource) do
+ {
+ 'id' => 80_000_387_409,
+ 'fielduuid' => '82e5393b-e036-45d1-beb9-46f96ebd697a',
+ 'title' => 'Name',
+ 'type' => 'TEXT',
+ 'key' => 'name',
+ 'is_visible_to_customers' => false,
+ 'required_for_agents' => true,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 1,
+ 'is_enabled' => true,
+ 'is_system' => true,
+ 'options' => [],
+ 'created_at' => '2021-08-16T19:34:35+00:00',
+ 'updated_at' => '2021-08-16T19:34:35+00:00',
+ }
+ end
+
+ include_examples 'import skipped custom field'
+ end
+
+ context "when custom field type is 'SELECT'" do
+ let(:resource) do
+ {
+ 'id' => 80_000_387_409,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'title' => 'Singleselection',
+ 'type' => 'SELECT',
+ 'key' => 'custom_singleselection',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 2,
+ 'is_enabled' => true,
+ 'options' => [
+ {
+ 'id' => 1,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'values' => [
+ {
+ 'id' => 26,
+ 'locale' => 'en-us',
+ 'translation' => 'one',
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ },
+ {
+ 'id' => 2,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'values' => [
+ {
+ 'id' => 27,
+ 'locale' => 'en-us',
+ 'translation' => 'two',
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:35:02+00:00',
+ 'updated_at' => '2021-08-16T19:35:02+00:00',
+ },
+ {
+ 'id' => 3,
+ 'fielduuid' => 'ff7093f3-ad44-4519-80b0-f9b1a9988ac0',
+ 'values' => [
+ {
+ 'id' => 25,
+ 'locale' => 'en-us',
+ 'translation' => 'three',
+ 'created_at' => '2021-08-16T19:35:01+00:00',
+ 'updated_at' => '2021-08-16T19:35:01+00:00',
+ }
+ ],
+ 'sort_order' => 0,
+ 'created_at' => '2021-08-16T19:35:01+00:00',
+ 'updated_at' => '2021-08-16T19:35:01+00:00',
+ },
+ ],
+ 'created_at' => '2021-08-16T19:35:01+00:00',
+ 'updated_at' => '2021-08-17T14:32:50+00:00',
+ }
+ end
+
+ include_examples 'import valid custom field', 'custom_singleselection'
+ end
+
+ context "when custom field type is 'CASCADINGSELECT'" do
+ let(:resource) do
+ {
+ 'id' => 80_000_387_409,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'title' => 'Tree Select',
+ 'type' => 'CASCADINGSELECT',
+ 'key' => 'custom_tree_select',
+ 'is_visible_to_customers' => false,
+ 'is_customer_editable' => false,
+ 'is_required_for_customers' => false,
+ 'regular_expression' => nil,
+ 'sort_order' => 9,
+ 'is_enabled' => true,
+ 'options' => [
+ {
+ 'id' => 10,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 48,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 1',
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T19:59:52+00:00',
+ }
+ ],
+ 'sort_order' => 1,
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T20:02:03+00:00',
+ },
+ {
+ 'id' => 11,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 49,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 2\\Second-Level 1',
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T20:05:31+00:00',
+ }
+ ],
+ 'sort_order' => 2,
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T20:02:03+00:00',
+ },
+ {
+ 'id' => 22,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 427,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 2\\Second-Level 2',
+ 'created_at' => '2021-08-18T09:41:09+00:00',
+ 'updated_at' => '2021-08-18T13:10:05+00:00',
+ }
+ ],
+ 'sort_order' => 3,
+ 'created_at' => '2021-08-18T09:41:09+00:00',
+ 'updated_at' => '2021-08-18T09:41:54+00:00',
+ },
+ {
+ 'id' => 12,
+ 'fielduuid' => '13a19707-29f0-4e97-8077-44be958c052c',
+ 'values' => [
+ {
+ 'id' => 50,
+ 'locale' => 'en-us',
+ 'translation' => 'First-Level 3',
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-16T19:59:52+00:00',
+ }
+ ],
+ 'sort_order' => 5,
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-18T09:41:54+00:00',
+ },
+ ],
+ 'created_at' => '2021-08-16T19:59:52+00:00',
+ 'updated_at' => '2021-08-18T13:10:05+00:00',
+ }
+ end
+
+ include_examples 'import valid custom field', 'custom_tree_select'
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/generic_object_spec.rb b/spec/lib/sequencer/sequence/import/kayako/generic_object_spec.rb
new file mode 100644
index 000000000..f9329294b
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/generic_object_spec.rb
@@ -0,0 +1,72 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::GenericObject, sequencer: :sequence, db_strategy: :reset do
+ context 'when importing group list with generic object' do
+ let(:resources_payloud) do
+ {
+ 'data' => [
+ {
+ 'id' => 80_000_374_715,
+ 'legacy_id' => nil,
+ 'title' => 'Support',
+ 'businesshour' => {
+ 'id' => 1,
+ 'resource_type' => 'business_hour'
+ },
+ 'member_count' => 0,
+ 'created_at' => '2021-08-16T13:42:26+00:00',
+ 'updated_at' => '2021-08-16T13:42:26+00:00',
+ 'resource_type' => 'team',
+ },
+ {
+ 'id' => 80_000_374_716,
+ 'legacy_id' => nil,
+ 'title' => 'Sales',
+ 'businesshour' => {
+ 'id' => 1,
+ 'resource_type' => 'business_hour'
+ },
+ 'member_count' => 0,
+ 'created_at' => '2021-08-16T13:42:26+00:00',
+ 'updated_at' => '2021-08-16T13:42:26+00:00',
+ 'resource_type' => 'team',
+ }
+ ]
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ object: 'Team',
+ request_params: {},
+ field_map: {},
+ id_map: {},
+ default_language: 'en-us'
+ }
+ end
+
+ before do
+ # Mock the groups get request
+ stub_request(:get, 'https://yours.kayako.com/api/v1/teams?limit=100').to_return(status: 200, body: JSON.generate(resources_payloud), headers: {})
+ end
+
+ it 'add groups' do
+ expect { process(process_payload) }.to change(Group, :count).by(2)
+ end
+
+ context 'when list request fails' do
+ before do
+ allow(Sequencer::Unit::Import::Kayako::Request).to receive(:handle_error).with(any_args).and_return(true)
+ stub_request(:get, 'https://yours.kayako.com/api/v1/teams?limit=100').to_return(status: 400, headers: {})
+ end
+
+ it 'check that a failing response do not raise a hard error' do
+ expect { process(process_payload) }.to change(Group, :count).by(0)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/organization_field_spec.rb b/spec/lib/sequencer/sequence/import/kayako/organization_field_spec.rb
new file mode 100644
index 000000000..ce9f654d5
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/organization_field_spec.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+require 'lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::OrganizationField, sequencer: :sequence do
+
+ context 'when trying to import ticket fields from Kayako', db_strategy: :reset do
+ include_examples 'Object custom fields', klass: Organization
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/organization_spec.rb b/spec/lib/sequencer/sequence/import/kayako/organization_spec.rb
new file mode 100644
index 000000000..960c5385c
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/organization_spec.rb
@@ -0,0 +1,87 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+require 'lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::Organization, sequencer: :sequence, db_strategy: :reset do
+
+ context 'when importing organizations from Kayako' do
+
+ let(:resource) do
+ {
+ 'id' => 80_000_602_705,
+ 'name' => 'Test Foundation',
+ 'legacy_id' => nil,
+ 'is_shared' => false,
+ 'domains' => [
+ {
+ 'id' => 3,
+ 'domain' => 'test-foundation.com',
+ 'is_primary' => true,
+ 'is_validated' => false,
+ 'created_at' => '2021-08-16T09:01:14+00:00',
+ 'updated_at' => '2021-08-16T09:01:14+00:00',
+ 'resource_type' => 'identity_domain',
+ }
+ ],
+ 'is_validated' => nil,
+ 'phone' => [],
+ 'addresses' => [],
+ 'websites' => [],
+ 'pinned_notes_count' => 0,
+ 'created_at' => '2021-08-16T09:01:14+00:00',
+ 'updated_at' => '2021-08-18T20:37:52+00:00',
+ 'resource_type' => 'organization',
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: {},
+ default_language: 'en-us',
+ }
+ end
+
+ let(:imported_organization) do
+ {
+ name: 'Test Foundation',
+ domain: 'test-foundation.com',
+ domain_assignment: true,
+ }
+ end
+
+ it 'increased organization count' do
+ expect { process(process_payload) }.to change(Organization, :count).by(1)
+ end
+
+ it 'adds correct organization data' do
+ process(process_payload)
+ expect(Organization.last).to have_attributes(imported_organization)
+ end
+
+ context 'when importing custom fields' do
+ include_examples 'Object custom field values', object_name: 'Organization', klass: Organization
+ end
+
+ context 'when resource has no domains' do
+ let(:resource) do
+ super().merge('domains' => [])
+ end
+
+ before do
+ imported_organization[:domain] = nil
+ imported_organization[:domain_assignment] = false
+ end
+
+ it 'adds organizations' do
+ process(process_payload)
+ expect(Organization.last).to have_attributes(imported_organization)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/post_spec.rb b/spec/lib/sequencer/sequence/import/kayako/post_spec.rb
new file mode 100644
index 000000000..2e6a72732
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/post_spec.rb
@@ -0,0 +1,170 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::Post, sequencer: :sequence do
+
+ context 'when importing posts from Kayako' do
+
+ let(:user) { create :user }
+ let(:customer) { create :customer }
+ let(:ticket) { create :ticket }
+
+ let(:resource) do
+ {
+ 'id' => 99_999,
+ 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b',
+ 'client_id' => '',
+ 'subject' => 'Getting comfortable with Kayako: a sample conversation',
+ 'contents' => "[img src=\"https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn\" class=\"fr-fic fr-dii\" style=\"width: 127px; height: 96.3263px;\" width=\"127\" height=\"96.3263\"]\n\nA Test with a inline image.\n",
+ 'creator' => {
+ 'id' => 80_014_400_777,
+ 'resource_type' => 'user'
+ },
+ 'identity' => {
+ 'id' => 80_014_400_777,
+ 'email' => customer.email,
+ 'resource_type' => 'identity_email',
+ },
+ 'source_channel' => {
+ 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
+ 'type' => 'MAIL',
+ 'character_limit' => nil,
+ 'account' => {
+ 'id' => 1,
+ 'resource_type' => 'mailbox'
+ },
+ 'resource_type' => 'channel'
+ },
+ 'attachments' => [
+ {
+ 'id' => 1,
+ 'name' => 'example.log',
+ 'size' => 1909,
+ 'width' => 0,
+ 'height' => 0,
+ 'type' => 'text/plain',
+ 'content_id' => nil,
+ 'alt' => nil,
+ 'url' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/url',
+ 'url_download' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/download',
+ 'thumbnails' => [],
+ 'created_at' => '2021-08-16T08:43:46+00:00',
+ 'resource_type' => 'attachment',
+ }
+ ],
+ 'original' => {
+ 'id' => 4,
+ 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b',
+ 'subject' => 'Getting comfortable with Kayako: a sample conversation',
+ 'body_text' => "[img src=\"https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn\" class=\"fr-fic fr-dii\" style=\"width: 127px; height: 96.3263px;\" width=\"127\" height=\"96.3263\"]\n\nA Test with a inline image.\n",
+ 'body_html' => '
A Test with a inline image.
',
+ 'recipients' => [],
+ 'fullname' => customer.fullname,
+ 'email' => customer.email,
+ 'creator' => {
+ 'id' => 80_014_400_777,
+ 'resource_type' => 'user'
+ },
+ 'identity' => {
+ 'id' => 80_014_400_777,
+ 'email' => customer.email,
+ 'resource_type' => 'identity_email',
+ },
+ 'mailbox' => {
+ 'id' => 1,
+ 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
+ 'address' => 'info@zammad.org',
+ 'resource_type' => 'mailbox',
+ },
+ 'attachments' => [],
+ 'download_all' => nil,
+ 'locale' => nil,
+ 'response_time' => 0,
+ 'created_at' => '2021-08-16T08:19:40+00:00',
+ 'updated_at' => '2021-08-16T08:19:40+00:00',
+ 'resource_type' => 'case_message',
+ },
+ 'is_requester' => true,
+ 'created_at' => '2021-08-16T08:19:40+00:00',
+ 'updated_at' => '2021-08-16T08:30:11+00:00',
+ 'resource_type' => 'post',
+ }
+ end
+ let(:used_urls) do
+ [
+ 'https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn',
+ 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/download'
+ ]
+ end
+
+ let(:id_map) do
+ {
+ 'Ticket' => {
+ 1001 => ticket.id,
+ },
+ 'User' => {
+ 80_014_400_745 => user.id,
+ 80_014_400_777 => customer.id,
+ }
+ }
+ end
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: id_map,
+ instance: ticket,
+ default_language: 'en-us',
+ }
+ end
+
+ let(:imported_ticket_article_attachment) do
+ {
+ filename: 'example.log',
+ size: '3',
+ preferences: {
+ 'Content-Type': 'text/plain'
+ }
+ }
+ end
+
+ before do
+ # Mock the attachment and inline image download requests.
+ used_urls.each do |used_url|
+ stub_request(:get, used_url).to_return(status: 200, body: '123', headers: {})
+ end
+ end
+
+ it 'adds article with inline image' do
+ expect { process(process_payload) }.to change(Ticket::Article, :count).by(1)
+ end
+
+ it 'correct attributes for added article' do
+ process(process_payload)
+ expect(Ticket::Article.last).to have_attributes(
+ to: 'info@zammad.org',
+ body: "\n\n
A Test with a inline image.
\n\n",
+ )
+ end
+
+ it 'updates already existing article' do
+ expect do
+ process(process_payload)
+ process(process_payload)
+ end.to change(Ticket::Article, :count).by(1)
+ end
+
+ it 'adds correct number of attachments' do
+ process(process_payload)
+ expect(Ticket::Article.last.attachments.size).to eq 1
+ end
+
+ it 'adds attachment content' do
+ process(process_payload)
+ expect(Ticket::Article.last.attachments.last).to have_attributes(imported_ticket_article_attachment)
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/team_spec.rb b/spec/lib/sequencer/sequence/import/kayako/team_spec.rb
new file mode 100644
index 000000000..359d36290
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/team_spec.rb
@@ -0,0 +1,47 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::Team, sequencer: :sequence do
+
+ context 'when importing teams from Kayako' do
+
+ let(:resource) do
+ {
+ 'id' => 80_000_374_715,
+ 'legacy_id' => nil,
+ 'title' => 'Support',
+ 'businesshour' => {
+ 'id' => 1,
+ 'resource_type' => 'business_hour'
+ },
+ 'member_count' => 0,
+ 'created_at' => '2021-08-16T13:42:26+00:00',
+ 'updated_at' => '2021-08-16T13:42:26+00:00',
+ 'resource_type' => 'team',
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: {},
+ }
+ end
+
+ it 'adds groups' do
+ expect { process(process_payload) }.to change(Group, :count).by(1)
+ end
+
+ it 'check added group data' do
+ process(process_payload)
+ expect(Group.last).to have_attributes(
+ name: 'Support',
+ active: true,
+ )
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/time_entry_spec.rb b/spec/lib/sequencer/sequence/import/kayako/time_entry_spec.rb
new file mode 100644
index 000000000..b1a3a0dd0
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/time_entry_spec.rb
@@ -0,0 +1,84 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::TimeEntry, sequencer: :sequence do
+
+ context 'when importing time_entry from Kayako' do
+
+ let(:resource) do
+ {
+ 'id' => 51,
+ 'time_tracking_log_id' => 51,
+ 'case' => {
+ 'id' => 1001,
+ 'resource_type' => 'case'
+ },
+ 'agent' => {
+ 'id' => 80_014_400_475,
+ 'resource_type' => 'user'
+ },
+ 'log_type' => 'WORKED',
+ 'time_spent' => 3600,
+ 'creator' => {
+ 'id' => 80_014_400_475,
+ 'resource_type' => 'user'
+ },
+ 'created_at' => '2021-08-27T20:38:30+00:00',
+ 'updated_at' => '2021-08-27T20:38:30+00:00',
+ 'resource_type' => 'timetracking_log',
+ }
+ end
+
+ let(:ticket) { create :ticket }
+ let(:id_map) do
+ {
+ 'Ticket' => {
+ 1001 => ticket.id,
+ },
+ 'User' => {
+ 80_014_400_475 => 1,
+ }
+ }
+ end
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: id_map,
+ default_language: 'en-us'
+ }
+ end
+
+ let(:imported_time_entry) do
+ {
+ ticket_id: ticket.id,
+ created_by_id: 1,
+ time_unit: 60,
+ }
+ end
+
+ it 'adds time entry' do
+ expect { process(process_payload) }.to change(Ticket::TimeAccounting, :count).by(1)
+ end
+
+ it 'correct attributes for added time entry' do
+ process(process_payload)
+ expect(Ticket::TimeAccounting.last).to have_attributes(imported_time_entry)
+ end
+
+ context 'when time entry should be skipped' do
+ let(:resource) do
+ super().merge(
+ 'log_type' => 'VIEWED'
+ )
+ end
+
+ it 'skip time entry' do
+ expect { process(process_payload) }.to change(Ticket::TimeAccounting, :count).by(0)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/user_field_spec.rb b/spec/lib/sequencer/sequence/import/kayako/user_field_spec.rb
new file mode 100644
index 000000000..6a178393c
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/user_field_spec.rb
@@ -0,0 +1,12 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+require 'lib/sequencer/sequence/import/kayako/examples/object_custom_fields_examples'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::UserField, sequencer: :sequence do
+
+ context 'when trying to import ticket fields from Kayako', db_strategy: :reset do
+ include_examples 'Object custom fields', klass: User
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/kayako/user_spec.rb b/spec/lib/sequencer/sequence/import/kayako/user_spec.rb
new file mode 100644
index 000000000..d9448057e
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/kayako/user_spec.rb
@@ -0,0 +1,150 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+require 'lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples'
+
+RSpec.describe ::Sequencer::Sequence::Import::Kayako::User, sequencer: :sequence, db_strategy: :reset do
+ context 'when importing users from Kayako' do
+ let(:groups) do
+ create_list(:group, 2)
+ end
+
+ let(:organization) { create(:organization) }
+
+ let(:resource) do
+ {
+ 'id' => 80_000_602_705,
+ 'uuid' => 'd4c85a6c-465f-5577-8240-276c0c7fe546',
+ 'full_name' => 'John Doe',
+ 'is_enabled' => true,
+ 'role' => {
+ 'id' => 2,
+ 'title' => 'Agent',
+ 'type' => 'AGENT',
+ 'is_system' => true,
+ 'agent_case_access' => 'ALL',
+ 'created_at' => '2021-08-12T11:48:45+00:00',
+ 'updated_at' => '2021-08-12T11:48:45+00:00',
+ 'resource_type' => 'role',
+ },
+ 'agent_case_access' => 'INHERIT-FROM-ROLE',
+ 'organization' => {
+ 'id' => 1001,
+ 'resource_type' => 'user'
+ },
+ 'teams' => [
+ {
+ 'id' => 1001,
+ 'resource_type' => 'team',
+ },
+ {
+ 'id' => 1002,
+ 'resource_type' => 'team',
+ }
+ ],
+ 'emails' => [
+ {
+ 'id' => 8,
+ 'email' => 'kayako@example.com',
+ 'is_primary' => true,
+ 'is_validated' => false,
+ 'is_notification_enabled' => false,
+ 'created_at' => '2021-08-19T08:24:50+00:00',
+ 'updated_at' => '2021-08-19T08:24:50+00:00',
+ 'resource_type' => 'identity_email',
+ },
+ ],
+ 'phones' => [
+ {
+ 'id' => 2,
+ 'number' => '+49123456789',
+ 'is_primary' => true,
+ 'is_validated' => false,
+ 'created_at' => '2021-08-19T10:16:26+00:00',
+ 'updated_at' => '2021-08-19T10:16:33+00:00',
+ 'resource_type' => 'identity_phone',
+ }
+ ],
+ 'twitter' => [],
+ 'facebook' => [],
+ 'time_zone' => nil,
+ 'time_zone_offset' => nil,
+ 'last_seen_user_agent' => nil,
+ 'last_seen_ip' => nil,
+ 'last_seen_at' => nil,
+ 'last_active_at' => '2021-08-19T13:16:23+00:00',
+ 'avatar_updated_at' => nil,
+ 'last_logged_in_at' => '2021-08-19T13:16:23+00:00',
+ 'last_activity_at' => nil,
+ 'created_at' => '2021-08-16T09:01:14+00:00',
+ 'updated_at' => '2021-08-18T20:37:52+00:00',
+ 'resource_type' => 'user',
+ }
+ end
+
+ let(:id_map) do
+ {
+ 'Group' => {
+ 1001 => groups[0].id,
+ 1002 => groups[1].id,
+ },
+ 'Organization' => {
+ 1001 => organization.id,
+ },
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: id_map,
+ default_language: 'en-us',
+ }
+ end
+
+ let(:imported_user) do
+ {
+ firstname: 'John',
+ lastname: 'Doe',
+ login: 'kayako@example.com',
+ email: 'kayako@example.com',
+ phone: '+49123456789',
+ active: true,
+ last_login: DateTime.parse('2021-08-19T13:16:23+00:00'),
+ }
+ end
+
+ it 'increased user count' do
+ expect { process(process_payload) }.to change(User, :count).by(1)
+ end
+
+ it 'adds correct user data' do
+ process(process_payload)
+ expect(User.last).to have_attributes(imported_user)
+ end
+
+ it 'sets user roles correctly for initiator user' do
+ Setting.set('import_kayako_endpoint_username', 'kayako@example.com')
+ process(process_payload)
+ expect(User.last.roles.sort.map(&:name)).to eq %w[Admin Agent]
+ end
+
+ it 'sets user roles correctly for non-admin user' do
+ process(process_payload)
+ expect(User.last.roles.sort.map(&:name)).to eq ['Agent']
+ end
+
+ it 'sets user groups correctly' do
+ process(process_payload)
+ expect(User.last.groups_access('full').sort).to eq groups
+ end
+
+ context 'when importing custom fields' do
+ include_examples 'Object custom field values', object_name: 'User', klass: User
+ end
+ end
+end
diff --git a/spec/lib/sequencer/unit/kayako/connected_spec.rb b/spec/lib/sequencer/unit/kayako/connected_spec.rb
new file mode 100644
index 000000000..798c03de6
--- /dev/null
+++ b/spec/lib/sequencer/unit/kayako/connected_spec.rb
@@ -0,0 +1,31 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe Sequencer::Unit::Kayako::Connected, sequencer: :unit do
+
+ context 'when checking the connection to Kayako' do
+
+ let(:params) do
+ {
+ dry_run: false,
+ import_job: instance_double(ImportJob),
+ field_map: {},
+ id_map: {},
+ }
+ end
+
+ let(:response_ok) { Net::HTTPOK.new(1.0, '200', 'OK') }
+ let(:response_unauthorized) { Net::HTTPUnauthorized.new(1.0, '401', 'Unauthorized') }
+
+ it 'check for correct connection' do
+ allow(described_class).to receive(:perform_request).with(any_args).and_return(response_ok)
+ expect(process(params)).to eq({ connected: true })
+ end
+
+ it 'check for unauthorized connection' do
+ allow(described_class).to receive(:perform_request).with(any_args).and_return(response_unauthorized)
+ expect(process(params)).to eq({ connected: false })
+ end
+ end
+end
diff --git a/spec/requests/import_kayako_spec.rb b/spec/requests/import_kayako_spec.rb
new file mode 100644
index 000000000..7c0ef2217
--- /dev/null
+++ b/spec/requests/import_kayako_spec.rb
@@ -0,0 +1,22 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe 'ImportKayako', type: :request, set_up: false, authenticated_as: false, required_envs: %w[IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN] do
+ let(:action) { nil }
+ let(:endpoint) { "/api/v1/import/kayako/#{action}" }
+
+ describe 'POST /api/v1/import/kayako/url_check', :use_vcr do
+ let(:action) { 'url_check' }
+
+ it 'check invalid subdomain' do
+ post endpoint, params: { url: 'https://reallybadexample.kayako.com' }, as: :json
+ expect(json_response['result']).to eq('invalid')
+ end
+
+ it 'check valid subdomain' do
+ post endpoint, params: { url: "https://#{ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN']}.kayako.com" }, as: :json
+ expect(json_response['result']).to eq('ok')
+ end
+ end
+end
diff --git a/spec/support/vcr_mask_kayako_endpoint_auth.rb b/spec/support/vcr_mask_kayako_endpoint_auth.rb
new file mode 100644
index 000000000..4204c201f
--- /dev/null
+++ b/spec/support/vcr_mask_kayako_endpoint_auth.rb
@@ -0,0 +1,11 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+VCR.configure do |c|
+ # The API key is used only inside the base64 encoded Basic Auth string, so mask that as well.
+ c.filter_sensitive_data('') { Base64.encode64("#{ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME']}:#{ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD']}").lines(chomp: true).join }
+
+ # The hostname of the Kayako endpoint URL used as well
+ if ENV['IMPORT_KAYAKO_ENDPOINT'].present?
+ c.filter_sensitive_data('') { URI.parse(ENV['IMPORT_KAYAKO_ENDPOINT']).hostname }
+ end
+end
diff --git a/spec/system/import/kayako_spec.rb b/spec/system/import/kayako_spec.rb
new file mode 100644
index 000000000..6432f0d56
--- /dev/null
+++ b/spec/system/import/kayako_spec.rb
@@ -0,0 +1,124 @@
+# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe 'Import Kayako', type: :system, set_up: false, authenticated_as: false, required_envs: %w[IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN IMPORT_KAYAKO_ENDPOINT_PASSWORD IMPORT_KAYAKO_ENDPOINT_USERNAME] do
+ describe 'fields validation', :use_vcr do
+ before do
+ visit '#import'
+ find('.js-kayako').click
+ end
+
+ let(:subdomain_field) { find('#kayako-subdomain') }
+ let(:email_field) { find('#kayako-email') }
+ let(:password_field) { find('#kayako-password') }
+
+ it 'invalid hostname' do
+ subdomain_field.fill_in with: 'reallybadexample'
+
+ expect(page).to have_css('.kayako-subdomain-error', text: 'Hostname not found!')
+ end
+
+ it 'valid hostname' do
+ subdomain_field.fill_in with: 'reallybadexample'
+
+ # wait for error to appear to validate it's hidden successfully
+ find('.kayako-subdomain-error', text: 'Hostname not found!')
+
+ subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN']
+
+ expect(page).to have_no_css('.kayako-subdomain-error', text: 'Hostname not found!')
+ end
+
+ it 'invalid credentials' do
+ subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN']
+ find('.js-kayako-credentials').click
+ email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME']
+ password_field.fill_in with: '1nv4l1dT0K3N'
+
+ expect(page).to have_css('.kayako-password-error', text: 'Invalid credentials!')
+ end
+
+ it 'valid credentials' do
+ subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN']
+ find('.js-kayako-credentials').click
+ email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME']
+ password_field.fill_in with: '1nv4l1dT0K3N'
+
+ # wait for error to appear to validate it's hidden successfully
+ expect(page).to have_css('.kayako-password-error', text: 'Invalid credentials!')
+
+ password_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD']
+
+ expect(page).to have_no_css('.kayako-password-error', text: 'Invalid credentials!')
+ end
+
+ it 'shows start button' do
+ subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN']
+ find('.js-kayako-credentials').click
+ email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME']
+ password_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD']
+
+ expect(page).to have_css('.js-migration-start')
+ end
+ end
+
+ describe 'import progress', :use_vcr do
+ let(:subdomain_field) { find('#kayako-subdomain') }
+ let(:email_field) { find('#kayako-email') }
+ let(:password_field) { find('#kayako-password') }
+ let(:job) { ImportJob.find_by(name: 'Import::Kayako') }
+
+ before do
+ VCR.use_cassette 'system/import/kayako/import_progress_setup' do
+ visit '#import'
+ find('.js-kayako').click
+
+ subdomain_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_SUBDOMAIN']
+ find('.js-kayako-credentials').click
+ email_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_USERNAME']
+ password_field.fill_in with: ENV['IMPORT_KAYAKO_ENDPOINT_PASSWORD']
+
+ find('.js-migration-start').click
+
+ await_empty_ajax_queue
+ end
+ end
+
+ it 'shows groups progress' do
+ job.update! result: { Groups: { sum: 3, total: 4 } }
+
+ expect(page).to have_css('.js-groups .js-done', text: '3')
+ .and(have_css('.js-groups .js-total', text: '4'))
+ end
+
+ it 'shows users progress' do
+ job.update! result: { Users: { sum: 5, total: 7 } }
+
+ expect(page).to have_css('.js-users .js-done', text: '5')
+ .and(have_css('.js-users .js-total', text: '7'))
+ end
+
+ it 'shows organizations progress' do
+ job.update! result: { Organizations: { sum: 3, total: 3 } }
+
+ expect(page).to have_css('.js-organizations .js-done', text: '3')
+ .and(have_css('.js-organizations .js-total', text: '3'))
+ end
+
+ it 'shows tickets progress' do
+ job.update! result: { Tickets: { sum: 3, total: 5 } }
+
+ expect(page).to have_css('.js-tickets .js-done', text: '3')
+ .and(have_css('.js-tickets .js-total', text: '5'))
+ end
+
+ it 'shows login after import is finished' do
+ job.update! finished_at: Time.zone.now
+
+ Rake::Task['zammad:setup:auto_wizard'].execute
+
+ expect(page).to have_text(Setting.get('fqdn'))
+ end
+ end
+end
diff --git a/test/data/vcr_cassettes/kayako_import.yml b/test/data/vcr_cassettes/kayako_import.yml
new file mode 100644
index 000000000..7eb9cca2d
--- /dev/null
+++ b/test/data/vcr_cassettes/kayako_import.yml
@@ -0,0 +1,3549 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https:///api/v1/settings
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:52 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ X-Csrf-Token:
+ - XRdK9nTGdqGWokkQ2T1Uf0yQcjNhri2PnfVi5rslxRr1jfO343dhE0wLvCowDq9X7VVzrpVpp5wU0IK7w0y56nziDIZYYINAvg4k
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:52+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 71,
+ "category": "social",
+ "name": "account_connected",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 64,
+ "category": "email",
+ "name": "account_setup",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 14,
+ "category": "user",
+ "name": "agent_added",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 18,
+ "category": "security",
+ "name": "agent.authentication_type",
+ "is_protected": false,
+ "value": "internal",
+ "resource_type": "setting"
+ },
+ {
+ "id": 32,
+ "category": "security",
+ "name": "agent.google.authentication.domain",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 33,
+ "category": "security",
+ "name": "agent.ip_restriction",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 21,
+ "category": "security",
+ "name": "agent.login_attempt_limit",
+ "is_protected": false,
+ "value": "10",
+ "resource_type": "setting"
+ },
+ {
+ "id": 27,
+ "category": "security",
+ "name": "agent.password.expires_in",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 26,
+ "category": "security",
+ "name": "agent.password.max_consecutive",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 22,
+ "category": "security",
+ "name": "agent.password.min_characters",
+ "is_protected": false,
+ "value": "8",
+ "resource_type": "setting"
+ },
+ {
+ "id": 23,
+ "category": "security",
+ "name": "agent.password.min_numbers",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 24,
+ "category": "security",
+ "name": "agent.password.min_symbols",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 25,
+ "category": "security",
+ "name": "agent.password.require_mixed_case",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 20,
+ "category": "security",
+ "name": "agent.session_expiry",
+ "is_protected": false,
+ "value": "16",
+ "resource_type": "setting"
+ },
+ {
+ "id": 19,
+ "category": "security",
+ "name": "agent.social_authentication.google",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 28,
+ "category": "security",
+ "name": "agent.sso.jwt.login_url",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 29,
+ "category": "security",
+ "name": "agent.sso.jwt.logout_url",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 31,
+ "category": "security",
+ "name": "agent.sso.jwt.service_name",
+ "is_protected": false,
+ "value": "Agent SSO Service",
+ "resource_type": "setting"
+ },
+ {
+ "id": 30,
+ "category": "security",
+ "name": "agent.sso.jwt.shared_secret",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 65,
+ "category": "users",
+ "name": "allow_requests_from_unregistered",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 82,
+ "category": "security",
+ "name": "allow_unsafe_html_in_articles",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 63,
+ "category": "email",
+ "name": "custom_dkim",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 34,
+ "category": "security",
+ "name": "customer.authentication_type",
+ "is_protected": false,
+ "value": "internal",
+ "resource_type": "setting"
+ },
+ {
+ "id": 39,
+ "category": "security",
+ "name": "customer.login_attempt_limit",
+ "is_protected": false,
+ "value": "10",
+ "resource_type": "setting"
+ },
+ {
+ "id": 45,
+ "category": "security",
+ "name": "customer.password.expires_in",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 44,
+ "category": "security",
+ "name": "customer.password.max_consecutive",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 40,
+ "category": "security",
+ "name": "customer.password.min_characters",
+ "is_protected": false,
+ "value": "8",
+ "resource_type": "setting"
+ },
+ {
+ "id": 41,
+ "category": "security",
+ "name": "customer.password.min_numbers",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 42,
+ "category": "security",
+ "name": "customer.password.min_symbols",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 43,
+ "category": "security",
+ "name": "customer.password.require_mixed_case",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 38,
+ "category": "security",
+ "name": "customer.session_expiry",
+ "is_protected": false,
+ "value": "72",
+ "resource_type": "setting"
+ },
+ {
+ "id": 36,
+ "category": "security",
+ "name": "customer.social_authentication.facebook",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 37,
+ "category": "security",
+ "name": "customer.social_authentication.google",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 35,
+ "category": "security",
+ "name": "customer.social_authentication.twitter",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 46,
+ "category": "security",
+ "name": "customer.sso.jwt.login_url",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 47,
+ "category": "security",
+ "name": "customer.sso.jwt.logout_url",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 49,
+ "category": "security",
+ "name": "customer.sso.jwt.service_name",
+ "is_protected": false,
+ "value": "Customer SSO Service",
+ "resource_type": "setting"
+ },
+ {
+ "id": 48,
+ "category": "security",
+ "name": "customer.sso.jwt.shared_secret",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 4,
+ "category": "account",
+ "name": "default_language",
+ "is_protected": false,
+ "value": "en-us",
+ "resource_type": "setting"
+ },
+ {
+ "id": 68,
+ "category": "users",
+ "name": "email_blacklist",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 61,
+ "category": "email",
+ "name": "email_inbound_html",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 67,
+ "category": "users",
+ "name": "email_whitelist",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 15,
+ "category": "user",
+ "name": "experience_kayako_completed",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 16,
+ "category": "user",
+ "name": "learn_kayako_completed",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 62,
+ "category": "email",
+ "name": "personalize_replies",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 56,
+ "category": "cases",
+ "name": "reopen_conversation_on_bounce",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 66,
+ "category": "users",
+ "name": "require_captcha",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 75,
+ "category": "messenger",
+ "name": "setup",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 60,
+ "category": "email",
+ "name": "spam_score",
+ "is_protected": false,
+ "value": "5",
+ "resource_type": "setting"
+ },
+ {
+ "id": 17,
+ "category": "user",
+ "name": "team_added",
+ "is_protected": false,
+ "value": "0",
+ "resource_type": "setting"
+ },
+ {
+ "id": 74,
+ "category": "chat",
+ "name": "teams",
+ "is_protected": false,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 6,
+ "category": "account",
+ "name": "time_format",
+ "is_protected": false,
+ "value": "24hour",
+ "resource_type": "setting"
+ },
+ {
+ "id": 55,
+ "category": "cases",
+ "name": "timetracking",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ },
+ {
+ "id": 5,
+ "category": "account",
+ "name": "timezone",
+ "is_protected": false,
+ "value": "UTC",
+ "resource_type": "setting"
+ },
+ {
+ "id": 52,
+ "category": "security",
+ "name": "token.android",
+ "is_protected": true,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 51,
+ "category": "security",
+ "name": "token.ios",
+ "is_protected": true,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 50,
+ "category": "security",
+ "name": "token.web",
+ "is_protected": true,
+ "value": "",
+ "resource_type": "setting"
+ },
+ {
+ "id": 59,
+ "category": "email",
+ "name": "wildcard_email",
+ "is_protected": false,
+ "value": "1",
+ "resource_type": "setting"
+ }
+ ],
+ "resource": "setting",
+ "total_count": 58,
+ "session_id": "TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz"
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:52 GMT
+- request:
+ method: get
+ uri: https:///api/v1/teams?limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:53 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:53+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 1,
+ "legacy_id": null,
+ "title": "General",
+ "businesshour": {
+ "id": 1,
+ "resource_type": "business_hour"
+ },
+ "member_count": 2,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "team",
+ "resource_url": "https:///api/v1/teams/1"
+ },
+ {
+ "id": 2,
+ "legacy_id": null,
+ "title": "Support",
+ "businesshour": {
+ "id": 1,
+ "resource_type": "business_hour"
+ },
+ "member_count": 1,
+ "created_at": "2021-08-27T11:27:14+00:00",
+ "updated_at": "2021-08-27T11:27:14+00:00",
+ "resource_type": "team",
+ "resource_url": "https:///api/v1/teams/2"
+ },
+ {
+ "id": 3,
+ "legacy_id": null,
+ "title": "Sales",
+ "businesshour": {
+ "id": 1,
+ "resource_type": "business_hour"
+ },
+ "member_count": 0,
+ "created_at": "2021-08-27T11:27:24+00:00",
+ "updated_at": "2021-08-27T11:27:24+00:00",
+ "resource_type": "team",
+ "resource_url": "https:///api/v1/teams/3"
+ },
+ {
+ "id": 4,
+ "legacy_id": null,
+ "title": "Marketing",
+ "businesshour": {
+ "id": 1,
+ "resource_type": "business_hour"
+ },
+ "member_count": 0,
+ "created_at": "2021-08-27T11:27:43+00:00",
+ "updated_at": "2021-08-27T11:27:44+00:00",
+ "resource_type": "team",
+ "resource_url": "https:///api/v1/teams/4"
+ }
+ ],
+ "resource": "team",
+ "offset": 0,
+ "limit": 100,
+ "total_count": 4
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:53 GMT
+- request:
+ method: get
+ uri: https:///api/v1/organizations/fields?include=field_option,locale_field&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:53 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '97'
+ Connection:
+ - keep-alive
+ Etag:
+ - d41d8cd98f00b204e9800998ecf8427e
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:53+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 200,
+ "data": [],
+ "resource": "organization_field",
+ "total_count": 0
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:53 GMT
+- request:
+ method: get
+ uri: https:///api/v1/organizations?include=organization_field,field_option,locale_field,identity_domain&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:54 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:54+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 3,
+ "name": "Zammad Foundation",
+ "legacy_id": null,
+ "is_shared": false,
+ "domains": [
+ {
+ "id": 3,
+ "domain": "zammad.org",
+ "is_primary": true,
+ "is_validated": false,
+ "created_at": "2021-08-27T10:33:16+00:00",
+ "updated_at": "2021-08-27T10:33:16+00:00",
+ "resource_type": "identity_domain",
+ "resource_url": "https:///api/v1/identities/domains/3"
+ }
+ ],
+ "is_validated": null,
+ "phone": [],
+ "addresses": [],
+ "websites": [],
+ "pinned_notes_count": 0,
+ "custom_fields": [],
+ "created_at": "2021-08-27T10:33:09+00:00",
+ "updated_at": "2021-08-27T10:33:16+00:00",
+ "resource_type": "organization",
+ "resource_url": "https:///api/v1/organizations/3"
+ },
+ {
+ "id": 2,
+ "name": "Brewfictus",
+ "legacy_id": null,
+ "is_shared": false,
+ "domains": [
+ {
+ "id": 2,
+ "domain": "brewfictus.com",
+ "is_primary": true,
+ "is_validated": false,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-08-24T18:24:12+00:00",
+ "resource_type": "identity_domain",
+ "resource_url": "https:///api/v1/identities/domains/2"
+ }
+ ],
+ "is_validated": null,
+ "phone": [],
+ "addresses": [],
+ "websites": [],
+ "pinned_notes_count": 0,
+ "custom_fields": [],
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-08-24T18:24:12+00:00",
+ "resource_type": "organization",
+ "resource_url": "https:///api/v1/organizations/2"
+ },
+ {
+ "id": 1,
+ "name": "Kayako",
+ "legacy_id": null,
+ "is_shared": false,
+ "domains": [
+ {
+ "id": 1,
+ "domain": "kayako.com",
+ "is_primary": true,
+ "is_validated": false,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "identity_domain",
+ "resource_url": "https:///api/v1/identities/domains/1"
+ }
+ ],
+ "is_validated": null,
+ "phone": [],
+ "addresses": [],
+ "websites": [],
+ "pinned_notes_count": 0,
+ "custom_fields": [],
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "organization",
+ "resource_url": "https:///api/v1/organizations/1"
+ }
+ ],
+ "resource": "organization",
+ "offset": 0,
+ "limit": 100,
+ "total_count": 3
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:54 GMT
+- request:
+ method: get
+ uri: https:///api/v1/users/fields?include=field_option,locale_field&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:55 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '89'
+ Connection:
+ - keep-alive
+ Etag:
+ - d41d8cd98f00b204e9800998ecf8427e
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:55+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 200,
+ "data": [],
+ "resource": "user_field",
+ "total_count": 0
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:55 GMT
+- request:
+ method: get
+ uri: https:///api/v1/users?include=user_field,field_option,locale_field,identity_email,identify_phone,identity_twitter,identity_facebook,role&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:55 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:55+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 7,
+ "uuid": "0c546446-d095-54c5-ae57-5f6f838d3c43",
+ "full_name": "Dominik Klein",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": true,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 4,
+ "title": "Customer",
+ "type": "CUSTOMER",
+ "is_system": true,
+ "agent_case_access": null,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "role",
+ "resource_url": "https:///api/v1/roles/4"
+ },
+ "avatar": "https:///avatar/get/0c546446-d095-54c5-ae57-5f6f838d3c43?1633096989",
+ "agent_case_access": null,
+ "organization_case_access": "REQUESTED",
+ "organization": null,
+ "teams": [],
+ "emails": [
+ {
+ "id": 7,
+ "email": "dominik.klein.morsbach@gmail.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-27T10:49:56+00:00",
+ "updated_at": "2021-08-27T10:49:56+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/7"
+ }
+ ],
+ "phones": [],
+ "twitter": [],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "Europe/Paris",
+ "time_zone_offset": 7200,
+ "greeting": null,
+ "signature": null,
+ "status_message": null,
+ "last_seen_user_agent": null,
+ "last_seen_ip": null,
+ "last_seen_at": "2021-08-27T10:49:56+00:00",
+ "last_active_at": "2021-10-01T14:03:09+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_7",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@f806879cb5bb012167bf61d705bfe94adf2e791b",
+ "password_updated_at": "2021-08-27T10:49:56+00:00",
+ "avatar_updated_at": null,
+ "last_logged_in_at": null,
+ "last_activity_at": null,
+ "created_at": "2021-08-27T10:49:56+00:00",
+ "updated_at": "2021-10-01T14:03:09+00:00",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/7"
+ },
+ {
+ "id": 6,
+ "uuid": "f27a9e93-9756-5535-948f-654b73af873c",
+ "full_name": "Customer",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": false,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 4,
+ "title": "Customer",
+ "type": "CUSTOMER",
+ "is_system": true,
+ "agent_case_access": null,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "role",
+ "resource_url": "https:///api/v1/roles/4"
+ },
+ "avatar": "https:///avatar/get/f27a9e93-9756-5535-948f-654b73af873c?1630061084",
+ "agent_case_access": null,
+ "organization_case_access": "REQUESTED",
+ "organization": {
+ "id": 3,
+ "resource_type": "organization"
+ },
+ "teams": [],
+ "emails": [
+ {
+ "id": 6,
+ "email": "customer@zammad.org",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-27T10:44:36+00:00",
+ "updated_at": "2021-08-27T10:44:36+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/6"
+ }
+ ],
+ "phones": [],
+ "twitter": [],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": null,
+ "time_zone_offset": null,
+ "greeting": null,
+ "signature": null,
+ "status_message": null,
+ "last_seen_user_agent": null,
+ "last_seen_ip": null,
+ "last_seen_at": null,
+ "last_active_at": "2021-08-27T10:44:36+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_6",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@f9bd1ca07611d6dae6f265a93ee99062744e52cf",
+ "password_updated_at": "2021-08-27T10:44:36+00:00",
+ "avatar_updated_at": null,
+ "last_logged_in_at": null,
+ "last_activity_at": null,
+ "created_at": "2021-08-27T10:44:36+00:00",
+ "updated_at": "2021-08-27T10:44:44+00:00",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/6"
+ },
+ {
+ "id": 5,
+ "uuid": "05c4cfa9-a17f-558e-a8bb-8288a0858d4c",
+ "full_name": "Simon Diaz",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": false,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 4,
+ "title": "Customer",
+ "type": "CUSTOMER",
+ "is_system": true,
+ "agent_case_access": null,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "role",
+ "resource_url": "https:///api/v1/roles/4"
+ },
+ "avatar": "https:///avatar/get/05c4cfa9-a17f-558e-a8bb-8288a0858d4c?1633095179",
+ "agent_case_access": null,
+ "organization_case_access": "REQUESTED",
+ "organization": {
+ "id": 1,
+ "resource_type": "organization"
+ },
+ "teams": [],
+ "emails": [
+ {
+ "id": 5,
+ "email": "simon@brewfictus.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-08-24T18:24:12+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/5"
+ }
+ ],
+ "phones": [],
+ "twitter": [],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "UTC",
+ "time_zone_offset": 0,
+ "greeting": null,
+ "signature": "",
+ "status_message": null,
+ "last_seen_user_agent": null,
+ "last_seen_ip": null,
+ "last_seen_at": null,
+ "last_active_at": "2021-10-01T13:32:59+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_5",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@d5b4e65fcec6a8c20de613e3644e7532bb82e8ff",
+ "password_updated_at": "2021-08-24T18:24:12+00:00",
+ "avatar_updated_at": "2021-08-24T18:24:12+00:00",
+ "last_logged_in_at": null,
+ "last_activity_at": null,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-10-01T13:32:59+00:00",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/5"
+ },
+ {
+ "id": 4,
+ "uuid": "38dcb0ec-6b1a-5526-84fc-2eac97e0108e",
+ "full_name": "Tobias Schroeter",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": true,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 4,
+ "title": "Customer",
+ "type": "CUSTOMER",
+ "is_system": true,
+ "agent_case_access": null,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "role",
+ "resource_url": "https:///api/v1/roles/4"
+ },
+ "avatar": "https:///avatar/get/38dcb0ec-6b1a-5526-84fc-2eac97e0108e?1633083506",
+ "agent_case_access": null,
+ "organization_case_access": "REQUESTED",
+ "organization": {
+ "id": 1,
+ "resource_type": "organization"
+ },
+ "teams": [],
+ "emails": [
+ {
+ "id": 4,
+ "email": "tobias@brewfictus.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-08-24T18:24:12+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/4"
+ }
+ ],
+ "phones": [],
+ "twitter": [
+ {
+ "id": 2,
+ "twitter_id": "738160281235292160",
+ "full_name": "Tobias",
+ "screen_name": "TobyBrewfictus",
+ "follower_count": 0,
+ "description": null,
+ "url": null,
+ "location": null,
+ "profile_image_url": null,
+ "locale": null,
+ "is_verified": false,
+ "is_primary": false,
+ "is_validated": false,
+ "created_at": "2021-08-24T18:24:35+00:00",
+ "updated_at": "2021-08-24T18:24:35+00:00",
+ "resource_type": "identity_twitter",
+ "resource_url": "https:///api/v1/identities/twitter/2"
+ }
+ ],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "UTC",
+ "time_zone_offset": 0,
+ "greeting": null,
+ "signature": "",
+ "status_message": null,
+ "last_seen_user_agent": null,
+ "last_seen_ip": null,
+ "last_seen_at": null,
+ "last_active_at": "2021-10-01T10:18:26+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_4",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@ccf0bc16a353495989e7760977f43fae0ecfa29c",
+ "password_updated_at": "2021-08-24T18:24:12+00:00",
+ "avatar_updated_at": "2021-08-24T18:24:12+00:00",
+ "last_logged_in_at": null,
+ "last_activity_at": null,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-10-01T10:18:26+00:00",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/4"
+ },
+ {
+ "id": 3,
+ "uuid": "81d8a32c-de07-5ed6-b92f-ef42650299a2",
+ "full_name": "Taylor West",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": true,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 4,
+ "title": "Customer",
+ "type": "CUSTOMER",
+ "is_system": true,
+ "agent_case_access": null,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "role",
+ "resource_url": "https:///api/v1/roles/4"
+ },
+ "avatar": "https:///avatar/get/81d8a32c-de07-5ed6-b92f-ef42650299a2?1630066733",
+ "agent_case_access": null,
+ "organization_case_access": "REQUESTED",
+ "organization": {
+ "id": 1,
+ "resource_type": "organization"
+ },
+ "teams": [],
+ "emails": [
+ {
+ "id": 3,
+ "email": "rainbowcitycafe@gmail.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-08-24T18:24:12+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/3"
+ }
+ ],
+ "phones": [],
+ "twitter": [
+ {
+ "id": 1,
+ "twitter_id": "85425062392723712",
+ "full_name": "Taylor West",
+ "screen_name": "TaylorWestRnbw",
+ "follower_count": 0,
+ "description": null,
+ "url": null,
+ "location": null,
+ "profile_image_url": null,
+ "locale": null,
+ "is_verified": false,
+ "is_primary": false,
+ "is_validated": false,
+ "created_at": "2021-08-24T18:24:34+00:00",
+ "updated_at": "2021-08-24T18:24:34+00:00",
+ "resource_type": "identity_twitter",
+ "resource_url": "https:///api/v1/identities/twitter/1"
+ }
+ ],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "UTC",
+ "time_zone_offset": 0,
+ "greeting": null,
+ "signature": null,
+ "status_message": null,
+ "last_seen_user_agent": null,
+ "last_seen_ip": null,
+ "last_seen_at": "2021-08-27T12:18:53+00:00",
+ "last_active_at": "2021-08-27T12:18:53+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_3",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@dd132dd919d8d003c2bcd2e006a9133a8669d204",
+ "password_updated_at": "2021-08-24T18:24:11+00:00",
+ "avatar_updated_at": "2021-08-24T18:24:12+00:00",
+ "last_logged_in_at": null,
+ "last_activity_at": null,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-27T12:18:53+00:00",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/3"
+ },
+ {
+ "id": 2,
+ "uuid": "575e6dc8-5406-5d65-b012-11e152c69758",
+ "full_name": "Kelly O'Brien",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": true,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 3,
+ "title": "Collaborator",
+ "type": "COLLABORATOR",
+ "is_system": true,
+ "agent_case_access": "ALL",
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "role",
+ "resource_url": "https:///api/v1/roles/3"
+ },
+ "avatar": "https:///avatar/get/575e6dc8-5406-5d65-b012-11e152c69758?1630061019",
+ "agent_case_access": "ALL",
+ "organization_case_access": null,
+ "organization": {
+ "id": 1,
+ "resource_type": "organization"
+ },
+ "teams": [
+ {
+ "id": 1,
+ "resource_type": "team"
+ }
+ ],
+ "emails": [
+ {
+ "id": 2,
+ "email": "kelly@kayako.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/2"
+ }
+ ],
+ "phones": [],
+ "twitter": [],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "UTC",
+ "time_zone_offset": 0,
+ "greeting": null,
+ "signature": null,
+ "status_message": null,
+ "last_seen_user_agent": null,
+ "last_seen_ip": null,
+ "last_seen_at": null,
+ "last_active_at": "2021-08-27T10:43:39+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_2",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@5714d8e200a4f6460dab8a3ce070827c67597874",
+ "password_updated_at": "2021-08-24T18:24:11+00:00",
+ "avatar_updated_at": "2021-08-24T18:24:11+00:00",
+ "last_logged_in_at": null,
+ "last_activity_at": null,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-27T10:43:39+00:00",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/2"
+ },
+ {
+ "id": 1,
+ "uuid": "a8dfe5fd-b08d-5d07-ad8b-74b113f5d726",
+ "full_name": "Thorsten Eckel",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": true,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 5,
+ "title": "Owner",
+ "type": "OWNER",
+ "is_system": true,
+ "agent_case_access": "ALL",
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-24T18:24:11+00:00",
+ "resource_type": "role",
+ "resource_url": "https:///api/v1/roles/5"
+ },
+ "avatar": "https:///avatar/get/a8dfe5fd-b08d-5d07-ad8b-74b113f5d726?1633103802",
+ "agent_case_access": "ALL",
+ "organization_case_access": null,
+ "organization": {
+ "id": 3,
+ "resource_type": "organization"
+ },
+ "teams": [
+ {
+ "id": 1,
+ "resource_type": "team"
+ },
+ {
+ "id": 2,
+ "resource_type": "team"
+ }
+ ],
+ "emails": [
+ {
+ "id": 1,
+ "email": "",
+ "is_primary": true,
+ "is_validated": true,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-27T06:57:08+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/1"
+ }
+ ],
+ "phones": [],
+ "twitter": [],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "UTC",
+ "time_zone_offset": 0,
+ "greeting": null,
+ "signature": null,
+ "status_message": null,
+ "last_seen_user_agent": "Ruby",
+ "last_seen_ip": "5.231.138.208",
+ "last_seen_at": "2021-10-01T15:56:42+00:00",
+ "last_active_at": "2021-10-01T15:56:42+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_1",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@cf0274b394db3af555dbc136fc70aab6e45bee42",
+ "password_updated_at": "2021-08-27T07:18:23+00:00",
+ "avatar_updated_at": null,
+ "last_logged_in_at": "2021-10-01T15:58:52+00:00",
+ "last_activity_at": "2021-10-01T15:58:52+00:00",
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-10-01T15:56:42+00:00",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/1"
+ }
+ ],
+ "resource": "user",
+ "offset": 0,
+ "limit": 100,
+ "total_count": 7
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:55 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases/fields?include=field_option,locale_field&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:56 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:56+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 1,
+ "fielduuid": "beaf2079-5a79-446c-a487-61dfee353f1c",
+ "title": "Subject",
+ "type": "SUBJECT",
+ "key": "subject",
+ "is_required_for_agents": true,
+ "is_required_on_resolution": true,
+ "is_visible_to_customers": true,
+ "customer_titles": [
+ {
+ "id": 1,
+ "locale": "en-us",
+ "translation": "Subject",
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/1"
+ }
+ ],
+ "is_customer_editable": true,
+ "is_required_for_customers": true,
+ "descriptions": [
+ {
+ "id": 2,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/2"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 1,
+ "is_enabled": true,
+ "is_system": true,
+ "options": [],
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/1"
+ },
+ {
+ "id": 2,
+ "fielduuid": "e167724d-13d4-4cc7-9a99-c69078a491eb",
+ "title": "Message",
+ "type": "MESSAGE",
+ "key": "message",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": true,
+ "is_visible_to_customers": true,
+ "customer_titles": [
+ {
+ "id": 3,
+ "locale": "en-us",
+ "translation": "Message",
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/3"
+ }
+ ],
+ "is_customer_editable": true,
+ "is_required_for_customers": true,
+ "descriptions": [
+ {
+ "id": 4,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/4"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 2,
+ "is_enabled": true,
+ "is_system": true,
+ "options": [],
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/2"
+ },
+ {
+ "id": 3,
+ "fielduuid": "ddd30482-7cef-46c6-86f1-2fa57052c80b",
+ "title": "Priority",
+ "type": "PRIORITY",
+ "key": "priority",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": true,
+ "customer_titles": [
+ {
+ "id": 5,
+ "locale": "en-us",
+ "translation": "Priority",
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/5"
+ }
+ ],
+ "is_customer_editable": true,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 6,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/6"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 3,
+ "is_enabled": true,
+ "is_system": true,
+ "options": [],
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/3"
+ },
+ {
+ "id": 4,
+ "fielduuid": "f5b106f2-7d88-49cc-9cf8-c0bdd797b76f",
+ "title": "Status",
+ "type": "STATUS",
+ "key": "status",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": true,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 7,
+ "locale": "en-us",
+ "translation": "Status",
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/7"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 8,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/8"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 4,
+ "is_enabled": true,
+ "is_system": true,
+ "options": [],
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/4"
+ },
+ {
+ "id": 5,
+ "fielduuid": "4be5a2aa-307e-4032-8e44-d4ecdf5ecda1",
+ "title": "Type",
+ "type": "TYPE",
+ "key": "type",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 9,
+ "locale": "en-us",
+ "translation": "Type",
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/9"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 10,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/10"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 5,
+ "is_enabled": true,
+ "is_system": true,
+ "options": [],
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/5"
+ },
+ {
+ "id": 6,
+ "fielduuid": "3ae3f47a-f677-4203-acee-b47cc136e0e9",
+ "title": "Team",
+ "type": "TEAM",
+ "key": "team",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 11,
+ "locale": "en-us",
+ "translation": "Team",
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/11"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 12,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/12"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 6,
+ "is_enabled": true,
+ "is_system": true,
+ "options": [],
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/6"
+ },
+ {
+ "id": 7,
+ "fielduuid": "ee4d91ac-8e37-44b0-b23e-908f2fb9738a",
+ "title": "Assignee",
+ "type": "ASSIGNEE",
+ "key": "assignee",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": true,
+ "customer_titles": [
+ {
+ "id": 13,
+ "locale": "en-us",
+ "translation": "Assignee",
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/13"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 14,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/14"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 7,
+ "is_enabled": true,
+ "is_system": true,
+ "options": [],
+ "created_at": "2021-08-24T18:24:16+00:00",
+ "updated_at": "2021-08-24T18:24:16+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/7"
+ },
+ {
+ "id": 8,
+ "fielduuid": "a9bb7938-c0d0-4ff7-988e-c0d61a106941",
+ "title": "CustomText",
+ "type": "TEXT",
+ "key": "customtext",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 19,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:51:53+00:00",
+ "updated_at": "2021-10-01T13:51:53+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/19"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 20,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:51:53+00:00",
+ "updated_at": "2021-10-01T13:51:53+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/20"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 8,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [],
+ "created_at": "2021-10-01T13:51:53+00:00",
+ "updated_at": "2021-10-01T13:51:53+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/8"
+ },
+ {
+ "id": 9,
+ "fielduuid": "6d004c13-ca6c-47cf-92f9-4629dfe1401d",
+ "title": "CustomTextarea",
+ "type": "TEXTAREA",
+ "key": "customtextarea",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 21,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:52:08+00:00",
+ "updated_at": "2021-10-01T13:52:08+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/21"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 22,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:52:08+00:00",
+ "updated_at": "2021-10-01T13:52:08+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/22"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 9,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [],
+ "created_at": "2021-10-01T13:52:08+00:00",
+ "updated_at": "2021-10-01T13:52:08+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/9"
+ },
+ {
+ "id": 10,
+ "fielduuid": "fcef9f73-e25b-4744-93f6-0166eca5423c",
+ "title": "CustomRadio",
+ "type": "RADIO",
+ "key": "customradio",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 23,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:54:46+00:00",
+ "updated_at": "2021-10-01T13:54:46+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/23"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 24,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:54:46+00:00",
+ "updated_at": "2021-10-01T13:54:46+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/24"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 10,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [
+ {
+ "id": 1,
+ "fielduuid": "fcef9f73-e25b-4744-93f6-0166eca5423c",
+ "values": [
+ {
+ "id": 25,
+ "locale": "en-us",
+ "translation": "Test 1",
+ "created_at": "2021-10-01T13:54:46+00:00",
+ "updated_at": "2021-10-01T13:54:46+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/25"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:54:46+00:00",
+ "updated_at": "2021-10-01T13:54:46+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/1"
+ },
+ {
+ "id": 2,
+ "fielduuid": "fcef9f73-e25b-4744-93f6-0166eca5423c",
+ "values": [
+ {
+ "id": 26,
+ "locale": "en-us",
+ "translation": "Test 2",
+ "created_at": "2021-10-01T13:54:46+00:00",
+ "updated_at": "2021-10-01T13:54:46+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/26"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:54:46+00:00",
+ "updated_at": "2021-10-01T13:54:46+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/2"
+ }
+ ],
+ "created_at": "2021-10-01T13:54:46+00:00",
+ "updated_at": "2021-10-01T13:54:46+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/10"
+ },
+ {
+ "id": 11,
+ "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18",
+ "title": "CustomSingleSelect",
+ "type": "SELECT",
+ "key": "customsingleselect",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 27,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/27"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 28,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/28"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 11,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [
+ {
+ "id": 3,
+ "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18",
+ "values": [
+ {
+ "id": 29,
+ "locale": "en-us",
+ "translation": "a",
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/29"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/3"
+ },
+ {
+ "id": 4,
+ "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18",
+ "values": [
+ {
+ "id": 30,
+ "locale": "en-us",
+ "translation": "b",
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/30"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/4"
+ },
+ {
+ "id": 5,
+ "fielduuid": "60c67010-54e3-442c-9c90-7fba5388ad18",
+ "values": [
+ {
+ "id": 31,
+ "locale": "en-us",
+ "translation": "c",
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/31"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/5"
+ }
+ ],
+ "created_at": "2021-10-01T13:55:01+00:00",
+ "updated_at": "2021-10-01T13:55:01+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/11"
+ },
+ {
+ "id": 12,
+ "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e",
+ "title": "CustomMultiChoice",
+ "type": "CHECKBOX",
+ "key": "custommultichoice",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 32,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/32"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 33,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/33"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 12,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [
+ {
+ "id": 6,
+ "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e",
+ "values": [
+ {
+ "id": 34,
+ "locale": "en-us",
+ "translation": "1",
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/34"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/6"
+ },
+ {
+ "id": 7,
+ "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e",
+ "values": [
+ {
+ "id": 35,
+ "locale": "en-us",
+ "translation": "2",
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/35"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/7"
+ },
+ {
+ "id": 8,
+ "fielduuid": "17fb2d4e-bcfb-4353-8870-e317c14df74e",
+ "values": [
+ {
+ "id": 36,
+ "locale": "en-us",
+ "translation": "3",
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/36"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/8"
+ }
+ ],
+ "created_at": "2021-10-01T13:55:52+00:00",
+ "updated_at": "2021-10-01T13:55:52+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/12"
+ },
+ {
+ "id": 13,
+ "fielduuid": "2adc53a8-0e91-4f1b-b071-fa02f1d05cc0",
+ "title": "CustomNumeric",
+ "type": "NUMERIC",
+ "key": "customnumeric",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 37,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:56:26+00:00",
+ "updated_at": "2021-10-01T13:56:26+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/37"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 38,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:56:26+00:00",
+ "updated_at": "2021-10-01T13:56:26+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/38"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 13,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [],
+ "created_at": "2021-10-01T13:56:26+00:00",
+ "updated_at": "2021-10-01T13:56:26+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/13"
+ },
+ {
+ "id": 14,
+ "fielduuid": "c583698a-e986-4b1c-9001-f8355e2ca951",
+ "title": "CustomDecimal",
+ "type": "DECIMAL",
+ "key": "customdecimal",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 39,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:56:41+00:00",
+ "updated_at": "2021-10-01T13:56:41+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/39"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 40,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T13:56:41+00:00",
+ "updated_at": "2021-10-01T13:56:41+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/40"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 14,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [],
+ "created_at": "2021-10-01T13:56:41+00:00",
+ "updated_at": "2021-10-01T13:56:41+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/14"
+ },
+ {
+ "id": 15,
+ "fielduuid": "ce5e552f-9680-4624-a864-5e01649fcebc",
+ "title": "CustomYesNo",
+ "type": "YESNO",
+ "key": "customyesno",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 41,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:00:31+00:00",
+ "updated_at": "2021-10-01T14:00:31+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/41"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 42,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:00:31+00:00",
+ "updated_at": "2021-10-01T14:00:31+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/42"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 15,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [],
+ "created_at": "2021-10-01T14:00:31+00:00",
+ "updated_at": "2021-10-01T14:00:31+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/15"
+ },
+ {
+ "id": 16,
+ "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a",
+ "title": "CustomTreeSelect",
+ "type": "CASCADINGSELECT",
+ "key": "customtreeselect",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 43,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/43"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 44,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/44"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 16,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [
+ {
+ "id": 9,
+ "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a",
+ "values": [
+ {
+ "id": 45,
+ "locale": "en-us",
+ "translation": "Level1",
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/45"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/9"
+ },
+ {
+ "id": 10,
+ "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a",
+ "values": [
+ {
+ "id": 46,
+ "locale": "en-us",
+ "translation": "Level1::Sub1",
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/46"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/10"
+ },
+ {
+ "id": 11,
+ "fielduuid": "31a1628f-8041-4313-8fce-705f0209647a",
+ "values": [
+ {
+ "id": 47,
+ "locale": "en-us",
+ "translation": "Level2",
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/47"
+ }
+ ],
+ "sort_order": 0,
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "field_option",
+ "resource_url": "https:///api/v1/base/field/option/11"
+ }
+ ],
+ "created_at": "2021-10-01T14:01:05+00:00",
+ "updated_at": "2021-10-01T14:01:05+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/16"
+ },
+ {
+ "id": 17,
+ "fielduuid": "43d80332-100d-40a6-adc2-c4917c9a50e4",
+ "title": "CustomDate",
+ "type": "DATE",
+ "key": "customdate",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 48,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:01:27+00:00",
+ "updated_at": "2021-10-01T14:01:27+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/48"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 49,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:01:27+00:00",
+ "updated_at": "2021-10-01T14:01:27+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/49"
+ }
+ ],
+ "regular_expression": null,
+ "sort_order": 17,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [],
+ "created_at": "2021-10-01T14:01:27+00:00",
+ "updated_at": "2021-10-01T14:01:27+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/17"
+ },
+ {
+ "id": 18,
+ "fielduuid": "21071813-aa21-490c-9c38-b00d6ebc5c73",
+ "title": "CustomRegexp",
+ "type": "REGEX",
+ "key": "customregexp",
+ "is_required_for_agents": false,
+ "is_required_on_resolution": false,
+ "is_visible_to_customers": false,
+ "customer_titles": [
+ {
+ "id": 50,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:01:51+00:00",
+ "updated_at": "2021-10-01T14:01:51+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/50"
+ }
+ ],
+ "is_customer_editable": false,
+ "is_required_for_customers": false,
+ "descriptions": [
+ {
+ "id": 51,
+ "locale": "en-us",
+ "translation": null,
+ "created_at": "2021-10-01T14:01:51+00:00",
+ "updated_at": "2021-10-01T14:01:51+00:00",
+ "resource_type": "locale_field",
+ "resource_url": "https:///api/v1/locale/fields/51"
+ }
+ ],
+ "regular_expression": "\\d\\d\\d",
+ "sort_order": 18,
+ "is_enabled": true,
+ "is_system": false,
+ "options": [],
+ "created_at": "2021-10-01T14:01:51+00:00",
+ "updated_at": "2021-10-01T14:01:51+00:00",
+ "resource_type": "case_field",
+ "resource_url": "https:///api/v1/cases/fields/18"
+ }
+ ],
+ "resource": "case_field",
+ "total_count": 18
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:56 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases?fields=%2Btags&include=user,case_priority,case_status,channel,tag,case_type&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:57 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:57+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ ewogICAgInN0YXR1cyI6IDIwMCwKICAgICJkYXRhIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICJzdWJqZWN0IjogIkEgdGVzdCBxdWVzdGlvbiIsCiAgICAgICAgICAgICJwb3J0YWwiOiAiU0VSVklDRSIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3B1YmxpY19jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk1BSUwiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm1haWxib3giCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVlc3RlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAidXVpZCI6ICIwYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDMiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJEb21pbmlrIEtsZWluIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC8wYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDM/MTYzMzA5Njk4OSIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6ICJSRVFVRVNURUQiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiRXVyb3BlL1BhcmlzIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogNzIwMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc183IiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBmODA2ODc5Y2I1YmIwMTIxNjdiZjYxZDcwNWJmZTk0YWRmMmU3OTFiIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy83IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiY3JlYXRvciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAidXVpZCI6ICIwYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDMiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJEb21pbmlrIEtsZWluIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC8wYzU0NjQ0Ni1kMDk1LTU0YzUtYWU1Ny01ZjZmODM4ZDNjNDM/MTYzMzA5Njk4OSIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6ICJSRVFVRVNURUQiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiRXVyb3BlL1BhcmlzIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogNzIwMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc183IiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBmODA2ODc5Y2I1YmIwMTIxNjdiZjYxZDcwNWJmZTk0YWRmMmU3OTFiIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTQ6MDM6MDkrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy83IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFzc2lnbmVkX3RlYW0iOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGhvcnN0ZW4gRWNrZWwiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0L2E4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNj8xNjMzMTAzODAyIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6ICJBTEwiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiAiUnVieSIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogIjUuMjMxLjEzOC4yMDgiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMSIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAY2YwMjc0YjM5NGRiM2FmNTU1ZGJjMTM2ZmM3MGFhYjZlNDViZWU0MiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA3OjE4OjIzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJicmFuZCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN0YXR1cyI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiTmV3IiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk5FVyIsCiAgICAgICAgICAgICAgICAic29ydF9vcmRlciI6IDEsCiAgICAgICAgICAgICAgICAiaXNfc2xhX2FjdGl2ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2Vfc3RhdHVzIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3N0YXR1c2VzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcmlvcml0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiTG93IiwKICAgICAgICAgICAgICAgICJsZXZlbCI6IDEsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9wcmlvcml0eSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wcmlvcml0aWVzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICJsYWJlbCI6ICJJbmNpZGVudCIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJJTkNJREVOVCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV90eXBlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3R5cGVzLzQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyZWFkX21hcmtlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNsYV92ZXJzaW9uIjogbnVsbCwKICAgICAgICAgICAgInNsYV9tZXRyaWNzIjogW10sCiAgICAgICAgICAgICJmb3JtIjogbnVsbCwKICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIkV4YW1wbGUiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJFeGFtcGxlXG5cblRlc3QiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiMSIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICI0IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIjciLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiMiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIzIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogInllcyIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIxMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIyMDIxLTEwLTEyVDAwOjAwOjAwKzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIjEyMyIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImxhc3RfcmVwbGllciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2J5IjogbnVsbCwKICAgICAgICAgICAgInN0YXRlIjogIkFDVElWRSIsCiAgICAgICAgICAgICJwb3N0X2NvdW50IjogMiwKICAgICAgICAgICAgImhhc19ub3RlcyI6IHRydWUsCiAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAiaGFzX2F0dGFjaG1lbnRzIjogdHJ1ZSwKICAgICAgICAgICAgImlzX21lcmdlZCI6IGZhbHNlLAogICAgICAgICAgICAicmF0aW5nIjogbnVsbCwKICAgICAgICAgICAgInJhdGluZ19zdGF0dXMiOiAiVU5PRkZFUkVEIiwKICAgICAgICAgICAgInRhZ3MiOiBbXSwKICAgICAgICAgICAgImxhc3RfcG9zdF9zdGF0dXMiOiAiIiwKICAgICAgICAgICAgImxhc3RfcG9zdF9wcmV2aWV3IjogIldlIHdpbGwgaGVscCB0aGUgZ3V5LiIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfdHlwZSI6ICJOT1RFIiwKICAgICAgICAgICAgImxhc3RfbWVzc2FnZV9wcmV2aWV3IjogIldlIHdpbGwgaGVscCB0aGUgZ3V5LiIsCiAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfY2FzZXNfMyIsCiAgICAgICAgICAgICJsYXN0X2Fzc2lnbmVkX2F0IjogIjIwMjEtMDgtMjdUMTE6Mjc6MDArMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBsaWVkX2F0IjogIjIwMjEtMDgtMjdUMTE6MjY6MjYrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9vcGVuZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9wZW5kaW5nX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfYWdlbnRfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X2N1c3RvbWVyX2FjdGl2aXR5X2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9hZ2VudF9hdCI6ICIyMDIxLTA4LTI3VDExOjI2OjI2KzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfcmVwbHlfYnlfcmVxdWVzdGVyX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAiYWdlbnRfdXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZSIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzLzMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAic3ViamVjdCI6ICJBIGV4YW1wbGUiLAogICAgICAgICAgICAicG9ydGFsIjogIkFQSSIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImNmM2NkMzlhLTU0YmYtNWU1ZS05MTJiLTg4MzkxOWYzYWIxZSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJOT1RFIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcHVibGljX2NoYW5uZWwiOiBudWxsLAogICAgICAgICAgICAicmVxdWVzdGVyIjogewogICAgICAgICAgICAgICAgImlkIjogNywKICAgICAgICAgICAgICAgICJ1dWlkIjogIjBjNTQ2NDQ2LWQwOTUtNTRjNS1hZTU3LTVmNmY4MzhkM2M0MyIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIkRvbWluaWsgS2xlaW4iLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzBjNTQ2NDQ2LWQwOTUtNTRjNS1hZTU3LTVmNmY4MzhkM2M0Mz8xNjMzMDk2OTg5IiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJFdXJvcGUvUGFyaXMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiA3MjAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMDo0OTo1NiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzciLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGY4MDY4NzljYjViYjAxMjE2N2JmNjFkNzA1YmZlOTRhZGYyZTc5MWIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0OTo1NiswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDk6NTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNDowMzowOSswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ1dWlkIjogImE4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRob3JzdGVuIEVja2VsIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC9hOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjY/MTYzMzEwMzgwMiIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiAiQUxMIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogIlJ1YnkiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6ICI1LjIzMS4xMzguMjA4IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzEiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGNmMDI3NGIzOTRkYjNhZjU1NWRiYzEzNmZjNzBhYWI2ZTQ1YmVlNDIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNzoxODoyMyswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICJhc3NpZ25lZF90ZWFtIjogbnVsbCwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiBudWxsLAogICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiYnJhbmQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdGF0dXMiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgImxhYmVsIjogIkNsb3NlZCIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJDTE9TRUQiLAogICAgICAgICAgICAgICAgInNvcnRfb3JkZXIiOiA1LAogICAgICAgICAgICAgICAgImlzX3NsYV9hY3RpdmUiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX2RlbGV0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX3N0YXR1cyIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9zdGF0dXNlcy81IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicHJpb3JpdHkiOiBudWxsLAogICAgICAgICAgICAidHlwZSI6IG51bGwsCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IG51bGwsCiAgICAgICAgICAgICJzbGFfdmVyc2lvbiI6IG51bGwsCiAgICAgICAgICAgICJzbGFfbWV0cmljcyI6IFtdLAogICAgICAgICAgICAiZm9ybSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2Zvcm0iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDExLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE0LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJsYXN0X3JlcGxpZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiA3LAogICAgICAgICAgICAgICAgInV1aWQiOiAiMGM1NDY0NDYtZDA5NS01NGM1LWFlNTctNWY2ZjgzOGQzYzQzIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiRG9taW5payBLbGVpbiIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvMGM1NDY0NDYtZDA5NS01NGM1LWFlNTctNWY2ZjgzOGQzYzQzPzE2MzMwOTY5ODkiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogNywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIkV1cm9wZS9QYXJpcyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDcyMDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfNyIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAZjgwNjg3OWNiNWJiMDEyMTY3YmY2MWQ3MDViZmU5NGFkZjJlNzkxYiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ5OjU2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0OTo1NiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE0OjAzOjA5KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvNyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDcsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ1dWlkIjogImE4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRob3JzdGVuIEVja2VsIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC9hOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjY/MTYzMzEwMzgwMiIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiAiQUxMIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogIlJ1YnkiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6ICI1LjIzMS4xMzguMjA4IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzEiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGNmMDI3NGIzOTRkYjNhZjU1NWRiYzEzNmZjNzBhYWI2ZTQ1YmVlNDIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNzoxODoyMyswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYnkiOiBudWxsLAogICAgICAgICAgICAic3RhdGUiOiAiQUNUSVZFIiwKICAgICAgICAgICAgInBvc3RfY291bnQiOiAxLAogICAgICAgICAgICAiaGFzX25vdGVzIjogdHJ1ZSwKICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICJoYXNfYXR0YWNobWVudHMiOiBmYWxzZSwKICAgICAgICAgICAgImlzX21lcmdlZCI6IGZhbHNlLAogICAgICAgICAgICAicmF0aW5nIjogbnVsbCwKICAgICAgICAgICAgInJhdGluZ19zdGF0dXMiOiAiT0ZGRVJFRCIsCiAgICAgICAgICAgICJ0YWdzIjogW10sCiAgICAgICAgICAgICJsYXN0X3Bvc3Rfc3RhdHVzIjogIiIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfcHJldmlldyI6ICJBIGV4YW1wbGUgZm9yIGEgY2xvc2VkIHRpY2tldC4iLAogICAgICAgICAgICAibGFzdF9wb3N0X3R5cGUiOiAiTk9URSIsCiAgICAgICAgICAgICJsYXN0X21lc3NhZ2VfcHJldmlldyI6ICJBIGV4YW1wbGUgZm9yIGEgY2xvc2VkIHRpY2tldC4iLAogICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX2Nhc2VzXzUiLAogICAgICAgICAgICAibGFzdF9hc3NpZ25lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGxpZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoyMDozMyswMDowMCIsCiAgICAgICAgICAgICJsYXN0X29wZW5lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3BlbmRpbmdfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYXQiOiAiMjAyMS0wOS0wMVQxMjoyNDozOSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X2NvbXBsZXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjIwOjQxKzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfYWdlbnRfYWN0aXZpdHlfYXQiOiAiMjAyMS0wOC0yN1QxMjoyMDo0MSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X2N1c3RvbWVyX2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfcmVwbHlfYnlfYWdlbnRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9yZXF1ZXN0ZXJfYXQiOiBudWxsLAogICAgICAgICAgICAiYWdlbnRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjIwOjQxKzAwOjAwIiwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiBudWxsLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjIwOjMzKzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOS0wMVQxMjoyNDozOSswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2UiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy81IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgInN1YmplY3QiOiAiSSBoYXZlIGEgcHJvYmxlbSB3aXRoIG15IG1hYyIsCiAgICAgICAgICAgICJwb3J0YWwiOiAiUFJJTUFSWSIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogIjhjOWI1NmJkLTEwYmQtNWM5MS05M2RhLTE5MDQxOTNlYWQ0ZSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJIRUxQQ0VOVEVSIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcHVibGljX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICI4YzliNTZiZC0xMGJkLTVjOTEtOTNkYS0xOTA0MTkzZWFkNGUiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiSEVMUENFTlRFUiIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogbnVsbCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1ZXN0ZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJ1dWlkIjogIjgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC84MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTI/MTYzMDA2NjczMyIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6ICJSRVFVRVNURUQiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV90d2l0dGVyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMyIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAZGQxMzJkZDkxOWQ4ZDAwM2MyYmNkMmUwMDZhOTEzM2E4NjY5ZDIwNCIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFzc2lnbmVkX3RlYW0iOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGhvcnN0ZW4gRWNrZWwiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0L2E4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNj8xNjMzMTAzODAyIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6ICJBTEwiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiAiUnVieSIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogIjUuMjMxLjEzOC4yMDgiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMSIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAY2YwMjc0YjM5NGRiM2FmNTU1ZGJjMTM2ZmM3MGFhYjZlNDViZWU0MiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA3OjE4OjIzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJicmFuZCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN0YXR1cyI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiUGVuZGluZyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJQRU5ESU5HIiwKICAgICAgICAgICAgICAgICJzb3J0X29yZGVyIjogMywKICAgICAgICAgICAgICAgICJpc19zbGFfYWN0aXZlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2Vfc3RhdHVzIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3N0YXR1c2VzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcmlvcml0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAibGFiZWwiOiAiSGlnaCIsCiAgICAgICAgICAgICAgICAibGV2ZWwiOiAzLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfcHJpb3JpdHkiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvY2FzZXMvcHJpb3JpdGllcy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidHlwZSI6IG51bGwsCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyZWFkX21hcmtlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNsYV92ZXJzaW9uIjogbnVsbCwKICAgICAgICAgICAgInNsYV9tZXRyaWNzIjogW10sCiAgICAgICAgICAgICJmb3JtIjogbnVsbCwKICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA5LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTQsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImxhc3RfcmVwbGllciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJhOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjYiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUaG9yc3RlbiBFY2tlbCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2PzE2MzMxMDM4MDIiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogIkFMTCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFtdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6ICJSdWJ5IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5faXAiOiAiNS4yMzEuMTM4LjIwOCIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18xIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBjZjAyNzRiMzk0ZGIzYWY1NTVkYmMxMzZmYzcwYWFiNmU0NWJlZTQyIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMDc6MTg6MjMrMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2xvZ2dlZF9pbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2J5IjogbnVsbCwKICAgICAgICAgICAgInN0YXRlIjogIkFDVElWRSIsCiAgICAgICAgICAgICJwb3N0X2NvdW50IjogMSwKICAgICAgICAgICAgImhhc19ub3RlcyI6IGZhbHNlLAogICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgImhhc19hdHRhY2htZW50cyI6IGZhbHNlLAogICAgICAgICAgICAiaXNfbWVyZ2VkIjogZmFsc2UsCiAgICAgICAgICAgICJyYXRpbmciOiBudWxsLAogICAgICAgICAgICAicmF0aW5nX3N0YXR1cyI6ICJVTk9GRkVSRUQiLAogICAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm1hYyIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGFnIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogImFwcGxlIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0YWciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJsYXN0X3Bvc3Rfc3RhdHVzIjogIlNFRU4iLAogICAgICAgICAgICAibGFzdF9wb3N0X3ByZXZpZXciOiAiQ2FuIHlvdSBoZWxwIG1lPyIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfdHlwZSI6ICJQVUJMSUMiLAogICAgICAgICAgICAibGFzdF9tZXNzYWdlX3ByZXZpZXciOiAiQ2FuIHlvdSBoZWxwIG1lPyIsCiAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfY2FzZXNfNCIsCiAgICAgICAgICAgICJsYXN0X2Fzc2lnbmVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTk6NTIrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBsaWVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9vcGVuZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9wZW5kaW5nX2F0IjogIjIwMjEtMDgtMjdUMTI6MTk6NTIrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jb21wbGV0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9hZ2VudF9hY3Rpdml0eV9hdCI6ICIyMDIxLTA4LTI3VDEyOjE5OjUyKzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfY3VzdG9tZXJfYWN0aXZpdHlfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICJsYXN0X3JlcGx5X2J5X2FnZW50X2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfcmVwbHlfYnlfcmVxdWVzdGVyX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAiYWdlbnRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE5OjUyKzAwOjAwIiwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiAiMjAyMS0wOC0yN1QxMjoxOTo1MiswMDowMCIsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE5OjUyKzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZSIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzLzQiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAic3ViamVjdCI6ICIgSG93IGRvIEkgcGxhY2UgYSBjdXN0b20gb3JkZXI/ICIsCiAgICAgICAgICAgICJwb3J0YWwiOiAiQVBJIiwKICAgICAgICAgICAgInNvdXJjZV9jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiY2YzY2QzOWEtNTRiZi01ZTVlLTkxMmItODgzOTE5ZjNhYjFlIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk5PVEUiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAibGFzdF9wdWJsaWNfY2hhbm5lbCI6IG51bGwsCiAgICAgICAgICAgICJyZXF1ZXN0ZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ1dWlkIjogImE4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNiIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRob3JzdGVuIEVja2VsIiwKICAgICAgICAgICAgICAgICJsZWdhY3lfaWQiOiBudWxsLAogICAgICAgICAgICAgICAgImRlc2lnbmF0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19lbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc19tZmFfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyb2xlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXZhdGFyL2dldC9hOGRmZTVmZC1iMDhkLTVkMDctYWQ4Yi03NGIxMTNmNWQ3MjY/MTYzMzEwMzgwMiIsCiAgICAgICAgICAgICAgICAiYWdlbnRfY2FzZV9hY2Nlc3MiOiAiQUxMIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiBudWxsLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm9yZ2FuaXphdGlvbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGVhbXMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ0ZWFtIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogW10sCiAgICAgICAgICAgICAgICAiZmFjZWJvb2siOiBbXSwKICAgICAgICAgICAgICAgICJleHRlcm5hbF9pZGVudGlmaWVycyI6IFtdLAogICAgICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICJwaW5uZWRfbm90ZXNfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImxvY2FsZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidGltZV96b25lIjogIlVUQyIsCiAgICAgICAgICAgICAgICAidGltZV96b25lX29mZnNldCI6IDAsCiAgICAgICAgICAgICAgICAiZ3JlZXRpbmciOiBudWxsLAogICAgICAgICAgICAgICAgInNpZ25hdHVyZSI6IG51bGwsCiAgICAgICAgICAgICAgICAic3RhdHVzX21lc3NhZ2UiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl91c2VyX2FnZW50IjogIlJ1YnkiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6ICI1LjIzMS4xMzguMjA4IiwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzEiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGNmMDI3NGIzOTRkYjNhZjU1NWRiYzEzNmZjNzBhYWI2ZTQ1YmVlNDIiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNzoxODoyMyswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogIjIwMjEtMTAtMDFUMTU6NTg6NTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjExKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMTAtMDFUMTU6NTY6NDIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS91c2Vycy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhc3NpZ25lZF9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICJhc3NpZ25lZF90ZWFtIjogbnVsbCwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiBudWxsLAogICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiYnJhbmQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdGF0dXMiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgImxhYmVsIjogIk5ldyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJORVciLAogICAgICAgICAgICAgICAgInNvcnRfb3JkZXIiOiAxLAogICAgICAgICAgICAgICAgImlzX3NsYV9hY3RpdmUiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX2RlbGV0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX3N0YXR1cyIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9zdGF0dXNlcy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicHJpb3JpdHkiOiBudWxsLAogICAgICAgICAgICAidHlwZSI6IG51bGwsCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IG51bGwsCiAgICAgICAgICAgICJzbGFfdmVyc2lvbiI6IG51bGwsCiAgICAgICAgICAgICJzbGFfbWV0cmljcyI6IFtdLAogICAgICAgICAgICAiZm9ybSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2Zvcm0iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogOSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDExLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE0LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJsYXN0X3JlcGxpZXIiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3JlcGxpZXJfaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3VwZGF0ZWRfYnkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYThkZmU1ZmQtYjA4ZC01ZDA3LWFkOGItNzRiMTEzZjVkNzI2IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGhvcnN0ZW4gRWNrZWwiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA1LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0L2E4ZGZlNWZkLWIwOGQtNWQwNy1hZDhiLTc0YjExM2Y1ZDcyNj8xNjMzMTAzODAyIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6ICJBTEwiLAogICAgICAgICAgICAgICAgIm9yZ2FuaXphdGlvbl9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInRlYW0iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJlbWFpbHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBob25lcyI6IFtdLAogICAgICAgICAgICAgICAgInR3aXR0ZXIiOiBbXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiAiUnVieSIsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogIjUuMjMxLjEzOC4yMDgiLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2ZV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU2OjQyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZWFsdGltZV9jaGFubmVsIjogInByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAdjFfdXNlcnNfMSIsCiAgICAgICAgICAgICAgICAicHJlc2VuY2VfY2hhbm5lbCI6ICJ1c2VyX3ByZXNlbmNlLTQ0MjU0M2NkNDIyODc3NTA0MDAxZWIwNTUwZjE4OWFkMzYyZDY0NzVmYTZkOTVmZDBmMmQ4ZWUwZmY3NzBmNjVAY2YwMjc0YjM5NGRiM2FmNTU1ZGJjMTM2ZmM3MGFhYjZlNDViZWU0MiIsCiAgICAgICAgICAgICAgICAicGFzc3dvcmRfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA3OjE4OjIzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJhdmF0YXJfdXBkYXRlZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiAiMjAyMS0xMC0wMVQxNTo1ODo1MiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3Rpdml0eV9hdCI6ICIyMDIxLTEwLTAxVDE1OjU4OjUyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0xMC0wMVQxNTo1Njo0MiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X2NvbXBsZXRlZF9ieSI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X2Nsb3NlZF9ieSI6IG51bGwsCiAgICAgICAgICAgICJzdGF0ZSI6ICJBQ1RJVkUiLAogICAgICAgICAgICAicG9zdF9jb3VudCI6IDEsCiAgICAgICAgICAgICJoYXNfbm90ZXMiOiB0cnVlLAogICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgImhhc19hdHRhY2htZW50cyI6IGZhbHNlLAogICAgICAgICAgICAiaXNfbWVyZ2VkIjogZmFsc2UsCiAgICAgICAgICAgICJyYXRpbmciOiBudWxsLAogICAgICAgICAgICAicmF0aW5nX3N0YXR1cyI6ICJVTk9GRkVSRUQiLAogICAgICAgICAgICAidGFncyI6IFtdLAogICAgICAgICAgICAibGFzdF9wb3N0X3N0YXR1cyI6ICIiLAogICAgICAgICAgICAibGFzdF9wb3N0X3ByZXZpZXciOiAiSSB3YW50IHRvIHB1cmNoYXNlIGFuIGFzc29ydGVkIHNldCBvZiByZXRhaWwgZXF1aXBtZW50LiBJ4oCZbSBub3QgYWJsZSB0byBidWlsZCBteSBidW5kbGUuIENhbiB5b3UgaGVscCBtZSB3aXRoIHRoaXMgcHVyY2hhc2U/IExvb2tpbmcgZm9yd2FyZCB0byBtb3JlIGluZm9ybWF0aW9uISIsCiAgICAgICAgICAgICJsYXN0X3Bvc3RfdHlwZSI6ICJOT1RFIiwKICAgICAgICAgICAgImxhc3RfbWVzc2FnZV9wcmV2aWV3IjogIkkgd2FudCB0byBwdXJjaGFzZSBhbiBhc3NvcnRlZCBzZXQgb2YgcmV0YWlsIGVxdWlwbWVudC4gSeKAmW0gbm90IGFibGUgdG8gYnVpbGQgbXkgYnVuZGxlLiBDYW4geW91IGhlbHAgbWUgd2l0aCB0aGlzIHB1cmNoYXNlPyBMb29raW5nIGZvcndhcmQgdG8gbW9yZSBpbmZvcm1hdGlvbiEiLAogICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX2Nhc2VzXzIiLAogICAgICAgICAgICAibGFzdF9hc3NpZ25lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGxpZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0NTo1MSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X29wZW5lZF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3BlbmRpbmdfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jbG9zZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9jb21wbGV0ZWRfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9hZ2VudF9hY3Rpdml0eV9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfY3VzdG9tZXJfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9hZ2VudF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGx5X2J5X3JlcXVlc3Rlcl9hdCI6IG51bGwsCiAgICAgICAgICAgICJhZ2VudF91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiBudWxsLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMDo0NTo1MSswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2UiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8yIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgInN1YmplY3QiOiAiR2V0dGluZyBjb21mb3J0YWJsZSB3aXRoIEtheWFrbzogYSBzYW1wbGUgY29udmVyc2F0aW9uIiwKICAgICAgICAgICAgInBvcnRhbCI6ICJTRVRVUCIsCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsYXN0X3B1YmxpY19jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk1BSUwiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm1haWxib3giCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVlc3RlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImxlZ2FjeV9pZCI6IG51bGwsCiAgICAgICAgICAgICAgICAiZGVzaWduYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX21mYV9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInJvbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF2YXRhciI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hdmF0YXIvZ2V0LzgxZDhhMzJjLWRlMDctNWVkNi1iOTJmLWVmNDI2NTAyOTlhMj8xNjMwMDY2NzMzIiwKICAgICAgICAgICAgICAgICJhZ2VudF9jYXNlX2FjY2VzcyI6IG51bGwsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uX2Nhc2VfYWNjZXNzIjogIlJFUVVFU1RFRCIsCiAgICAgICAgICAgICAgICAib3JnYW5pemF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAib3JnYW5pemF0aW9uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0ZWFtcyI6IFtdLAogICAgICAgICAgICAgICAgImVtYWlscyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicGhvbmVzIjogW10sCiAgICAgICAgICAgICAgICAidHdpdHRlciI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmYWNlYm9vayI6IFtdLAogICAgICAgICAgICAgICAgImV4dGVybmFsX2lkZW50aWZpZXJzIjogW10sCiAgICAgICAgICAgICAgICAiY3VzdG9tX2ZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgInBpbm5lZF9ub3Rlc19jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibG9jYWxlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmUiOiAiVVRDIiwKICAgICAgICAgICAgICAgICJ0aW1lX3pvbmVfb2Zmc2V0IjogMCwKICAgICAgICAgICAgICAgICJncmVldGluZyI6IG51bGwsCiAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogbnVsbCwKICAgICAgICAgICAgICAgICJzdGF0dXNfbWVzc2FnZSI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX3VzZXJfYWdlbnQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3Rfc2Vlbl9pcCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZlX2F0IjogIjIwMjEtMDgtMjdUMTI6MTg6NTMrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV91c2Vyc18zIiwKICAgICAgICAgICAgICAgICJwcmVzZW5jZV9jaGFubmVsIjogInVzZXJfcHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUBkZDEzMmRkOTE5ZDhkMDAzYzJiY2QyZTAwNmE5MTMzYTg2NjlkMjA0IiwKICAgICAgICAgICAgICAgICJwYXNzd29yZF91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgImF2YXRhcl91cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgImxhc3RfbG9nZ2VkX2luX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X2FjdGl2aXR5X2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL3VzZXJzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFzc2lnbmVkX2FnZW50IjogbnVsbCwKICAgICAgICAgICAgImFzc2lnbmVkX3RlYW0iOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidGVhbSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYnkiOiBudWxsLAogICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiYnJhbmQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdGF0dXMiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgImxhYmVsIjogIk9wZW4iLAogICAgICAgICAgICAgICAgInR5cGUiOiAiT1BFTiIsCiAgICAgICAgICAgICAgICAic29ydF9vcmRlciI6IDIsCiAgICAgICAgICAgICAgICAiaXNfc2xhX2FjdGl2ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxNiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2Vfc3RhdHVzIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3N0YXR1c2VzLzIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcmlvcml0eSI6IG51bGwsCiAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJsYWJlbCI6ICJRdWVzdGlvbiIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJRVUVTVElPTiIsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTYrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV90eXBlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3R5cGVzLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZWFkX21hcmtlciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJyZWFkX21hcmtlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNsYV92ZXJzaW9uIjogbnVsbCwKICAgICAgICAgICAgInNsYV9tZXRyaWNzIjogW10sCiAgICAgICAgICAgICJmb3JtIjogbnVsbCwKICAgICAgICAgICAgImN1c3RvbV9maWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiA5LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTQsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGRfdmFsdWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJmaWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkX3ZhbHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZmllbGQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjYXNlX2ZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9maWVsZF92YWx1ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImxhc3RfcmVwbGllciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfcmVwbGllcl9pZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfdXBkYXRlZF9ieSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI4MWQ4YTMyYy1kZTA3LTVlZDYtYjkyZi1lZjQyNjUwMjk5YTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAibGVnYWN5X2lkIjogbnVsbCwKICAgICAgICAgICAgICAgICJkZXNpZ25hdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbWZhX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicm9sZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2F2YXRhci9nZXQvODFkOGEzMmMtZGUwNy01ZWQ2LWI5MmYtZWY0MjY1MDI5OWEyPzE2MzAwNjY3MzMiLAogICAgICAgICAgICAgICAgImFnZW50X2Nhc2VfYWNjZXNzIjogbnVsbCwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb25fY2FzZV9hY2Nlc3MiOiAiUkVRVUVTVEVEIiwKICAgICAgICAgICAgICAgICJvcmdhbml6YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJvcmdhbml6YXRpb24iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRlYW1zIjogW10sCiAgICAgICAgICAgICAgICAiZW1haWxzIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwaG9uZXMiOiBbXSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImZhY2Vib29rIjogW10sCiAgICAgICAgICAgICAgICAiZXh0ZXJuYWxfaWRlbnRpZmllcnMiOiBbXSwKICAgICAgICAgICAgICAgICJjdXN0b21fZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJsb2NhbGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWVfem9uZSI6ICJVVEMiLAogICAgICAgICAgICAgICAgInRpbWVfem9uZV9vZmZzZXQiOiAwLAogICAgICAgICAgICAgICAgImdyZWV0aW5nIjogbnVsbCwKICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBudWxsLAogICAgICAgICAgICAgICAgInN0YXR1c19tZXNzYWdlIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fdXNlcl9hZ2VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAibGFzdF9zZWVuX2lwIjogbnVsbCwKICAgICAgICAgICAgICAgICJsYXN0X3NlZW5fYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9hY3RpdmVfYXQiOiAiMjAyMS0wOC0yN1QxMjoxODo1MyswMDowMCIsCiAgICAgICAgICAgICAgICAicmVhbHRpbWVfY2hhbm5lbCI6ICJwcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QHYxX3VzZXJzXzMiLAogICAgICAgICAgICAgICAgInByZXNlbmNlX2NoYW5uZWwiOiAidXNlcl9wcmVzZW5jZS00NDI1NDNjZDQyMjg3NzUwNDAwMWViMDU1MGYxODlhZDM2MmQ2NDc1ZmE2ZDk1ZmQwZjJkOGVlMGZmNzcwZjY1QGRkMTMyZGQ5MTlkOGQwMDNjMmJjZDJlMDA2YTkxMzNhODY2OWQyMDQiLAogICAgICAgICAgICAgICAgInBhc3N3b3JkX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAiYXZhdGFyX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAibGFzdF9sb2dnZWRfaW5fYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImxhc3RfYWN0aXZpdHlfYXQiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEyOjE4OjUzKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdXNlcnMvMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2J5IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2J5IjogbnVsbCwKICAgICAgICAgICAgInN0YXRlIjogIkFDVElWRSIsCiAgICAgICAgICAgICJwb3N0X2NvdW50IjogOCwKICAgICAgICAgICAgImhhc19ub3RlcyI6IGZhbHNlLAogICAgICAgICAgICAicGlubmVkX25vdGVzX2NvdW50IjogMCwKICAgICAgICAgICAgImhhc19hdHRhY2htZW50cyI6IGZhbHNlLAogICAgICAgICAgICAiaXNfbWVyZ2VkIjogZmFsc2UsCiAgICAgICAgICAgICJyYXRpbmciOiBudWxsLAogICAgICAgICAgICAicmF0aW5nX3N0YXR1cyI6ICJVTk9GRkVSRUQiLAogICAgICAgICAgICAidGFncyI6IFtdLAogICAgICAgICAgICAibGFzdF9wb3N0X3N0YXR1cyI6ICJERUxJVkVSRUQiLAogICAgICAgICAgICAibGFzdF9wb3N0X3ByZXZpZXciOiAiV0hBVD8hIFRoYW5rIHlvdSB2ZXJ5IG11Y2ghIPCfmI0iLAogICAgICAgICAgICAibGFzdF9wb3N0X3R5cGUiOiAiUFVCTElDIiwKICAgICAgICAgICAgImxhc3RfbWVzc2FnZV9wcmV2aWV3IjogIldIQVQ/ISBUaGFuayB5b3UgdmVyeSBtdWNoISDwn5iNIiwKICAgICAgICAgICAgInJlYWx0aW1lX2NoYW5uZWwiOiAicHJlc2VuY2UtNDQyNTQzY2Q0MjI4Nzc1MDQwMDFlYjA1NTBmMTg5YWQzNjJkNjQ3NWZhNmQ5NWZkMGYyZDhlZTBmZjc3MGY2NUB2MV9jYXNlc18xIiwKICAgICAgICAgICAgImxhc3RfYXNzaWduZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozOSswMDowMCIsCiAgICAgICAgICAgICJsYXN0X3JlcGxpZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NCswMDowMCIsCiAgICAgICAgICAgICJsYXN0X29wZW5lZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM5KzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfcGVuZGluZ19hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjI4KzAwOjAwIiwKICAgICAgICAgICAgImxhc3RfY2xvc2VkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhc3RfY29tcGxldGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MzgrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9hZ2VudF9hY3Rpdml0eV9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X2N1c3RvbWVyX2FjdGl2aXR5X2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MjMrMDA6MDAiLAogICAgICAgICAgICAibGFzdF9yZXBseV9ieV9hZ2VudF9hdCI6IG51bGwsCiAgICAgICAgICAgICJsYXN0X3JlcGx5X2J5X3JlcXVlc3Rlcl9hdCI6IG51bGwsCiAgICAgICAgICAgICJhZ2VudF91cGRhdGVkX2F0IjogbnVsbCwKICAgICAgICAgICAgImxhdGVzdF9hc3NpZ25lZV91cGRhdGUiOiBudWxsLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM2KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozMSswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2UiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8xIgogICAgICAgIH0KICAgIF0sCiAgICAicmVzb3VyY2UiOiAiY2FzZSIsCiAgICAib2Zmc2V0IjogMCwKICAgICJsaW1pdCI6IDEwMCwKICAgICJ0b3RhbF9jb3VudCI6IDUKfQ==
+ recorded_at: Fri, 01 Oct 2021 15:58:57 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases/3/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:58 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:58+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 36,
+ "uuid": "db6befb5-24a7-43ee-afc4-4b4deb94ea55",
+ "client_id": "232d1622-4667-431d-9a97-7cd028bbb419",
+ "subject": "We will help the guy.\n",
+ "contents": "We will help the guy.\n",
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "identity": {
+ "id": 1,
+ "email": "",
+ "is_primary": true,
+ "is_validated": true,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-27T06:57:08+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/1"
+ },
+ "source_channel": {
+ "uuid": "cf3cd39a-54bf-5e5e-912b-883919f3ab1e",
+ "type": "NOTE",
+ "character_limit": null,
+ "account": null,
+ "resource_type": "channel"
+ },
+ "attachments": [
+ {
+ "id": 1,
+ "name": "favicon.ico",
+ "size": 32988,
+ "width": 0,
+ "height": 0,
+ "type": "image/x-icon",
+ "content_id": null,
+ "alt": null,
+ "url": "https:///api/v1/cases/3/notes/3/attachments/1/url",
+ "url_download": "https:///api/v1/cases/3/notes/3/attachments/1/download",
+ "thumbnails": [],
+ "created_at": "2021-08-27T11:26:26+00:00",
+ "resource_type": "attachment",
+ "resource_url": "https:///api/v1/cases/3/notes/3/attachments/1"
+ }
+ ],
+ "download_all": "https:///api/v1/cases/3/notes/3/attachments/download/all",
+ "destination_medium": null,
+ "source": null,
+ "metadata": {
+ "user_agent": "",
+ "page_url": ""
+ },
+ "original": {
+ "id": 3,
+ "body_text": "We will help the guy.\n",
+ "body_html": "We will help the guy.
",
+ "is_pinned": false,
+ "pinned_by": null,
+ "user": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "attachments": [
+ {
+ "id": 1,
+ "name": "favicon.ico",
+ "size": 32988,
+ "width": 0,
+ "height": 0,
+ "type": "image/x-icon",
+ "content_id": null,
+ "alt": null,
+ "url": "https:///api/v1/cases/3/notes/3/attachments/1/url",
+ "url_download": "https:///api/v1/cases/3/notes/3/attachments/1/download",
+ "thumbnails": [],
+ "created_at": "2021-08-27T11:26:26+00:00",
+ "resource_type": "attachment",
+ "resource_url": "https:///api/v1/cases/3/notes/3/attachments/1"
+ }
+ ],
+ "download_all": "https:///api/v1/cases/3/notes/3/attachments/download/all",
+ "created_at": "2021-08-27T11:26:26+00:00",
+ "updated_at": "2021-08-27T11:26:26+00:00",
+ "resource_type": "note",
+ "resource_url": "https:///api/v1/cases/3/notes/3"
+ },
+ "post_status": "DELIVERED",
+ "post_status_reject_type": null,
+ "post_status_reject_reason": null,
+ "post_status_updated_at": "2021-08-27T11:26:26+00:00",
+ "is_requester": false,
+ "created_at": "2021-08-27T11:26:26+00:00",
+ "updated_at": "2021-08-27T11:26:26+00:00",
+ "resource_type": "post",
+ "resource_url": "https:///api/v1/cases/posts/36"
+ },
+ {
+ "id": 35,
+ "uuid": "318284f1-a910-416f-b51a-8de586a505a2",
+ "client_id": "",
+ "subject": "A test question",
+ "contents": "Hello together,\n\ncan you help me?\n\nBest regards,\nDominik",
+ "creator": {
+ "id": 7,
+ "resource_type": "user"
+ },
+ "identity": {
+ "id": 7,
+ "email": "dominik.klein.morsbach@gmail.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-27T10:49:56+00:00",
+ "updated_at": "2021-08-27T10:49:56+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/7"
+ },
+ "source_channel": {
+ "uuid": "fd3a8116-95c2-492e-9af3-b3ab57dc9f1a",
+ "type": "MAIL",
+ "character_limit": null,
+ "account": {
+ "id": 1,
+ "uuid": "fd3a8116-95c2-492e-9af3-b3ab57dc9f1a",
+ "address": "support@",
+ "brand": {
+ "id": 1,
+ "resource_type": "brand"
+ },
+ "is_system": true,
+ "is_custom": false,
+ "is_verified": false,
+ "is_default": true,
+ "is_enabled": false,
+ "is_deleted": false,
+ "verified_at": null,
+ "created_at": "2021-08-24T18:24:18+00:00",
+ "updated_at": "2021-08-27T06:57:08+00:00",
+ "resource_type": "mailbox",
+ "resource_url": "https:///api/v1/mailboxes/1"
+ },
+ "resource_type": "channel"
+ },
+ "attachments": [],
+ "download_all": null,
+ "destination_medium": null,
+ "source": null,
+ "metadata": {
+ "user_agent": "",
+ "page_url": ""
+ },
+ "original": {
+ "id": 4,
+ "uuid": "318284f1-a910-416f-b51a-8de586a505a2",
+ "subject": "A test question",
+ "body_text": "Hello together,\n\ncan you help me?\n\nBest regards,\nDominik",
+ "body_html": "\n Hello together,\n
\n
\n
\n
\n can you help me?\n
\n
\n
\n
\n
\n Best regards,\n
\n
\n Dominik\n
\n
",
+ "recipients": [],
+ "fullname": "Dominik Klein",
+ "email": "dominik.klein.morsbach@gmail.com",
+ "creator": {
+ "id": 7,
+ "resource_type": "user"
+ },
+ "identity": {
+ "id": 7,
+ "email": "dominik.klein.morsbach@gmail.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-27T10:49:56+00:00",
+ "updated_at": "2021-08-27T10:49:56+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/7"
+ },
+ "mailbox": {
+ "id": 1,
+ "uuid": "fd3a8116-95c2-492e-9af3-b3ab57dc9f1a",
+ "address": "support@",
+ "brand": {
+ "id": 1,
+ "resource_type": "brand"
+ },
+ "is_system": true,
+ "is_custom": false,
+ "is_verified": false,
+ "is_default": true,
+ "is_enabled": false,
+ "is_deleted": false,
+ "verified_at": null,
+ "created_at": "2021-08-24T18:24:18+00:00",
+ "updated_at": "2021-08-27T06:57:08+00:00",
+ "resource_type": "mailbox",
+ "resource_url": "https:///api/v1/mailboxes/1"
+ },
+ "attachments": [],
+ "download_all": null,
+ "locale": null,
+ "response_time": 0,
+ "created_at": "2021-08-27T10:49:56+00:00",
+ "updated_at": "2021-08-27T10:49:56+00:00",
+ "resource_type": "case_message",
+ "resource_url": "https:///api/v1/cases/3/messages/4"
+ },
+ "post_status": "SEEN",
+ "post_status_reject_type": null,
+ "post_status_reject_reason": null,
+ "post_status_updated_at": "2021-08-27T11:26:26+00:00",
+ "is_requester": true,
+ "created_at": "2021-08-27T10:49:56+00:00",
+ "updated_at": "2021-08-27T11:26:26+00:00",
+ "resource_type": "post",
+ "resource_url": "https:///api/v1/cases/posts/35"
+ }
+ ],
+ "resource": "post",
+ "limit": 100,
+ "total_count": 2
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:58 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases/3/notes/3/attachments/1/download
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:58 GMT
+ Content-Type:
+ - image/x-icon
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Content-Transfer-Encoding:
+ - binary
+ Content-Disposition:
+ - attachment; filename="favicon.ico"
+ Date-Iso:
+ - '2021-10-01T15:58:58+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEAIAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu0f8WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJM7/FS/Q/YIv0P9hGsz/CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BLtH/eSzQ/Osv0P2RK87/KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu0f89LND85DDR//8vzvzCLc//Wiuq/wYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbM/xQv0P63MNH//zDR//8s0PzrLtH9iizM/yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AS/Q/3gt0Pz7MNH//zDR//8vzvz+L9D+ui/Q/1IAv/8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL9D/PCzQ/OQw0f//MNH//zDR//8w0f//LdD85S/Q/YIsyv8dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMihAGrJogD/yaIA/8miAP/IngDGyJ4AKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMegAE7InwD8yaIA/8igAPPHoQBtgIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMeeADfGoQD1yaIA/8miALfFnAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMacACTJoQDqxp4A7MihAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+ZABTIoADbyKEApsKeABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaOAAnGoQCryaAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIoABGxJ0ADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMz/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv0P8mLtH/dC/Q/ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtw/8RL87+sjDP/MEv0P9XAMz/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BL9D/dy3Q/PwvzvzoL9D9gyzK/x0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AP/GogDs39+ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAgAAAAAAAAAAAAAAAMihAIrJogD/xqEAq8WXABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHogBoyKAA6MigAFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx6EAScefAKDGnAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+ZABTGogA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ recorded_at: Fri, 01 Oct 2021 15:58:59 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases/5/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:58:59 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:58:59+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 50,
+ "uuid": "4f92e9a2-9662-4fc2-b2e3-b23869f1191b",
+ "client_id": "",
+ "subject": "A example for a closed ticket.\n",
+ "contents": "A example for a closed ticket.\n",
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "identity": {
+ "id": 1,
+ "email": "",
+ "is_primary": true,
+ "is_validated": true,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-08-27T06:57:08+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/1"
+ },
+ "source_channel": {
+ "uuid": "cf3cd39a-54bf-5e5e-912b-883919f3ab1e",
+ "type": "NOTE",
+ "character_limit": null,
+ "account": null,
+ "resource_type": "channel"
+ },
+ "attachments": [],
+ "download_all": null,
+ "destination_medium": null,
+ "source": null,
+ "metadata": {
+ "user_agent": "",
+ "page_url": ""
+ },
+ "original": {
+ "id": 4,
+ "body_text": "A example for a closed ticket.\n",
+ "body_html": "A example for a closed ticket.
",
+ "is_pinned": false,
+ "pinned_by": null,
+ "user": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "attachments": [],
+ "download_all": null,
+ "created_at": "2021-08-27T12:20:33+00:00",
+ "updated_at": "2021-08-27T12:20:33+00:00",
+ "resource_type": "note",
+ "resource_url": "https:///api/v1/cases/5/notes/4"
+ },
+ "post_status": "DELIVERED",
+ "post_status_reject_type": null,
+ "post_status_reject_reason": null,
+ "post_status_updated_at": "2021-08-27T12:20:33+00:00",
+ "is_requester": false,
+ "created_at": "2021-08-27T12:20:33+00:00",
+ "updated_at": "2021-08-27T12:20:33+00:00",
+ "resource_type": "post",
+ "resource_url": "https:///api/v1/cases/posts/50"
+ }
+ ],
+ "resource": "post",
+ "limit": 100,
+ "total_count": 1
+ }
+ recorded_at: Fri, 01 Oct 2021 15:58:59 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases/4/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:59:00 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:59:00+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 48,
+ "uuid": "e959e7e9-f1db-4e5e-b7b6-fd4ea224d87a",
+ "client_id": "",
+ "subject": "I have a problem with my mac",
+ "contents": "Can you help me?",
+ "creator": {
+ "id": 3,
+ "resource_type": "user"
+ },
+ "identity": {
+ "id": 3,
+ "email": "rainbowcitycafe@gmail.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-08-24T18:24:12+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/3"
+ },
+ "source_channel": {
+ "uuid": "8c9b56bd-10bd-5c91-93da-1904193ead4e",
+ "type": "HELPCENTER",
+ "character_limit": null,
+ "account": null,
+ "resource_type": "channel"
+ },
+ "attachments": [],
+ "download_all": null,
+ "destination_medium": null,
+ "source": "HELPCENTER",
+ "metadata": {
+ "user_agent": "",
+ "page_url": ""
+ },
+ "original": {
+ "id": 5,
+ "uuid": "e959e7e9-f1db-4e5e-b7b6-fd4ea224d87a",
+ "subject": "I have a problem with my mac",
+ "body_text": "Can you help me?",
+ "body_html": "Can you help me?",
+ "recipients": [],
+ "fullname": "Taylor West",
+ "email": "rainbowcitycafe@gmail.com",
+ "creator": {
+ "id": 3,
+ "resource_type": "user"
+ },
+ "identity": {
+ "id": 3,
+ "email": "rainbowcitycafe@gmail.com",
+ "is_primary": true,
+ "is_validated": false,
+ "is_notification_enabled": false,
+ "created_at": "2021-08-24T18:24:12+00:00",
+ "updated_at": "2021-08-24T18:24:12+00:00",
+ "resource_type": "identity_email",
+ "resource_url": "https:///api/v1/identities/emails/3"
+ },
+ "mailbox": null,
+ "attachments": [],
+ "download_all": null,
+ "locale": null,
+ "response_time": 0,
+ "created_at": "2021-08-27T12:18:53+00:00",
+ "updated_at": "2021-08-27T12:18:53+00:00",
+ "resource_type": "case_message",
+ "resource_url": "https:///api/v1/cases/4/messages/5"
+ },
+ "post_status": "SEEN",
+ "post_status_reject_type": null,
+ "post_status_reject_reason": null,
+ "post_status_updated_at": "2021-08-27T12:19:53+00:00",
+ "is_requester": true,
+ "created_at": "2021-08-27T12:18:53+00:00",
+ "updated_at": "2021-08-27T12:19:53+00:00",
+ "resource_type": "post",
+ "resource_url": "https:///api/v1/cases/posts/48"
+ }
+ ],
+ "resource": "post",
+ "limit": 100,
+ "total_count": 1
+ }
+ recorded_at: Fri, 01 Oct 2021 15:59:00 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases/2/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:59:00 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:59:00+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ ewogICAgInN0YXR1cyI6IDIwMCwKICAgICJkYXRhIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMzQsCiAgICAgICAgICAgICJ1dWlkIjogIjRhZWQxOWYxLTkyYTAtNGNkNC04YzhlLTE2NWViMWUwMWE2OCIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiSSB3YW50IHRvIHB1cmNoYXNlIGFuIGFzc29ydGVkIHNldCBvZiByZXRhaWwgZXF1aXBtZW50LiBJ4oCZbSBub3QgYWJsZSB0byBidWlsZCBteSBidW5kbGUuIENhbiB5b3UgaGVscCBtZSB3aXRoIHRoaXMgcHVyY2hhc2U/IExvb2tpbmcgZm9yd2FyZCB0byBtb3JlIGluZm9ybWF0aW9uISIsCiAgICAgICAgICAgICJjb250ZW50cyI6ICJJIHdhbnQgdG8gcHVyY2hhc2UgYW4gYXNzb3J0ZWQgc2V0IG9mIHJldGFpbCBlcXVpcG1lbnQuIEnigJltIG5vdCBhYmxlIHRvIGJ1aWxkIG15IGJ1bmRsZS4gQ2FuIHlvdSBoZWxwIG1lIHdpdGggdGhpcyBwdXJjaGFzZT8gTG9va2luZyBmb3J3YXJkIHRvIG1vcmUgaW5mb3JtYXRpb24hIiwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImlkZW50aXR5IjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJlbWFpbCI6ICI8SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9VU0VSTkFNRT4iLAogICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfbm90aWZpY2F0aW9uX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTErMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICJjZjNjZDM5YS01NGJmLTVlNWUtOTEyYi04ODM5MTlmM2FiMWUiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiTk9URSIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogbnVsbCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogbnVsbCwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgImRlc3RpbmF0aW9uX21lZGl1bSI6IG51bGwsCiAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAogICAgICAgICAgICAibWV0YWRhdGEiOiB7CiAgICAgICAgICAgICAgICAidXNlcl9hZ2VudCI6ICIiLAogICAgICAgICAgICAgICAgInBhZ2VfdXJsIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yaWdpbmFsIjogewogICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICJib2R5X3RleHQiOiAiSSB3YW50IHRvIHB1cmNoYXNlIGFuIGFzc29ydGVkIHNldCBvZiByZXRhaWwgZXF1aXBtZW50LiBJ4oCZbSBub3QgYWJsZSB0byBidWlsZCBteSBidW5kbGUuIENhbiB5b3UgaGVscCBtZSB3aXRoIHRoaXMgcHVyY2hhc2U/IExvb2tpbmcgZm9yd2FyZCB0byBtb3JlIGluZm9ybWF0aW9uISIsCiAgICAgICAgICAgICAgICAiYm9keV9odG1sIjogIkkgd2FudCB0byBwdXJjaGFzZSBhbiBhc3NvcnRlZCBzZXQgb2YgcmV0YWlsIGVxdWlwbWVudC4gSeKAmW0gbm90IGFibGUgdG8gYnVpbGQgbXkgYnVuZGxlLiBDYW4geW91IGhlbHAgbWUgd2l0aCB0aGlzIHB1cmNoYXNlPyBMb29raW5nIGZvcndhcmQgdG8gbW9yZSBpbmZvcm1hdGlvbiEiLAogICAgICAgICAgICAgICAgImlzX3Bpbm5lZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgInBpbm5lZF9ieSI6IG51bGwsCiAgICAgICAgICAgICAgICAidXNlciI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDU6NTErMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibm90ZSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8yL25vdGVzLzIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwb3N0X3N0YXR1cyI6ICJERUxJVkVSRUQiLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3R5cGUiOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3JlYXNvbiI6IG51bGwsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c191cGRhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDU6NTErMDA6MDAiLAogICAgICAgICAgICAiaXNfcmVxdWVzdGVyIjogZmFsc2UsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjdUMTA6NDU6NTErMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDEwOjQ1OjUxKzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzM0IgogICAgICAgIH0KICAgIF0sCiAgICAicmVzb3VyY2UiOiAicG9zdCIsCiAgICAibGltaXQiOiAxMDAsCiAgICAidG90YWxfY291bnQiOiAxCn0=
+ recorded_at: Fri, 01 Oct 2021 15:59:00 GMT
+- request:
+ method: get
+ uri: https:///api/v1/cases/1/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:59:01 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:59:01+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ ewogICAgInN0YXR1cyI6IDIwMCwKICAgICJkYXRhIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMjEsCiAgICAgICAgICAgICJ1dWlkIjogIjYwZGQxMjU3LTNlNTEtNDM3YS1iMjgyLTFlYjZmOWY4OGZkNCIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiV0hBVD8hIFRoYW5rIHlvdSB2ZXJ5IG11Y2ghIPCfmI0iLAogICAgICAgICAgICAiY29udGVudHMiOiAiV0hBVD8hIFRoYW5rIHlvdSB2ZXJ5IG11Y2ghIPCfmI0iLAogICAgICAgICAgICAiY3JlYXRvciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgInR3aXR0ZXJfaWQiOiAiODU0MjUwNjIzOTI3MjM3MTIiLAogICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVGF5bG9yV2VzdFJuYnciLAogICAgICAgICAgICAgICAgImZvbGxvd2VyX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhdGlvbiI6IG51bGwsCiAgICAgICAgICAgICAgICAicHJvZmlsZV9pbWFnZV91cmwiOiBudWxsLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM0KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MzQrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL3R3aXR0ZXIvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXJjZV9jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiYzIwYWZhYjItYzFiMS00YzkyLTg3NDQtYWIzNDI2YmFmZDI3IiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIlRXSVRURVIiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IDI2NCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6ICI4NTQyNTA2MjM5MjcyMzcxMiIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidHdpdHRlcl9hY2NvdW50IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgImRlc3RpbmF0aW9uX21lZGl1bSI6IG51bGwsCiAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAogICAgICAgICAgICAibWV0YWRhdGEiOiB7CiAgICAgICAgICAgICAgICAidXNlcl9hZ2VudCI6ICIiLAogICAgICAgICAgICAgICAgInBhZ2VfdXJsIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yaWdpbmFsIjogewogICAgICAgICAgICAgICAgImlkIjogIjg3NzUwNDQ1MDIwMTYxMjI4OCIsCiAgICAgICAgICAgICAgICAidXVpZCI6ICI2MGRkMTI1Ny0zZTUxLTQzN2EtYjI4Mi0xZWI2ZjlmODhmZDQiLAogICAgICAgICAgICAgICAgInNjcmVlbl9uYW1lIjogIlRheWxvcldlc3RSbmJ3IiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgImNvbnRlbnRzIjogIldIQVQ/ISBUaGFuayB5b3UgdmVyeSBtdWNoISDwn5iNIiwKICAgICAgICAgICAgICAgICJyZXR3ZWV0X2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJmYXZvcml0ZV9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiaW5fcmVwbHlfdG9fdHdlZXQiOiBudWxsLAogICAgICAgICAgICAgICAgImluX3JlcGx5X3RvX2lkZW50aXR5IjogbnVsbCwKICAgICAgICAgICAgICAgICJtZWRpYSI6IFtdLAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyX2lkIjogIjg1NDI1MDYyMzkyNzIzNzEyIiwKICAgICAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVGF5bG9yV2VzdFJuYnciLAogICAgICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0OSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ5KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfdHdlZXQiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdHdpdHRlci90d2VldHMvODc3NTA0NDUwMjAxNjEyMjg4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM4KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDkrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ5KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzIxIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAyMCwKICAgICAgICAgICAgInV1aWQiOiAiZWM5NDgxNWYtMGI4My00OWZlLWFhMTItNmZjZTUzZDc2YjNiIiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJObyBwcm9iISBCVFcgLSBjb25ncmF0cyBvbiB5b3VyIDF5ciBhbm5pdmVyc2FyeSB3aXRoIHVzLiBFbmpveSBmcmVlIG5leHQgZGF5IHNoaXBwaW5nIG9uIHlvdXIgcHVyY2hhc2UgdG9kYXkhIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIk5vIHByb2IhIEJUVyAtIGNvbmdyYXRzIG9uIHlvdXIgMXlyIGFubml2ZXJzYXJ5IHdpdGggdXMuIEVuam95IGZyZWUgbmV4dCBkYXkgc2hpcHBpbmcgb24geW91ciBwdXJjaGFzZSB0b2RheSEiLAogICAgICAgICAgICAiY3JlYXRvciI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICAgInR3aXR0ZXJfaWQiOiAiNzM4MTYwMjgxMjM1MjkyMTYwIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVG9iaWFzIiwKICAgICAgICAgICAgICAgICJzY3JlZW5fbmFtZSI6ICJUb2J5QnJld2ZpY3R1cyIsCiAgICAgICAgICAgICAgICAiZm9sbG93ZXJfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJ1cmwiOiBudWxsLAogICAgICAgICAgICAgICAgImxvY2F0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAibG9jYWxlIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc192YWxpZGF0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MzUrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNSswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV90d2l0dGVyIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvdHdpdHRlci8yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICIxMjdlNjllNy1jZWZkLTQ2YTAtYWFkMy02M2U4NTc1YTRlZWYiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiVFdJVFRFUiIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogMjY0LAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogIjczODE2MDI4MTIzNTI5MjE2MCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidHdpdHRlcl9hY2NvdW50IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNoYW5uZWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgImRlc3RpbmF0aW9uX21lZGl1bSI6IG51bGwsCiAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAogICAgICAgICAgICAibWV0YWRhdGEiOiB7CiAgICAgICAgICAgICAgICAidXNlcl9hZ2VudCI6ICIiLAogICAgICAgICAgICAgICAgInBhZ2VfdXJsIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yaWdpbmFsIjogewogICAgICAgICAgICAgICAgImlkIjogIjg3NzUwNDE3NjQ4OTcxMzY2NSIsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJlYzk0ODE1Zi0wYjgzLTQ5ZmUtYWExMi02ZmNlNTNkNzZiM2IiLAogICAgICAgICAgICAgICAgInNjcmVlbl9uYW1lIjogIlRvYnlCcmV3ZmljdHVzIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVG9iaWFzIFNjaHJvZXRlciIsCiAgICAgICAgICAgICAgICAiY29udGVudHMiOiAiTm8gcHJvYiEgQlRXIC0gY29uZ3JhdHMgb24geW91ciAxeXIgYW5uaXZlcnNhcnkgd2l0aCB1cy4gRW5qb3kgZnJlZSBuZXh0IGRheSBzaGlwcGluZyBvbiB5b3VyIHB1cmNoYXNlIHRvZGF5ISIsCiAgICAgICAgICAgICAgICAicmV0d2VldF9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiZmF2b3JpdGVfY291bnQiOiAwLAogICAgICAgICAgICAgICAgImluX3JlcGx5X3RvX3R3ZWV0IjogbnVsbCwKICAgICAgICAgICAgICAgICJpbl9yZXBseV90b19pZGVudGl0eSI6IG51bGwsCiAgICAgICAgICAgICAgICAibWVkaWEiOiBbXSwKICAgICAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgICAgICAgICAidHdpdHRlcl9pZCI6ICI3MzgxNjAyODEyMzUyOTIxNjAiLAogICAgICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVG9iaWFzIiwKICAgICAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVG9ieUJyZXdmaWN0dXMiLAogICAgICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNSswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNSswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0OCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ4KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfdHdlZXQiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdHdpdHRlci90d2VldHMvODc3NTA0MTc2NDg5NzEzNjY1IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM3KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ4KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0OCswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInBvc3QiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wb3N0cy8yMCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMTgsCiAgICAgICAgICAgICJ1dWlkIjogImFhNGE5NDVmLTdjY2UtNGFlMC1hZmRhLWY4NDk4NmQwOTgyZiIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiVGF5bG9y4oCZcyBiZWVuIGEgZ3JlYXQgY3VzdG9tZXIgZm9yIGp1c3Qgb3ZlciBhIHllYXIuIFdlIGNhbiBwcm9iYWJseSB1cGdyYWRlIGhlciBzaGlwcGluZyB0b2RheSBmb3IgaGVyIGxveWFsdHkuIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIlRheWxvcuKAmXMgYmVlbiBhIGdyZWF0IGN1c3RvbWVyIGZvciBqdXN0IG92ZXIgYSB5ZWFyLiBXZSBjYW4gcHJvYmFibHkgdXBncmFkZSBoZXIgc2hpcHBpbmcgdG9kYXkgZm9yIGhlciBsb3lhbHR5LiIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAic2ltb25AYnJld2ZpY3R1cy5jb20iLAogICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImlzX25vdGlmaWNhdGlvbl9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy9lbWFpbHMvNSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXJjZV9jaGFubmVsIjogewogICAgICAgICAgICAgICAgInV1aWQiOiAiY2YzY2QzOWEtNTRiZi01ZTVlLTkxMmItODgzOTE5ZjNhYjFlIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIk5PVEUiLAogICAgICAgICAgICAgICAgImNoYXJhY3Rlcl9saW1pdCI6IG51bGwsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IG51bGwsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAiYm9keV90ZXh0IjogIlRheWxvcuKAmXMgYmVlbiBhIGdyZWF0IGN1c3RvbWVyIGZvciBqdXN0IG92ZXIgYSB5ZWFyLiBXZSBjYW4gcHJvYmFibHkgdXBncmFkZSBoZXIgc2hpcHBpbmcgdG9kYXkgZm9yIGhlciBsb3lhbHR5LiIsCiAgICAgICAgICAgICAgICAiYm9keV9odG1sIjogbnVsbCwKICAgICAgICAgICAgICAgICJpc19waW5uZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJwaW5uZWRfYnkiOiBudWxsLAogICAgICAgICAgICAgICAgInVzZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDUsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ2KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogIm5vdGUiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvY2FzZXMvMS9ub3Rlcy8xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM1KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ2KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NiswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInBvc3QiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wb3N0cy8xOCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImlkIjogMTcsCiAgICAgICAgICAgICJ1dWlkIjogImI3M2I1ZDg5LTAyZGMtNDQxOC1hYmY5LTcwNjUwNmIzMmY3YyIsCiAgICAgICAgICAgICJjbGllbnRfaWQiOiAiIiwKICAgICAgICAgICAgInN1YmplY3QiOiAiQEJyZXdmaWN0dXMgdGhhbmtzIHNvIG11Y2ggZm9yIHRoZSBxdWljayBoZWxwLCB0aGF0IHdhcyBhd2Vzb21lISIsCiAgICAgICAgICAgICJjb250ZW50cyI6ICJAQnJld2ZpY3R1cyB0aGFua3Mgc28gbXVjaCBmb3IgdGhlIHF1aWNrIGhlbHAsIHRoYXQgd2FzIGF3ZXNvbWUhIiwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImlkZW50aXR5IjogewogICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICJ0d2l0dGVyX2lkIjogIjg1NDI1MDYyMzkyNzIzNzEyIiwKICAgICAgICAgICAgICAgICJmdWxsX25hbWUiOiAiVGF5bG9yIFdlc3QiLAogICAgICAgICAgICAgICAgInNjcmVlbl9uYW1lIjogIlRheWxvcldlc3RSbmJ3IiwKICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgInVybCI6IG51bGwsCiAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgInByb2ZpbGVfaW1hZ2VfdXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiBudWxsLAogICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IGZhbHNlLAogICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM0KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X3R3aXR0ZXIiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImMyMGFmYWIyLWMxYjEtNGM5Mi04NzQ0LWFiMzQyNmJhZmQyNyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJUV0lUVEVSIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiAyNjQsCiAgICAgICAgICAgICAgICAiYWNjb3VudCI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAiODU0MjUwNjIzOTI3MjM3MTIiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfYWNjb3VudCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6ICI4Nzc1MDQwOTM1MTM3NjQ4NjUiLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYjczYjVkODktMDJkYy00NDE4LWFiZjktNzA2NTA2YjMyZjdjIiwKICAgICAgICAgICAgICAgICJzY3JlZW5fbmFtZSI6ICJUYXlsb3JXZXN0Um5idyIsCiAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICJjb250ZW50cyI6ICJAQnJld2ZpY3R1cyB0aGFua3Mgc28gbXVjaCBmb3IgdGhlIHF1aWNrIGhlbHAsIHRoYXQgd2FzIGF3ZXNvbWUhIiwKICAgICAgICAgICAgICAgICJyZXR3ZWV0X2NvdW50IjogMCwKICAgICAgICAgICAgICAgICJmYXZvcml0ZV9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAiaW5fcmVwbHlfdG9fdHdlZXQiOiBudWxsLAogICAgICAgICAgICAgICAgImluX3JlcGx5X3RvX2lkZW50aXR5IjogbnVsbCwKICAgICAgICAgICAgICAgICJtZWRpYSI6IFtdLAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyX2lkIjogIjg1NDI1MDYyMzkyNzIzNzEyIiwKICAgICAgICAgICAgICAgICAgICAiZnVsbF9uYW1lIjogIlRheWxvciBXZXN0IiwKICAgICAgICAgICAgICAgICAgICAic2NyZWVuX25hbWUiOiAiVGF5bG9yV2VzdFJuYnciLAogICAgICAgICAgICAgICAgICAgICJmb2xsb3dlcl9jb3VudCI6IDAsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAidXJsIjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24iOiBudWxsLAogICAgICAgICAgICAgICAgICAgICJwcm9maWxlX2ltYWdlX3VybCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZlcmlmaWVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX3ByaW1hcnkiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDozNCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfdHdpdHRlciIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvaWRlbnRpdGllcy90d2l0dGVyLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NSswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ1KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInR3aXR0ZXJfdHdlZXQiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvdHdpdHRlci90d2VldHMvODc3NTA0MDkzNTEzNzY0ODY1IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicG9zdF9zdGF0dXMiOiAiREVMSVZFUkVEIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjM1KzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDUrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ1KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzE3IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxNiwKICAgICAgICAgICAgInV1aWQiOiAiYWE2MjJmNWItZDZmMy00OWNkLTlmYjUtMzZiODI2MTYwZDc2IiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJURVNUIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIlRoYXQgYXBwZWFycyB0byBoYXZlIHdvcmtlZC4gVGhhbmsgeW91ISIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAicmFpbmJvd2NpdHljYWZlQGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfbm90aWZpY2F0aW9uX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiTUFJTCIsCiAgICAgICAgICAgICAgICAiY2hhcmFjdGVyX2xpbWl0IjogbnVsbCwKICAgICAgICAgICAgICAgICJhY2NvdW50IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyI6ICJzdXBwb3J0QDxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPiIsCiAgICAgICAgICAgICAgICAgICAgImJyYW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpc19zeXN0ZW0iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICJpc19jdXN0b20iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJ2ZXJpZmllZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibWFpbGJveCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvbWFpbGJveGVzLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAiZGVzdGluYXRpb25fbWVkaXVtIjogbnVsbCwKICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCiAgICAgICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICAgICAgICJ1c2VyX2FnZW50IjogIiIsCiAgICAgICAgICAgICAgICAicGFnZV91cmwiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAib3JpZ2luYWwiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInV1aWQiOiAiYWE2MjJmNWItZDZmMy00OWNkLTlmYjUtMzZiODI2MTYwZDc2IiwKICAgICAgICAgICAgICAgICJzdWJqZWN0IjogIlRFU1QiLAogICAgICAgICAgICAgICAgImJvZHlfdGV4dCI6ICJUaGF0IGFwcGVhcnMgdG8gaGF2ZSB3b3JrZWQuIFRoYW5rIHlvdSEiLAogICAgICAgICAgICAgICAgImJvZHlfaHRtbCI6ICJUaGF0IGFwcGVhcnMgdG8gaGF2ZSB3b3JrZWQuIFRoYW5rIHlvdSEiLAogICAgICAgICAgICAgICAgInJlY2lwaWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJmdWxsbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJyYWluYm93Y2l0eWNhZmVAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYWlsYm94IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyI6ICJzdXBwb3J0QDxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPiIsCiAgICAgICAgICAgICAgICAgICAgImJyYW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpc19zeXN0ZW0iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICJpc19jdXN0b20iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJ2ZXJpZmllZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibWFpbGJveCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvbWFpbGJveGVzLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc3BvbnNlX3RpbWUiOiAwLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0NCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ0KzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfbWVzc2FnZSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8xL21lc3NhZ2VzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwb3N0X3N0YXR1cyI6ICJTRU5UIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjMzKzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDQrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQ0KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzE2IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxMiwKICAgICAgICAgICAgInV1aWQiOiAiZDVmMDRhY2QtN2I5OS00ZWQ4LWFkYjEtYjE1MTdmMGM3MzEwIiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJURVNUIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIk9rYXksIGxldCBtZSBnaXZlIHRoYXQgYSB0cnkuIiwKICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAidXNlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImlkZW50aXR5IjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJlbWFpbCI6ICJyYWluYm93Y2l0eWNhZmVAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc192YWxpZGF0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvZW1haWxzLzMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIjogInN1cHBvcnRAPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+IiwKICAgICAgICAgICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImJyYW5kIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlzX3N5c3RlbSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2N1c3RvbSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWxldGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInZlcmlmaWVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA2OjU3OjA4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9tYWlsYm94ZXMvMSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDIsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJkNWYwNGFjZC03Yjk5LTRlZDgtYWRiMS1iMTUxN2YwYzczMTAiLAogICAgICAgICAgICAgICAgInN1YmplY3QiOiAiVEVTVCIsCiAgICAgICAgICAgICAgICAiYm9keV90ZXh0IjogIk9rYXksIGxldCBtZSBnaXZlIHRoYXQgYSB0cnkuIiwKICAgICAgICAgICAgICAgICJib2R5X2h0bWwiOiAiT2theSwgbGV0IG1lIGdpdmUgdGhhdCBhIHRyeS4iLAogICAgICAgICAgICAgICAgInJlY2lwaWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJmdWxsbmFtZSI6ICJUYXlsb3IgV2VzdCIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiAzLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJyYWluYm93Y2l0eWNhZmVAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX3ZhbGlkYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYWlsYm94IjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgInV1aWQiOiAiZmQzYTgxMTYtOTVjMi00OTJlLTlhZjMtYjNhYjU3ZGM5ZjFhIiwKICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyI6ICJzdXBwb3J0QDxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPiIsCiAgICAgICAgICAgICAgICAgICAgImJyYW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJicmFuZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpc19zeXN0ZW0iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICJpc19jdXN0b20iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmVyaWZpZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZGVsZXRlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJ2ZXJpZmllZF9hdCI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yN1QwNjo1NzowOCswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAibWFpbGJveCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3VybCI6ICJodHRwczovLzxJTVBPUlRfS0FZQUtPX0VORFBPSU5UX0hPU1ROQU1FPi9hcGkvdjEvbWFpbGJveGVzLzEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZG93bmxvYWRfYWxsIjogbnVsbCwKICAgICAgICAgICAgICAgICJsb2NhbGUiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc3BvbnNlX3RpbWUiOiAwLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTo0MCswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQwKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImNhc2VfbWVzc2FnZSIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy8xL21lc3NhZ2VzLzIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwb3N0X3N0YXR1cyI6ICJTRU5UIiwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF90eXBlIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3JlamVjdF9yZWFzb24iOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfdXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjMwKzAwOjAwIiwKICAgICAgICAgICAgImlzX3JlcXVlc3RlciI6IHRydWUsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6NDArMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjQwKzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzEyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAxMCwKICAgICAgICAgICAgInV1aWQiOiAiY2IzZWU3OWQtNDkxMi00ZWU0LTgxOWMtMzE3YWEzMDBlYjk4IiwKICAgICAgICAgICAgImNsaWVudF9pZCI6ICIiLAogICAgICAgICAgICAic3ViamVjdCI6ICJURVNUIiwKICAgICAgICAgICAgImNvbnRlbnRzIjogIkhpIFRheWxvcixcblxuSXQgbG9va3MgbGlrZSB5b3XigJl2ZSBoaXQgYSBzbmFnIHdoaWxlIGNoZWNraW5nIG91dCB3aXRoIHlvdXIgbmV3IFI1OCBjb2ZmZWUgbWFjaGluZSEgU29ycnkgYWJvdXQgdGhhdCAtIHRoZSByZWFzb24geW91ciBjYXJkIHdhcyBkZWNsaW5lZCBhcHBlYXJzIHRvIGJlIGFuIGluY29ycmVjdCBDVlYgbnVtYmVyICh0aHJlZSBkaWdpdCBudW1iZXIgb24gdGhlIGJhY2sgb2YgeW91ciBjYXJkKS4gSWYgeW91IGZpeCB0aGF0IGRldGFpbCwgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvLiDimJVcblxuW2ltZyBzcmM9XCJodHRwczovL2NkbjIuaHVic3BvdC5uZXQvaHViZnMvNDUxMDA1L2theWFrby1jdXN0b21lci1qb3VybmV5LWN2di5qcGdcIiAvXVxuXG5MZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBhbnkgbW9yZSBxdWVzdGlvbnMuXG5cblRvYmlhcyBTY2hyb2V0ZXJcbiIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDQsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAidG9iaWFzQGJyZXdmaWN0dXMuY29tIiwKICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJpc192YWxpZGF0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJpc19ub3RpZmljYXRpb25fZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjEyKzAwOjAwIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImlkZW50aXR5X2VtYWlsIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvZW1haWxzLzQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzb3VyY2VfY2hhbm5lbCI6IHsKICAgICAgICAgICAgICAgICJ1dWlkIjogImZkM2E4MTE2LTk1YzItNDkyZS05YWYzLWIzYWI1N2RjOWYxYSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJNQUlMIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIjogInN1cHBvcnRAPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+IiwKICAgICAgICAgICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImJyYW5kIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlzX3N5c3RlbSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2N1c3RvbSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWxldGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInZlcmlmaWVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA2OjU3OjA4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9tYWlsYm94ZXMvMSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGFubmVsIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgImRvd25sb2FkX2FsbCI6IG51bGwsCiAgICAgICAgICAgICJkZXN0aW5hdGlvbl9tZWRpdW0iOiBudWxsLAogICAgICAgICAgICAic291cmNlIjogbnVsbCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgInVzZXJfYWdlbnQiOiAiIiwKICAgICAgICAgICAgICAgICJwYWdlX3VybCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvcmlnaW5hbCI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAidXVpZCI6ICJjYjNlZTc5ZC00OTEyLTRlZTQtODE5Yy0zMTdhYTMwMGViOTgiLAogICAgICAgICAgICAgICAgInN1YmplY3QiOiAiVEVTVCIsCiAgICAgICAgICAgICAgICAiYm9keV90ZXh0IjogIkhpIFRheWxvcixcblxuSXQgbG9va3MgbGlrZSB5b3XigJl2ZSBoaXQgYSBzbmFnIHdoaWxlIGNoZWNraW5nIG91dCB3aXRoIHlvdXIgbmV3IFI1OCBjb2ZmZWUgbWFjaGluZSEgU29ycnkgYWJvdXQgdGhhdCAtIHRoZSByZWFzb24geW91ciBjYXJkIHdhcyBkZWNsaW5lZCBhcHBlYXJzIHRvIGJlIGFuIGluY29ycmVjdCBDVlYgbnVtYmVyICh0aHJlZSBkaWdpdCBudW1iZXIgb24gdGhlIGJhY2sgb2YgeW91ciBjYXJkKS4gSWYgeW91IGZpeCB0aGF0IGRldGFpbCwgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvLiDimJVcblxuW2ltZyBzcmM9XCJodHRwczovL2NkbjIuaHVic3BvdC5uZXQvaHViZnMvNDUxMDA1L2theWFrby1jdXN0b21lci1qb3VybmV5LWN2di5qcGdcIiAvXVxuXG5MZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBhbnkgbW9yZSBxdWVzdGlvbnMuXG5cblRvYmlhcyBTY2hyb2V0ZXJcbiIsCiAgICAgICAgICAgICAgICAiYm9keV9odG1sIjogIjxwPkhpIFRheWxvciw8L3A+XG5cdFx0PHA+SXQgbG9va3MgbGlrZSB5b3XigJl2ZSBoaXQgYSBzbmFnIHdoaWxlIGNoZWNraW5nIG91dCB3aXRoIHlvdXIgbmV3IFI1OCBjb2ZmZWUgbWFjaGluZSEgU29ycnkgYWJvdXQgdGhhdCAtIHRoZSByZWFzb24geW91ciBjYXJkIHdhcyBkZWNsaW5lZCBhcHBlYXJzIHRvIGJlIGFuIGluY29ycmVjdCBDVlYgbnVtYmVyICh0aHJlZSBkaWdpdCBudW1iZXIgb24gdGhlIGJhY2sgb2YgeW91ciBjYXJkKS4gSWYgeW91IGZpeCB0aGF0IGRldGFpbCwgeW91IHNob3VsZCBiZSBnb29kIHRvIGdvLiDimJU8L3A+XG4gXG5cdFx0PHA+PGltZyBzcmM9XCJodHRwczovL2NkbjIuaHVic3BvdC5uZXQvaHViZnMvNDUxMDA1L2theWFrby1jdXN0b21lci1qb3VybmV5LWN2di5qcGdcIiAvPjwvcD5cbiBcblx0XHQ8cD5MZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBhbnkgbW9yZSBxdWVzdGlvbnMuPC9wPlxuIFxuXHRcdDxwPlRvYmlhcyBTY2hyb2V0ZXI8L3A+IiwKICAgICAgICAgICAgICAgICJyZWNpcGllbnRzIjogW10sCiAgICAgICAgICAgICAgICAiZnVsbG5hbWUiOiAiVG9iaWFzIFNjaHJvZXRlciIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiBudWxsLAogICAgICAgICAgICAgICAgImNyZWF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogNCwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAiaWQiOiA0LAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJ0b2JpYXNAYnJld2ZpY3R1cy5jb20iLAogICAgICAgICAgICAgICAgICAgICJpc19wcmltYXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImlzX25vdGlmaWNhdGlvbl9lbmFibGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImNyZWF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiaWRlbnRpdHlfZW1haWwiLAogICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2lkZW50aXRpZXMvZW1haWxzLzQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm1haWxib3giOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAidXVpZCI6ICJmZDNhODExNi05NWMyLTQ5MmUtOWFmMy1iM2FiNTdkYzlmMWEiLAogICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIjogInN1cHBvcnRAPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+IiwKICAgICAgICAgICAgICAgICAgICAiYnJhbmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogImJyYW5kIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlzX3N5c3RlbSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgImlzX2N1c3RvbSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc192ZXJpZmllZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiaXNfZW5hYmxlZCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpc19kZWxldGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInZlcmlmaWVkX2F0IjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjI0OjE4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI3VDA2OjU3OjA4KzAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJtYWlsYm94IiwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9tYWlsYm94ZXMvMSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXR0YWNobWVudHMiOiBbXSwKICAgICAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAgICAgImxvY2FsZSI6IG51bGwsCiAgICAgICAgICAgICAgICAicmVzcG9uc2VfdGltZSI6IDAsCiAgICAgICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM4KzAwOjAwIiwKICAgICAgICAgICAgICAgICJ1cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6MzgrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2FzZV9tZXNzYWdlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzLzEvbWVzc2FnZXMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzIjogIlNFTlQiLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3R5cGUiOiBudWxsLAogICAgICAgICAgICAicG9zdF9zdGF0dXNfcmVqZWN0X3JlYXNvbiI6IG51bGwsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c191cGRhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MjcrMDA6MDAiLAogICAgICAgICAgICAiaXNfcmVxdWVzdGVyIjogZmFsc2UsCiAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6MzgrMDA6MDAiLAogICAgICAgICAgICAidXBkYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM4KzAwOjAwIiwKICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAicG9zdCIsCiAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2Nhc2VzL3Bvc3RzLzEwIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiA5LAogICAgICAgICAgICAidXVpZCI6ICI1ZmY2NTQyZi05OWZmLTQ5NzYtYjQ4My1iMDk5MTcxZGNlYTYiLAogICAgICAgICAgICAiY2xpZW50X2lkIjogIiIsCiAgICAgICAgICAgICJzdWJqZWN0IjogIkhpLCBuZWVkIHNvbWUgaGVscCB3aXRoIHBheW1lbnQiLAogICAgICAgICAgICAiY29udGVudHMiOiAiSGksIG5lZWQgc29tZSBoZWxwIHdpdGggcGF5bWVudCIsCiAgICAgICAgICAgICJjcmVhdG9yIjogewogICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInVzZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICAgICAgICJpZCI6IDMsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAicmFpbmJvd2NpdHljYWZlQGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAiaXNfcHJpbWFyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiaXNfdmFsaWRhdGVkIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNfbm90aWZpY2F0aW9uX2VuYWJsZWQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MjQ6MTIrMDA6MDAiLAogICAgICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoxMiswMDowMCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJpZGVudGl0eV9lbWFpbCIsCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9pZGVudGl0aWVzL2VtYWlscy8zIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic291cmNlX2NoYW5uZWwiOiB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICJlNWNjZjYwNC1jZGVkLTU0ZmItYmFhZC1jNGQ5ZTk5OWQwNDMiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiTUVTU0VOR0VSIiwKICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJfbGltaXQiOiBudWxsLAogICAgICAgICAgICAgICAgImFjY291bnQiOiBudWxsLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhbm5lbCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImF0dGFjaG1lbnRzIjogW10sCiAgICAgICAgICAgICJkb3dubG9hZF9hbGwiOiBudWxsLAogICAgICAgICAgICAiZGVzdGluYXRpb25fbWVkaXVtIjogbnVsbCwKICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCiAgICAgICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICAgICAgICJ1c2VyX2FnZW50IjogIiIsCiAgICAgICAgICAgICAgICAicGFnZV91cmwiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAib3JpZ2luYWwiOiB7CiAgICAgICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAgICAgImZyb20iOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMywKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJ1c2VyX21pbmltYWwiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV2ZW50IjogIm1lc3NhZ2UiLAogICAgICAgICAgICAgICAgInV1aWQiOiAiNWZmNjU0MmYtOTlmZi00OTc2LWI0ODMtYjA5OTE3MWRjZWE2IiwKICAgICAgICAgICAgICAgICJ0ZXh0IjogIkhpLCBuZWVkIHNvbWUgaGVscCB3aXRoIHBheW1lbnQiLAogICAgICAgICAgICAgICAgInR5cGUiOiAiIiwKICAgICAgICAgICAgICAgICJhdHRhY2htZW50cyI6IFtdLAogICAgICAgICAgICAgICAgImNoYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogMSwKICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VfdHlwZSI6ICJjaGF0IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjcmVhdGVkX2F0IjogIjIwMjEtMDgtMjRUMTg6MDk6MzcrMDA6MDAiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3R5cGUiOiAiY2hhdF9tZXNzYWdlIiwKICAgICAgICAgICAgICAgICJyZXNvdXJjZV91cmwiOiAiaHR0cHM6Ly88SU1QT1JUX0tBWUFLT19FTkRQT0lOVF9IT1NUTkFNRT4vYXBpL3YxL2NoYXRzLzEvbWVzc2FnZXMvMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzIjogIkRFTElWRVJFRCIsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c19yZWplY3RfdHlwZSI6IG51bGwsCiAgICAgICAgICAgICJwb3N0X3N0YXR1c19yZWplY3RfcmVhc29uIjogbnVsbCwKICAgICAgICAgICAgInBvc3Rfc3RhdHVzX3VwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODoyNDoyNSswMDowMCIsCiAgICAgICAgICAgICJpc19yZXF1ZXN0ZXIiOiB0cnVlLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6ICIyMDIxLTA4LTI0VDE4OjA5OjM3KzAwOjAwIiwKICAgICAgICAgICAgInVwZGF0ZWRfYXQiOiAiMjAyMS0wOC0yNFQxODowOTozNyswMDowMCIsCiAgICAgICAgICAgICJyZXNvdXJjZV90eXBlIjogInBvc3QiLAogICAgICAgICAgICAicmVzb3VyY2VfdXJsIjogImh0dHBzOi8vPElNUE9SVF9LQVlBS09fRU5EUE9JTlRfSE9TVE5BTUU+L2FwaS92MS9jYXNlcy9wb3N0cy85IgogICAgICAgIH0KICAgIF0sCiAgICAicmVzb3VyY2UiOiAicG9zdCIsCiAgICAibGltaXQiOiAxMDAsCiAgICAidG90YWxfY291bnQiOiA4Cn0=
+ recorded_at: Fri, 01 Oct 2021 15:59:01 GMT
+- request:
+ method: get
+ uri: https:///api/v1/timetracking?limit=100
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ X-Session-Id:
+ - TayW6Qnt0Loid4b9a618960d7e46555d8d95657ab22808718f64lWdx9dau5cFE99JtQiSLIv2Y5Asz
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 15:59:02 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T15:59:02+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": [
+ {
+ "id": 1,
+ "time_tracking_log_id": 1,
+ "case": {
+ "id": 3,
+ "resource_type": "case"
+ },
+ "agent": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "log_type": "VIEWED",
+ "time_spent": 90,
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "created_at": "2021-08-27T11:25:30+00:00",
+ "updated_at": "2021-08-27T11:26:30+00:00",
+ "resource_type": "timetracking_log",
+ "resource_url": "https:///api/v1/cases/time_track/log/1"
+ },
+ {
+ "id": 2,
+ "time_tracking_log_id": 2,
+ "case": {
+ "id": 4,
+ "resource_type": "case"
+ },
+ "agent": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "log_type": "VIEWED",
+ "time_spent": 30,
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "created_at": "2021-08-27T12:19:53+00:00",
+ "updated_at": "2021-08-27T12:19:53+00:00",
+ "resource_type": "timetracking_log",
+ "resource_url": "https:///api/v1/cases/time_track/log/2"
+ },
+ {
+ "id": 3,
+ "time_tracking_log_id": 3,
+ "case": {
+ "id": 3,
+ "resource_type": "case"
+ },
+ "agent": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "log_type": "WORKED",
+ "time_spent": 3780,
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "created_at": "2021-08-30T08:18:08+00:00",
+ "updated_at": "2021-08-30T08:18:08+00:00",
+ "resource_type": "timetracking_log",
+ "resource_url": "https:///api/v1/cases/time_track/log/3"
+ },
+ {
+ "id": 4,
+ "time_tracking_log_id": 4,
+ "case": {
+ "id": 3,
+ "resource_type": "case"
+ },
+ "agent": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "log_type": "WORKED",
+ "time_spent": 1800,
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "created_at": "2021-08-30T08:18:18+00:00",
+ "updated_at": "2021-08-30T08:18:18+00:00",
+ "resource_type": "timetracking_log",
+ "resource_url": "https:///api/v1/cases/time_track/log/4"
+ },
+ {
+ "id": 5,
+ "time_tracking_log_id": 5,
+ "case": {
+ "id": 3,
+ "resource_type": "case"
+ },
+ "agent": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "log_type": "VIEWED",
+ "time_spent": 91,
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "created_at": "2021-08-30T08:18:31+00:00",
+ "updated_at": "2021-08-30T08:19:32+00:00",
+ "resource_type": "timetracking_log",
+ "resource_url": "https:///api/v1/cases/time_track/log/5"
+ },
+ {
+ "id": 6,
+ "time_tracking_log_id": 6,
+ "case": {
+ "id": 3,
+ "resource_type": "case"
+ },
+ "agent": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "log_type": "VIEWED",
+ "time_spent": 6982,
+ "creator": {
+ "id": 1,
+ "resource_type": "user"
+ },
+ "created_at": "2021-10-01T14:02:51+00:00",
+ "updated_at": "2021-10-01T15:58:43+00:00",
+ "resource_type": "timetracking_log",
+ "resource_url": "https:///api/v1/cases/time_track/log/6"
+ }
+ ],
+ "resource": "timetracking_log",
+ "offset": 0,
+ "limit": 100,
+ "total_count": 6
+ }
+ recorded_at: Fri, 01 Oct 2021 15:59:02 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_invalid_subdomain.yml b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_invalid_subdomain.yml
new file mode 100644
index 000000000..bc2d8d379
--- /dev/null
+++ b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_invalid_subdomain.yml
@@ -0,0 +1,40 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https://reallybadexample.kayako.com/api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - reallybadexample.kayako.com
+ response:
+ status:
+ code: 490
+ message:
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Mon, 30 Aug 2021 12:29:21 GMT
+ Content-Type:
+ - text/html; charset=UTF-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: Either this Kayako instance does not exist or we are facing temporary
+ problems. Please try again in a few minutes
+ recorded_at: Mon, 30 Aug 2021 12:29:21 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_valid_subdomain.yml b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_valid_subdomain.yml
new file mode 100644
index 000000000..cb1293df4
--- /dev/null
+++ b/test/data/vcr_cassettes/requests/import_kayako/importkayako_post_api_v1_import_kayako_url_check_check_valid_subdomain.yml
@@ -0,0 +1,57 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https:///api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - ""
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Mon, 30 Aug 2021 12:29:22 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '302'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHORIZATION_REQUIRED",
+ "message": "Performing this action on this resource requires authorization",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED"
+ }
+ ]
+ }
+ recorded_at: Mon, 30 Aug 2021 12:29:22 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_credentials.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_credentials.yml
new file mode 100644
index 000000000..ac66ca653
--- /dev/null
+++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_credentials.yml
@@ -0,0 +1,187 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https:///api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - ""
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:12 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '302'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHORIZATION_REQUIRED",
+ "message": "Performing this action on this resource requires authorization",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED"
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:12 GMT
+- request:
+ method: get
+ uri: https:///api/v1/me
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ Authorization:
+ - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04=
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:14 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '489'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHENTICATION_FAILED",
+ "message": "Used authentication credentials are invalid or signature verification failed",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED"
+ }
+ ],
+ "notifications": [
+ {
+ "type": "ERROR",
+ "message": "Invalid email or password (attempt: 1/10)",
+ "sticky": false
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:14 GMT
+- request:
+ method: get
+ uri: https:///api/v1/me
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ Authorization:
+ - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04=
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:15 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '489'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHENTICATION_FAILED",
+ "message": "Used authentication credentials are invalid or signature verification failed",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED"
+ }
+ ],
+ "notifications": [
+ {
+ "type": "ERROR",
+ "message": "Invalid email or password (attempt: 2/10)",
+ "sticky": false
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:15 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_hostname.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_hostname.yml
new file mode 100644
index 000000000..a28bb0b5b
--- /dev/null
+++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_invalid_hostname.yml
@@ -0,0 +1,40 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https://reallybadexample.kayako.com/api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - reallybadexample.kayako.com
+ response:
+ status:
+ code: 490
+ message:
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:08 GMT
+ Content-Type:
+ - text/html; charset=UTF-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: Either this Kayako instance does not exist or we are facing temporary
+ problems. Please try again in a few minutes
+ recorded_at: Fri, 01 Oct 2021 16:05:08 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_shows_start_button.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_shows_start_button.yml
new file mode 100644
index 000000000..f29e5f7ad
--- /dev/null
+++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_shows_start_button.yml
@@ -0,0 +1,340 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https:///api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - ""
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:21 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '302'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHORIZATION_REQUIRED",
+ "message": "Performing this action on this resource requires authorization",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED"
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:21 GMT
+- request:
+ method: get
+ uri: https:///api/v1/me
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:24 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ X-Csrf-Token:
+ - jtJJZ4aiV4LzNq6JOIRHBU3QVu6ZUp1ssJrjWZMMr4A67wFjgBVYfZo7LXEg4CQbmltMmTIgQpO9ieZ6zm12G3JFCYqOYzxqFTAv
+ Content-Location:
+ - https:///api/v1/users/1
+ Last-Modified:
+ - Fri, 01 Oct 2021 16:05:24 +0000
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T16:05:24+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": {
+ "id": 1,
+ "uuid": "a8dfe5fd-b08d-5d07-ad8b-74b113f5d726",
+ "full_name": "Thorsten Eckel",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": true,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 5,
+ "resource_type": "role"
+ },
+ "avatar": "https:///avatar/get/a8dfe5fd-b08d-5d07-ad8b-74b113f5d726?1633104104",
+ "agent_case_access": "ALL",
+ "organization_case_access": null,
+ "organization": {
+ "id": 3,
+ "resource_type": "organization"
+ },
+ "teams": [
+ {
+ "id": 1,
+ "resource_type": "team"
+ },
+ {
+ "id": 2,
+ "resource_type": "team"
+ }
+ ],
+ "emails": [
+ {
+ "id": 1,
+ "resource_type": "identity_email"
+ }
+ ],
+ "phones": [],
+ "twitter": [],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "UTC",
+ "time_zone_offset": 0,
+ "greeting": null,
+ "signature": null,
+ "status_message": null,
+ "last_seen_user_agent": "Ruby",
+ "last_seen_ip": "5.231.138.208",
+ "last_seen_at": "2021-10-01T16:01:44+00:00",
+ "last_active_at": "2021-10-01T16:01:44+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_1",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@cf0274b394db3af555dbc136fc70aab6e45bee42",
+ "password_updated_at": "2021-08-27T07:18:23+00:00",
+ "avatar_updated_at": null,
+ "last_logged_in_at": "2021-10-01T16:05:24+00:00",
+ "last_activity_at": "2021-10-01T16:05:24+00:00",
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-10-01T16:01:44+00:00",
+ "permissions": [
+ {
+ "id": 87,
+ "resource_type": "permission"
+ },
+ {
+ "id": 26,
+ "resource_type": "permission"
+ },
+ {
+ "id": 22,
+ "resource_type": "permission"
+ },
+ {
+ "id": 21,
+ "resource_type": "permission"
+ },
+ {
+ "id": 25,
+ "resource_type": "permission"
+ },
+ {
+ "id": 23,
+ "resource_type": "permission"
+ },
+ {
+ "id": 30,
+ "resource_type": "permission"
+ },
+ {
+ "id": 29,
+ "resource_type": "permission"
+ },
+ {
+ "id": 19,
+ "resource_type": "permission"
+ },
+ {
+ "id": 20,
+ "resource_type": "permission"
+ },
+ {
+ "id": 18,
+ "resource_type": "permission"
+ },
+ {
+ "id": 24,
+ "resource_type": "permission"
+ },
+ {
+ "id": 28,
+ "resource_type": "permission"
+ },
+ {
+ "id": 27,
+ "resource_type": "permission"
+ },
+ {
+ "id": 56,
+ "resource_type": "permission"
+ },
+ {
+ "id": 53,
+ "resource_type": "permission"
+ },
+ {
+ "id": 54,
+ "resource_type": "permission"
+ },
+ {
+ "id": 58,
+ "resource_type": "permission"
+ },
+ {
+ "id": 60,
+ "resource_type": "permission"
+ },
+ {
+ "id": 59,
+ "resource_type": "permission"
+ },
+ {
+ "id": 61,
+ "resource_type": "permission"
+ },
+ {
+ "id": 63,
+ "resource_type": "permission"
+ },
+ {
+ "id": 62,
+ "resource_type": "permission"
+ },
+ {
+ "id": 57,
+ "resource_type": "permission"
+ },
+ {
+ "id": 52,
+ "resource_type": "permission"
+ },
+ {
+ "id": 55,
+ "resource_type": "permission"
+ },
+ {
+ "id": 64,
+ "resource_type": "permission"
+ },
+ {
+ "id": 67,
+ "resource_type": "permission"
+ },
+ {
+ "id": 75,
+ "resource_type": "permission"
+ },
+ {
+ "id": 76,
+ "resource_type": "permission"
+ },
+ {
+ "id": 74,
+ "resource_type": "permission"
+ },
+ {
+ "id": 80,
+ "resource_type": "permission"
+ },
+ {
+ "id": 85,
+ "resource_type": "permission"
+ },
+ {
+ "id": 86,
+ "resource_type": "permission"
+ }
+ ],
+ "settings": [
+ {
+ "id": 4,
+ "resource_type": "setting"
+ },
+ {
+ "id": 6,
+ "resource_type": "setting"
+ },
+ {
+ "id": 5,
+ "resource_type": "setting"
+ }
+ ],
+ "notification_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@c78aaa8dab17000045571b17b135409a48bac06a",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/1"
+ },
+ "resource": "user",
+ "session_id": "gdi6n3BqKfRxbpj404ff61fa7018ddad6c6135fde1872067558a57clJf7mIDAWXNOXlxq5e1VXSLK"
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:24 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_credentials.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_credentials.yml
new file mode 100644
index 000000000..a0a6ea41f
--- /dev/null
+++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_credentials.yml
@@ -0,0 +1,187 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https:///api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - ""
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:17 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '302'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHORIZATION_REQUIRED",
+ "message": "Performing this action on this resource requires authorization",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED"
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:17 GMT
+- request:
+ method: get
+ uri: https:///api/v1/me
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ Authorization:
+ - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04=
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:19 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '489'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHENTICATION_FAILED",
+ "message": "Used authentication credentials are invalid or signature verification failed",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED"
+ }
+ ],
+ "notifications": [
+ {
+ "type": "ERROR",
+ "message": "Invalid email or password (attempt: 3/10)",
+ "sticky": false
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:19 GMT
+- request:
+ method: get
+ uri: https:///api/v1/me
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ Authorization:
+ - Basic ZGV2ZWxvcG1lbnRAemFtbWFkLmNvbToxbnY0bDFkVDBLM04=
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:19 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '489'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHENTICATION_FAILED",
+ "message": "Used authentication credentials are invalid or signature verification failed",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHENTICATION_FAILED"
+ }
+ ],
+ "notifications": [
+ {
+ "type": "ERROR",
+ "message": "Invalid email or password (attempt: 4/10)",
+ "sticky": false
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:19 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_hostname.yml b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_hostname.yml
new file mode 100644
index 000000000..173d1d6d2
--- /dev/null
+++ b/test/data/vcr_cassettes/system/import/kayako/import_kayako_fields_validation_valid_hostname.yml
@@ -0,0 +1,40 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https://reallybadexample.kayako.com/api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - reallybadexample.kayako.com
+ response:
+ status:
+ code: 490
+ message:
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:10 GMT
+ Content-Type:
+ - text/html; charset=UTF-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: Either this Kayako instance does not exist or we are facing temporary
+ problems. Please try again in a few minutes
+ recorded_at: Fri, 01 Oct 2021 16:05:10 GMT
+recorded_with: VCR 6.0.0
diff --git a/test/data/vcr_cassettes/system/import/kayako/import_progress_setup.yml b/test/data/vcr_cassettes/system/import/kayako/import_progress_setup.yml
new file mode 100644
index 000000000..9e7b0e6f0
--- /dev/null
+++ b/test/data/vcr_cassettes/system/import/kayako/import_progress_setup.yml
@@ -0,0 +1,340 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https:///api/v1/teams
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - ""
+ response:
+ status:
+ code: 401
+ message: Unauthorized
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:26 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '302'
+ Connection:
+ - keep-alive
+ Www-Authenticate:
+ - Basic realm="Zammad GmbH"
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "status": 401,
+ "errors": [
+ {
+ "code": "AUTHORIZATION_REQUIRED",
+ "message": "Performing this action on this resource requires authorization",
+ "more_info": "https://developer.kayako.com/api/v1/reference/errors/AUTHORIZATION_REQUIRED"
+ }
+ ]
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:26 GMT
+- request:
+ method: get
+ uri: https:///api/v1/me
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ""
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Fri, 01 Oct 2021 16:05:28 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ X-Csrf-Token:
+ - 0SUHpWF2KvDU8kyJ8qYGobKCIoMIdVS8p2GWZ82LNgu5TJ8XEtt4gQtCJ9KyT7HsBrxBD9GJPc0pqaPqsGq9ZmyfUJdOysVVFbz9
+ Content-Location:
+ - https:///api/v1/users/1
+ Last-Modified:
+ - Fri, 01 Oct 2021 16:05:28 +0000
+ Cache-Control:
+ - private, max-age=0, must-revalidate
+ Expires:
+ - '0'
+ X-Api-Version:
+ - '1'
+ Date-Iso:
+ - '2021-10-01T16:05:28+00:00'
+ Access-Control-Expose-Headers:
+ - Date-ISO
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Content-Type-Options:
+ - nosniff
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains preload
+ body:
+ encoding: ASCII-8BIT
+ string: |-
+ {
+ "status": 200,
+ "data": {
+ "id": 1,
+ "uuid": "a8dfe5fd-b08d-5d07-ad8b-74b113f5d726",
+ "full_name": "Thorsten Eckel",
+ "legacy_id": null,
+ "designation": null,
+ "is_enabled": true,
+ "is_mfa_enabled": false,
+ "role": {
+ "id": 5,
+ "resource_type": "role"
+ },
+ "avatar": "https:///avatar/get/a8dfe5fd-b08d-5d07-ad8b-74b113f5d726?1633104104",
+ "agent_case_access": "ALL",
+ "organization_case_access": null,
+ "organization": {
+ "id": 3,
+ "resource_type": "organization"
+ },
+ "teams": [
+ {
+ "id": 1,
+ "resource_type": "team"
+ },
+ {
+ "id": 2,
+ "resource_type": "team"
+ }
+ ],
+ "emails": [
+ {
+ "id": 1,
+ "resource_type": "identity_email"
+ }
+ ],
+ "phones": [],
+ "twitter": [],
+ "facebook": [],
+ "external_identifiers": [],
+ "custom_fields": [],
+ "pinned_notes_count": 0,
+ "locale": {
+ "id": 3,
+ "resource_type": "locale"
+ },
+ "time_zone": "UTC",
+ "time_zone_offset": 0,
+ "greeting": null,
+ "signature": null,
+ "status_message": null,
+ "last_seen_user_agent": "Ruby",
+ "last_seen_ip": "5.231.138.208",
+ "last_seen_at": "2021-10-01T16:01:44+00:00",
+ "last_active_at": "2021-10-01T16:01:44+00:00",
+ "realtime_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@v1_users_1",
+ "presence_channel": "user_presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@cf0274b394db3af555dbc136fc70aab6e45bee42",
+ "password_updated_at": "2021-08-27T07:18:23+00:00",
+ "avatar_updated_at": null,
+ "last_logged_in_at": "2021-10-01T16:05:28+00:00",
+ "last_activity_at": "2021-10-01T16:05:28+00:00",
+ "created_at": "2021-08-24T18:24:11+00:00",
+ "updated_at": "2021-10-01T16:01:44+00:00",
+ "permissions": [
+ {
+ "id": 87,
+ "resource_type": "permission"
+ },
+ {
+ "id": 26,
+ "resource_type": "permission"
+ },
+ {
+ "id": 22,
+ "resource_type": "permission"
+ },
+ {
+ "id": 21,
+ "resource_type": "permission"
+ },
+ {
+ "id": 25,
+ "resource_type": "permission"
+ },
+ {
+ "id": 23,
+ "resource_type": "permission"
+ },
+ {
+ "id": 30,
+ "resource_type": "permission"
+ },
+ {
+ "id": 29,
+ "resource_type": "permission"
+ },
+ {
+ "id": 19,
+ "resource_type": "permission"
+ },
+ {
+ "id": 20,
+ "resource_type": "permission"
+ },
+ {
+ "id": 18,
+ "resource_type": "permission"
+ },
+ {
+ "id": 24,
+ "resource_type": "permission"
+ },
+ {
+ "id": 28,
+ "resource_type": "permission"
+ },
+ {
+ "id": 27,
+ "resource_type": "permission"
+ },
+ {
+ "id": 56,
+ "resource_type": "permission"
+ },
+ {
+ "id": 53,
+ "resource_type": "permission"
+ },
+ {
+ "id": 54,
+ "resource_type": "permission"
+ },
+ {
+ "id": 58,
+ "resource_type": "permission"
+ },
+ {
+ "id": 60,
+ "resource_type": "permission"
+ },
+ {
+ "id": 59,
+ "resource_type": "permission"
+ },
+ {
+ "id": 61,
+ "resource_type": "permission"
+ },
+ {
+ "id": 63,
+ "resource_type": "permission"
+ },
+ {
+ "id": 62,
+ "resource_type": "permission"
+ },
+ {
+ "id": 57,
+ "resource_type": "permission"
+ },
+ {
+ "id": 52,
+ "resource_type": "permission"
+ },
+ {
+ "id": 55,
+ "resource_type": "permission"
+ },
+ {
+ "id": 64,
+ "resource_type": "permission"
+ },
+ {
+ "id": 67,
+ "resource_type": "permission"
+ },
+ {
+ "id": 75,
+ "resource_type": "permission"
+ },
+ {
+ "id": 76,
+ "resource_type": "permission"
+ },
+ {
+ "id": 74,
+ "resource_type": "permission"
+ },
+ {
+ "id": 80,
+ "resource_type": "permission"
+ },
+ {
+ "id": 85,
+ "resource_type": "permission"
+ },
+ {
+ "id": 86,
+ "resource_type": "permission"
+ }
+ ],
+ "settings": [
+ {
+ "id": 4,
+ "resource_type": "setting"
+ },
+ {
+ "id": 6,
+ "resource_type": "setting"
+ },
+ {
+ "id": 5,
+ "resource_type": "setting"
+ }
+ ],
+ "notification_channel": "presence-442543cd422877504001eb0550f189ad362d6475fa6d95fd0f2d8ee0ff770f65@c78aaa8dab17000045571b17b135409a48bac06a",
+ "resource_type": "user",
+ "resource_url": "https:///api/v1/users/1"
+ },
+ "resource": "user",
+ "session_id": "MRTxBWpNiHo1cjNYcbvT7mU777Ixu83a7405b1171e15f03e4cf94d41ec757f9d87f68p5WR8OnCqLi5QD8W"
+ }
+ recorded_at: Fri, 01 Oct 2021 16:05:28 GMT
+recorded_with: VCR 6.0.0