seatsio 26.2.0 → 31.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a271b58be4efc9c27a4604733e1a7951b0f72b65d206c980c36f2d932be2baea
4
- data.tar.gz: 9b3decce98eb7a0459063592a5428e9395296c3fad72e5e7e625bd97498b0886
3
+ metadata.gz: bf1124000be835fc50c85b57259d3cc53d0efbb3625bff185329e412f0fd9b33
4
+ data.tar.gz: 4f85fb99913ddb488705092c483c88ada2da298a0f9b7dbcee90df3cae558a4d
5
5
  SHA512:
6
- metadata.gz: e09498be7a8d43d228f3d7fbc5c7d77bc06a84510f29b9bc86f1c354132d2400772d3993e76c29ecec87ad2b72006f5274d0f2cfc3f0f75e740b8a2297441f76
7
- data.tar.gz: c8c0cc4143ab7311932a5b5d8990285bbc33c552e05e928d6bb3cee2852764299c16348fae068817988ce07c9f7595ca559e784820a33bebdbbf388e30ee115a
6
+ metadata.gz: fd5ed35d871c54d7101e78eaacb2fd9925ef0894e69d56150eecd671b04b8a01cafaabe57b51b94c02326c4a9acbdfe27fe1dbed1a680e3700c6d80ebef5723e
7
+ data.tar.gz: 933fe7bb11ebcc7e9c15f8efbe8dafbfb5c9b584f351f5cef9c949a51a0dd243eda159077d8be2b79b042e9eaab44947b1c1b1feaabddb8ca554bc487e11e3b9
@@ -0,0 +1,26 @@
1
+ name: 'Build'
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ matrix:
15
+ ruby-version: ['2.3']
16
+
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby-version }}
22
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
23
+ - uses: zcong1993/setup-timezone@master
24
+ with:
25
+ timezone: Europe/Brussels
26
+ - run: bundle exec rake
@@ -0,0 +1,21 @@
1
+ name: 'Publish'
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - run: |
14
+ mkdir -p $HOME/.gem
15
+ touch $HOME/.gem/credentials
16
+ chmod 0600 $HOME/.gem/credentials
17
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
18
+ gem build *.gemspec
19
+ gem push *.gem
20
+ env:
21
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_API_KEY}}"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- seatsio (26.2.0)
4
+ seatsio (31.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # seatsio-ruby, the official Seats.io Ruby client library
2
2
 
3
- [![Build Status](https://travis-ci.org/seatsio/seatsio-ruby.svg?branch=master)](https://travis-ci.org/seatsio/seatsio-ruby)
3
+ ![Build](https://github.com/seatsio/seatsio-ruby/workflows/Build/badge.svg)
4
4
 
5
5
  This is the official Ruby client library for the [Seats.io V2 REST API](https://docs.seats.io/docs/api-overview), supporting Ruby 2.2.0+
6
6
 
@@ -14,7 +14,7 @@ seatsio-ruby follows semver since v23.3.0.
14
14
 
15
15
  ```ruby
16
16
  require('seatsio')
17
- client = Seatsio::Client.new("my-workspace-secret-key") # can be found on https://app.seats.io/workspace-settings
17
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key") # can be found on https://app.seats.io/workspace-settings
18
18
  chart = client.charts.create
19
19
  event = client.events.create key: chart.key
20
20
  ```
@@ -23,7 +23,7 @@ event = client.events.create key: chart.key
23
23
 
24
24
  ```ruby
25
25
  require('seatsio')
26
- client = Seatsio::Client.new("my-workspace-secret-key")
26
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
27
27
  client.events.book(event.key, ["A-1", "A-2"])
28
28
  ```
29
29
 
@@ -31,7 +31,7 @@ client.events.book(event.key, ["A-1", "A-2"])
31
31
 
32
32
  ```ruby
33
33
  require('seatsio')
34
- client = Seatsio::Client.new("my-workspace-secret-key")
34
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
35
35
  client.events.release(event.key, ["A-1", "A-2"])
36
36
  ```
37
37
 
@@ -39,7 +39,7 @@ client.events.release(event.key, ["A-1", "A-2"])
39
39
 
40
40
  ```ruby
41
41
  require('seatsio')
42
- client = Seatsio::Client.new("my-workspace-secret-key")
42
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
43
43
  client.events.book(event.key, ["A-1", "A-2"], hold_token: "a-hold-token")
44
44
  ```
45
45
 
@@ -47,7 +47,7 @@ client.events.book(event.key, ["A-1", "A-2"], hold_token: "a-hold-token")
47
47
 
48
48
  ```ruby
49
49
  require('seatsio')
50
- client = Seatsio::Client.new("my-workspace-secret-key")
50
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
51
51
  client.events.change_object_status("<EVENT KEY>", ["A-1", "A-2"], "my-custom-status")
52
52
  ```
53
53
 
@@ -55,7 +55,7 @@ client.events.change_object_status("<EVENT KEY>", ["A-1", "A-2"], "my-custom-sta
55
55
 
56
56
  ```ruby
57
57
  require('seatsio')
58
- client = Seatsio::Client.new("my-workspace-secret-key")
58
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
59
59
  charts = client.charts.list
60
60
  charts.each do |chart|
61
61
  puts chart.key
@@ -101,7 +101,7 @@ end
101
101
 
102
102
  ```ruby
103
103
  require('seatsio')
104
- client = Seatsio::Client.new("my-company-admin-key")
104
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-company-admin-key")
105
105
  client.workspaces.create name: "a workspace"
106
106
  ```
107
107
 
data/lib/seatsio.rb CHANGED
@@ -9,12 +9,12 @@ require 'seatsio/event_reports'
9
9
  require 'seatsio/usage_reports'
10
10
 
11
11
  module Seatsio
12
- # Main Seatsio Class
13
12
  class Client
14
13
  attr_reader :charts, :subaccounts, :workspaces, :events,
15
14
  :hold_tokens, :chart_reports, :event_reports, :usage_reports
16
15
 
17
- def initialize(secret_key, workspace_key = nil, base_url = 'https://api.seatsio.net')
16
+ def initialize(region, secret_key, workspace_key = nil)
17
+ base_url = region.url
18
18
  @charts = ChartsClient.new(secret_key, workspace_key, base_url)
19
19
  @subaccounts = SubaccountsClient.new(secret_key, workspace_key, base_url)
20
20
  @workspaces = WorkspacesClient.new(secret_key, base_url)
@@ -25,4 +25,32 @@ module Seatsio
25
25
  @usage_reports = UsageReportsClient.new(secret_key, workspace_key, base_url)
26
26
  end
27
27
  end
28
+
29
+ class Region
30
+ attr_reader :url
31
+
32
+ def initialize(url)
33
+ @url = url
34
+ end
35
+
36
+ def self.EU()
37
+ return Region.new(Region.url_for_id("eu"))
38
+ end
39
+
40
+ def self.NA()
41
+ return Region.new(Region.url_for_id("na"))
42
+ end
43
+
44
+ def self.SA()
45
+ return Region.new(Region.url_for_id("sa"))
46
+ end
47
+
48
+ def self.OC()
49
+ return Region.new(Region.url_for_id("oc"))
50
+ end
51
+
52
+ def self.url_for_id(id)
53
+ return "https://api-" + id + ".seatsio.net"
54
+ end
55
+ end
28
56
  end
@@ -28,7 +28,7 @@ module Seatsio
28
28
  params = book_whole_tables.nil? ? {} : { bookWholeTables: book_whole_tables }
29
29
  url = "reports/charts/#{chart_key}/#{report_type}"
30
30
  body = @http_client.get(url, params)
31
- Domain::ChartReport.new(body)
31
+ ChartReport.new(body)
32
32
  end
33
33
  end
34
34
  end
@@ -13,24 +13,24 @@ module Seatsio
13
13
 
14
14
  def initialize(secret_key, workspace_key, base_url)
15
15
  @http_client = Seatsio::HttpClient.new(secret_key, workspace_key, base_url)
16
- @archive = Pagination::Cursor.new(Domain::Chart, 'charts/archive', @http_client)
16
+ @archive = Pagination::Cursor.new(Chart, 'charts/archive', @http_client)
17
17
  end
18
18
 
19
- # @return [Seatsio::Domain::Chart]
19
+ # @return [Seatsio::Chart]
20
20
  def retrieve(chart_key)
21
21
  response = @http_client.get("charts/#{chart_key}")
22
- Domain::Chart.new(response)
22
+ Chart.new(response)
23
23
  end
24
24
 
25
25
  def retrieve_with_events(chart_key)
26
26
  response = @http_client.get("charts/#{chart_key}?expand=events")
27
- Domain::Chart.new(response)
27
+ Chart.new(response)
28
28
  end
29
29
 
30
30
  def create(name: nil, venue_type: nil, categories: nil)
31
31
  payload = build_chart_request name: name, venue_type: venue_type, categories: categories
32
32
  response = @http_client.post('charts', payload)
33
- Domain::Chart.new(response)
33
+ Chart.new(response)
34
34
  end
35
35
 
36
36
  def update(key:, new_name: nil, categories: nil)
@@ -48,24 +48,24 @@ module Seatsio
48
48
 
49
49
  def copy(key)
50
50
  response = @http_client.post("charts/#{key}/version/published/actions/copy")
51
- Domain::Chart.new(response)
51
+ Chart.new(response)
52
52
  end
53
53
 
54
54
  def copy_to_subaccount(chart_key, subaccount_id)
55
55
  url = "charts/#{chart_key}/version/published/actions/copy-to/#{subaccount_id}"
56
56
  response = @http_client.post url
57
- Domain::Chart.new(response)
57
+ Chart.new(response)
58
58
  end
59
59
 
60
60
  def copy_to_workspace(chart_key, to_workspace_key)
61
61
  url = "charts/#{chart_key}/version/published/actions/copy-to-workspace/#{to_workspace_key}"
62
62
  response = @http_client.post url
63
- Domain::Chart.new(response)
63
+ Chart.new(response)
64
64
  end
65
65
 
66
66
  def copy_draft_version(key)
67
67
  response = @http_client.post("charts/#{key}/version/draft/actions/copy")
68
- Domain::Chart.new(response)
68
+ Chart.new(response)
69
69
  end
70
70
 
71
71
  def retrieve_published_version(key)
@@ -98,7 +98,7 @@ module Seatsio
98
98
  end
99
99
 
100
100
  def list(chart_filter: nil, tag: nil, expand_events: nil, with_validation: false)
101
- cursor = Pagination::Cursor.new(Domain::Chart, 'charts', @http_client)
101
+ cursor = Pagination::Cursor.new(Chart, 'charts', @http_client)
102
102
  cursor.set_query_param('filter', chart_filter)
103
103
  cursor.set_query_param('tag', tag)
104
104
 
@@ -123,12 +123,12 @@ module Seatsio
123
123
 
124
124
  def validate_published_version(chart_key)
125
125
  response = @http_client.post("charts/#{chart_key}/version/published/actions/validate")
126
- Seatsio::Domain::ChartValidationResult.new(response)
126
+ Seatsio::ChartValidationResult.new(response)
127
127
  end
128
128
 
129
129
  def validate_draft_version(chart_key)
130
130
  response = @http_client.post("charts/#{chart_key}/version/draft/actions/validate")
131
- Seatsio::Domain::ChartValidationResult.new(response)
131
+ Seatsio::ChartValidationResult.new(response)
132
132
  end
133
133
 
134
134
  private
@@ -1,6 +1,6 @@
1
1
  require 'seatsio/util'
2
2
 
3
- module Seatsio::Domain
3
+ module Seatsio
4
4
 
5
5
  module_function
6
6
 
@@ -22,10 +22,19 @@ module Seatsio::Domain
22
22
  @archived = data['archived']
23
23
  @validation = data['validation']
24
24
  @social_distancing_rulesets = data['socialDistancingRulesets'].map {
25
- |key, r| [key, SocialDistancingRuleset.new(r['name'], r['numberOfDisabledSeatsToTheSides'], r['disableSeatsInFrontAndBehind'],
26
- r['numberOfDisabledAisleSeats'], r['maxGroupSize'],
27
- r['maxOccupancyAbsolute'], r['maxOccupancyPercentage'], r['oneGroupPerTable'], r['fixedGroupLayout'],
28
- r['disabledSeats'], r['enabledSeats'], r['index'])]
25
+ |key, r| [key, SocialDistancingRuleset.new(r['name'],
26
+ number_of_disabled_seats_to_the_sides: r['numberOfDisabledSeatsToTheSides'],
27
+ disable_seats_in_front_and_behind: r['disableSeatsInFrontAndBehind'],
28
+ disable_diagonal_seats_in_front_and_behind: r['disableDiagonalSeatsInFrontAndBehind'],
29
+ number_of_disabled_aisle_seats: r['numberOfDisabledAisleSeats'],
30
+ max_group_size: r['maxGroupSize'],
31
+ max_occupancy_absolute: r['maxOccupancyAbsolute'],
32
+ max_occupancy_percentage: r['maxOccupancyPercentage'],
33
+ one_group_per_table: r['oneGroupPerTable'],
34
+ fixed_group_layout: r['fixedGroupLayout'],
35
+ disabled_seats: r['disabledSeats'],
36
+ enabled_seats: r['enabledSeats'],
37
+ index: r['index'])]
29
38
  }.to_h
30
39
  end
31
40
  end
@@ -61,6 +70,38 @@ module Seatsio::Domain
61
70
  end
62
71
  end
63
72
 
73
+ class TableBookingConfig
74
+
75
+ attr_reader :mode, :tables
76
+
77
+ def initialize(mode, tables = nil)
78
+ @mode = mode
79
+ @tables = tables
80
+ end
81
+
82
+ def self.inherit
83
+ TableBookingConfig.new('INHERIT')
84
+ end
85
+
86
+ def self.all_by_seat
87
+ TableBookingConfig.new('ALL_BY_SEAT')
88
+ end
89
+
90
+ def self.all_by_table
91
+ TableBookingConfig.new('ALL_BY_TABLE')
92
+ end
93
+
94
+ def self.custom(tables)
95
+ TableBookingConfig.new('CUSTOM', tables)
96
+ end
97
+
98
+ def self.from_json(data)
99
+ if data
100
+ TableBookingConfig.new(data['mode'], data['tables'])
101
+ end
102
+ end
103
+ end
104
+
64
105
  class Channel
65
106
  attr_reader :key, :name, :color, :index, :objects
66
107
 
@@ -84,17 +125,16 @@ module Seatsio::Domain
84
125
 
85
126
  class Event
86
127
 
87
- attr_accessor :id, :key, :chart_key, :book_whole_tables, :supports_best_available,
88
- :table_booking_modes, :for_sale_config, :created_on, :updated_on, :channels,
128
+ attr_accessor :id, :key, :chart_key, :supports_best_available,
129
+ :table_booking_config, :for_sale_config, :created_on, :updated_on, :channels,
89
130
  :social_distancing_ruleset_key
90
131
 
91
132
  def initialize(data)
92
133
  @id = data['id']
93
134
  @key = data['key']
94
135
  @chart_key = data['chartKey']
95
- @book_whole_tables = data['bookWholeTables']
96
136
  @supports_best_available = data['supportsBestAvailable']
97
- @table_booking_modes = data['tableBookingModes']
137
+ @table_booking_config = TableBookingConfig::from_json(data['tableBookingConfig'])
98
138
  @for_sale_config = ForSaleConfig.new(data['forSaleConfig']) if data['forSaleConfig']
99
139
  @created_on = parse_date(data['createdOn'])
100
140
  @updated_on = parse_date(data['updatedOn'])
@@ -185,7 +225,7 @@ module Seatsio::Domain
185
225
  attr_reader :objects
186
226
 
187
227
  def initialize(data)
188
- @objects = Seatsio::Domain.to_object_details(data['objects']);
228
+ @objects = Seatsio.to_object_details(data['objects']);
189
229
  end
190
230
  end
191
231
 
@@ -217,14 +257,14 @@ module Seatsio::Domain
217
257
  def initialize(data)
218
258
  @next_to_each_other = data['nextToEachOther']
219
259
  @objects = data['objects']
220
- @object_details = Seatsio::Domain.to_object_details(data['objectDetails'])
260
+ @object_details = Seatsio.to_object_details(data['objectDetails'])
221
261
  end
222
262
  end
223
263
 
224
264
  class ChartReportItem
225
265
 
226
266
  attr_reader :label, :labels, :category_key, :category_label, :section, :entrance, :capacity, :object_type,
227
- :left_neighbour, :right_neighbour
267
+ :left_neighbour, :right_neighbour, :book_as_a_whole
228
268
 
229
269
  def initialize(data)
230
270
  @label = data['label']
@@ -237,6 +277,7 @@ module Seatsio::Domain
237
277
  @object_type = data['objectType']
238
278
  @left_neighbour = data['leftNeighbour']
239
279
  @right_neighbour = data['rightNeighbour']
280
+ @book_as_a_whole = data['bookAsAWhole']
240
281
  end
241
282
  end
242
283
 
@@ -287,7 +328,8 @@ module Seatsio::Domain
287
328
  :category_key, :entrance, :object_type, :hold_token, :category_label,
288
329
  :ticket_type, :num_booked, :num_free, :num_held, :for_sale, :section,
289
330
  :is_accessible, :is_companion_seat, :has_restricted_view, :displayed_object_type,
290
- :left_neighbour, :right_neighbour, :is_selectable, :is_disabled_by_social_distancing, :channel
331
+ :left_neighbour, :right_neighbour, :is_selectable, :is_disabled_by_social_distancing, :channel,
332
+ :book_as_a_whole
291
333
 
292
334
  def initialize(data)
293
335
  @status = data['status']
@@ -316,6 +358,7 @@ module Seatsio::Domain
316
358
  @is_selectable = data['isSelectable']
317
359
  @is_disabled_by_social_distancing = data['isDisabledBySocialDistancing']
318
360
  @channel = data['channel']
361
+ @book_as_a_whole = data['bookAsAWhole']
319
362
  end
320
363
  end
321
364
 
@@ -343,23 +386,14 @@ module Seatsio::Domain
343
386
 
344
387
  class UsageDetails
345
388
 
346
- attr_reader :subaccount
389
+ attr_reader :workspace, :usage_by_chart
347
390
 
348
391
  def initialize(data)
349
- @subaccount = data['subaccount'] ? UsageSubaccount.new(data['subaccount']) : nil
392
+ @workspace = data['workspace']
350
393
  @usage_by_chart = data['usageByChart'].map { |usage| UsageByChart.new(usage) }
351
394
  end
352
395
  end
353
396
 
354
- class UsageSubaccount
355
-
356
- attr_reader :id
357
-
358
- def initialize(data)
359
- @id = data['id']
360
- end
361
- end
362
-
363
397
  class UsageByChart
364
398
 
365
399
  attr_reader :chart, :usage_by_event
@@ -475,15 +509,16 @@ module Seatsio::Domain
475
509
 
476
510
  class SocialDistancingRuleset
477
511
  attr_reader :name, :number_of_disabled_seats_to_the_sides, :disable_seats_in_front_and_behind,
478
- :number_of_disabled_aisle_seats, :max_group_size, :max_occupancy_absolute,
512
+ :disable_diagonal_seats_in_front_and_behind, :number_of_disabled_aisle_seats, :max_group_size, :max_occupancy_absolute,
479
513
  :max_occupancy_percentage, :one_group_per_table, :fixed_group_layout, :disabled_seats, :enabled_seats, :index
480
514
 
481
- def initialize(name, number_of_disabled_seats_to_the_sides = 0, disable_seats_in_front_and_behind = false, number_of_disabled_aisle_seats = 0,
482
- max_group_size = 0, max_occupancy_absolute = 0, max_occupancy_percentage = 0, one_group_per_table = false,
483
- fixed_group_layout = false, disabled_seats = [], enabled_seats = [], index = 0)
515
+ def initialize(name, number_of_disabled_seats_to_the_sides: 0, disable_seats_in_front_and_behind: false, disable_diagonal_seats_in_front_and_behind: false,
516
+ number_of_disabled_aisle_seats: 0, max_group_size: 0, max_occupancy_absolute: 0, max_occupancy_percentage: 0, one_group_per_table: false,
517
+ fixed_group_layout: false, disabled_seats: [], enabled_seats: [], index: 0)
484
518
  @name = name
485
519
  @number_of_disabled_seats_to_the_sides = number_of_disabled_seats_to_the_sides
486
520
  @disable_seats_in_front_and_behind = disable_seats_in_front_and_behind
521
+ @disable_diagonal_seats_in_front_and_behind = disable_diagonal_seats_in_front_and_behind
487
522
  @number_of_disabled_aisle_seats = number_of_disabled_aisle_seats
488
523
  @max_group_size = max_group_size
489
524
  @max_occupancy_absolute = max_occupancy_absolute
@@ -495,22 +530,33 @@ module Seatsio::Domain
495
530
  @index = index
496
531
  end
497
532
 
498
- def self.fixed(name, disabled_seats = [], index = 0)
499
- SocialDistancingRuleset.new(name, 0, false, 0, 0, 0, 0, false, true, disabled_seats, [], index)
533
+ def self.fixed(name, disabled_seats: [], index: 0)
534
+ return SocialDistancingRuleset.new(name, index: index, disabled_seats: disabled_seats, fixed_group_layout: true)
500
535
  end
501
536
 
502
- def self.rule_based(name, number_of_disabled_seats_to_the_sides = 0, disable_seats_in_front_and_behind = false, number_of_disabled_aisle_seats = 0,
503
- max_group_size = 0, max_occupancy_absolute = 0, max_occupancy_percentage = 0, one_group_per_table = false,
504
- disabled_seats = [], enabled_seats = [], index = 0)
505
- SocialDistancingRuleset.new(name, number_of_disabled_seats_to_the_sides, disable_seats_in_front_and_behind, number_of_disabled_aisle_seats,
506
- max_group_size, max_occupancy_absolute, max_occupancy_percentage,
507
- one_group_per_table, false, disabled_seats, enabled_seats, index)
537
+ def self.rule_based(name, number_of_disabled_seats_to_the_sides: 0, disable_seats_in_front_and_behind: false, disable_diagonal_seats_in_front_and_behind: false,
538
+ number_of_disabled_aisle_seats: 0, max_group_size: 0, max_occupancy_absolute: 0, max_occupancy_percentage: 0, one_group_per_table: false,
539
+ disabled_seats: [], enabled_seats: [], index: 0)
540
+ return SocialDistancingRuleset.new(name,
541
+ number_of_disabled_seats_to_the_sides: number_of_disabled_seats_to_the_sides,
542
+ disable_seats_in_front_and_behind: disable_seats_in_front_and_behind,
543
+ disable_diagonal_seats_in_front_and_behind: disable_diagonal_seats_in_front_and_behind,
544
+ number_of_disabled_aisle_seats: number_of_disabled_aisle_seats,
545
+ max_group_size: max_group_size,
546
+ max_occupancy_absolute: max_occupancy_absolute,
547
+ max_occupancy_percentage: max_occupancy_percentage,
548
+ one_group_per_table: one_group_per_table,
549
+ fixed_group_layout: false,
550
+ disabled_seats: disabled_seats,
551
+ enabled_seats: enabled_seats,
552
+ index: index)
508
553
  end
509
554
 
510
555
  def == (other)
511
556
  self.name == other.name &&
512
557
  self.number_of_disabled_seats_to_the_sides == other.number_of_disabled_seats_to_the_sides &&
513
558
  self.disable_seats_in_front_and_behind == other.disable_seats_in_front_and_behind &&
559
+ self.disable_diagonal_seats_in_front_and_behind == other.disable_diagonal_seats_in_front_and_behind &&
514
560
  self.number_of_disabled_aisle_seats == other.number_of_disabled_aisle_seats &&
515
561
  self.max_group_size == other.max_group_size &&
516
562
  self.max_occupancy_absolute == other.max_occupancy_absolute &&
@@ -15,26 +15,50 @@ module Seatsio
15
15
  fetch_summary_report('byStatus', event_key)
16
16
  end
17
17
 
18
+ def deep_summary_by_status(event_key)
19
+ fetch_deep_summary_report('byStatus', event_key)
20
+ end
21
+
18
22
  def summary_by_category_key(event_key)
19
23
  fetch_summary_report('byCategoryKey', event_key)
20
24
  end
21
25
 
26
+ def deep_summary_by_category_key(event_key)
27
+ fetch_deep_summary_report('byCategoryKey', event_key)
28
+ end
29
+
22
30
  def summary_by_category_label(event_key)
23
31
  fetch_summary_report('byCategoryLabel', event_key)
24
32
  end
25
33
 
34
+ def deep_summary_by_category_label(event_key)
35
+ fetch_deep_summary_report('byCategoryLabel', event_key)
36
+ end
37
+
26
38
  def summary_by_section(event_key)
27
39
  fetch_summary_report('bySection', event_key)
28
40
  end
29
41
 
42
+ def deep_summary_by_section(event_key)
43
+ fetch_deep_summary_report('bySection', event_key)
44
+ end
45
+
30
46
  def summary_by_selectability(event_key)
31
47
  fetch_summary_report('bySelectability', event_key)
32
48
  end
33
49
 
50
+ def deep_summary_by_selectability(event_key)
51
+ fetch_deep_summary_report('bySelectability', event_key)
52
+ end
53
+
34
54
  def summary_by_channel(event_key)
35
55
  fetch_summary_report('byChannel', event_key)
36
56
  end
37
57
 
58
+ def deep_summary_by_channel(event_key)
59
+ fetch_deep_summary_report('byChannel', event_key)
60
+ end
61
+
38
62
  def by_label(event_key, label = nil)
39
63
  fetch_report('byLabel', event_key, label)
40
64
  end
@@ -74,15 +98,20 @@ module Seatsio
74
98
  @http_client.get(url)
75
99
  end
76
100
 
101
+ def fetch_deep_summary_report(report_type, event_key)
102
+ url = "reports/events/#{event_key}/#{report_type}/summary/deep"
103
+ @http_client.get(url)
104
+ end
105
+
77
106
  def fetch_report(report_type, event_key, report_filter = nil)
78
107
  if report_filter
79
108
  url = "reports/events/#{event_key}/#{report_type}/#{report_filter}"
80
109
  body = @http_client.get(url)
81
- Domain::EventReport.new(body[report_filter])
110
+ EventReport.new(body[report_filter])
82
111
  else
83
112
  url = "reports/events/#{event_key}/#{report_type}"
84
113
  body = @http_client.get(url)
85
- Domain::EventReport.new(body)
114
+ EventReport.new(body)
86
115
  end
87
116
  end
88
117
  end
@@ -15,22 +15,21 @@ module Seatsio
15
15
  @http_client = ::Seatsio::HttpClient.new(secret_key, workspace_key, base_url)
16
16
  end
17
17
 
18
- def create(chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil, social_distancing_ruleset_key: nil)
19
- payload = build_event_request(chart_key: chart_key, event_key: event_key, book_whole_tables: book_whole_tables,
20
- table_booking_modes: table_booking_modes, social_distancing_ruleset_key: social_distancing_ruleset_key)
18
+ def create(chart_key: nil, event_key: nil, table_booking_config: nil, social_distancing_ruleset_key: nil)
19
+ payload = build_event_request(chart_key: chart_key, event_key: event_key,
20
+ table_booking_config: table_booking_config, social_distancing_ruleset_key: social_distancing_ruleset_key)
21
21
  response = @http_client.post("events", payload)
22
- Domain::Event.new(response)
22
+ Event.new(response)
23
23
  end
24
24
 
25
25
  def create_multiple(key: nil, event_creation_params: nil)
26
26
  payload = build_events_request(chart_key: key, event_creation_params: event_creation_params)
27
27
  response = @http_client.post("events/actions/create-multiple", payload)
28
- Domain::Events.new(response).events
28
+ Events.new(response).events
29
29
  end
30
30
 
31
- def update(key:, chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil, social_distancing_ruleset_key: nil)
32
- payload = build_event_request(chart_key: chart_key, event_key: event_key, book_whole_tables: book_whole_tables,
33
- table_booking_modes: table_booking_modes, social_distancing_ruleset_key: social_distancing_ruleset_key)
31
+ def update(key:, chart_key: nil, event_key: nil, table_booking_config: nil, social_distancing_ruleset_key: nil)
32
+ payload = build_event_request(chart_key: chart_key, event_key: event_key, table_booking_config: table_booking_config, social_distancing_ruleset_key: social_distancing_ruleset_key)
34
33
  @http_client.post("/events/#{key}", payload)
35
34
  end
36
35
 
@@ -47,77 +46,76 @@ module Seatsio
47
46
  def retrieve_object_status(key:, object_key:)
48
47
  url = "events/#{key}/objects/#{CGI::escape(object_key).gsub('+', '%20')}"
49
48
  response = @http_client.get(url)
50
- Domain::ObjectStatus.new(response)
49
+ ObjectStatus.new(response)
51
50
  end
52
51
 
53
- def book(event_key_or_keys, object_or_objects, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
54
- self.change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::BOOKED, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
52
+ def book(event_key_or_keys, object_or_objects, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil, ignore_social_distancing: nil)
53
+ self.change_object_status(event_key_or_keys, object_or_objects, ObjectStatus::BOOKED, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys, ignore_social_distancing: ignore_social_distancing)
55
54
  end
56
55
 
57
- def change_object_status(event_key_or_keys, object_or_objects, status, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
58
- request = create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys)
56
+ def change_object_status(event_key_or_keys, object_or_objects, status, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil, ignore_social_distancing: nil)
57
+ request = create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys, ignore_social_distancing)
59
58
  request[:params] = {
60
59
  :expand => 'objects'
61
60
  }
62
61
  response = @http_client.post("seasons/actions/change-object-status", request)
63
- Domain::ChangeObjectStatusResult.new(response)
62
+ ChangeObjectStatusResult.new(response)
64
63
  end
65
64
 
66
65
  def change_object_status_in_batch(status_change_requests)
67
66
  request = {
68
67
  :statusChanges => status_change_requests,
69
- :params => { :expand => 'objects' }
68
+ :params => {:expand => 'objects'}
70
69
  }
71
70
  response = @http_client.post("events/actions/change-object-status", request)
72
- Domain::ChangeObjectStatusInBatchResult.new(response).results
71
+ ChangeObjectStatusInBatchResult.new(response).results
73
72
  end
74
73
 
75
- def hold(event_key_or_keys, object_or_objects, hold_token, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
76
- change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::HELD, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
74
+ def hold(event_key_or_keys, object_or_objects, hold_token, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil, ignore_social_distancing: nil)
75
+ change_object_status(event_key_or_keys, object_or_objects, ObjectStatus::HELD, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys, ignore_social_distancing: ignore_social_distancing)
77
76
  end
78
77
 
79
78
  def change_best_available_object_status(key, number, status, categories: nil, hold_token: nil, extra_data: nil, ticket_types: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
80
79
  request = create_change_best_available_object_status_request(number, status, categories, extra_data, ticket_types, hold_token, order_id, keep_extra_data, ignore_channels, channel_keys)
81
80
  response = @http_client.post("events/#{key}/actions/change-object-status", request)
82
- Domain::BestAvailableObjects.new(response)
81
+ BestAvailableObjects.new(response)
83
82
  end
84
83
 
85
84
  def book_best_available(key, number, categories: nil, hold_token: nil, order_id: nil, keep_extra_data: nil, extra_data: nil, ticket_types: nil, ignore_channels: nil, channel_keys: nil)
86
- change_best_available_object_status(key, number, Domain::ObjectStatus::BOOKED, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
85
+ change_best_available_object_status(key, number, ObjectStatus::BOOKED, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
87
86
  end
88
87
 
89
88
  def hold_best_available(key, number, hold_token, categories: nil, order_id: nil, keep_extra_data: nil, extra_data: nil, ticket_types: nil, ignore_channels: nil, channel_keys: nil)
90
- change_best_available_object_status(key, number, Domain::ObjectStatus::HELD, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
89
+ change_best_available_object_status(key, number, ObjectStatus::HELD, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
91
90
  end
92
91
 
93
92
  def release(event_key_or_keys, object_or_objects, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
94
- change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::FREE, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
93
+ change_object_status(event_key_or_keys, object_or_objects, ObjectStatus::FREE, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
95
94
  end
96
95
 
97
96
  def delete(key:)
98
97
  @http_client.delete("/events/#{key}")
99
98
  end
100
99
 
101
-
102
100
  def retrieve(key:)
103
101
  response = @http_client.get("events/#{key}")
104
- Domain::Event.new(response)
102
+ Event.new(response)
105
103
  end
106
104
 
107
105
  def list
108
- Pagination::Cursor.new(Domain::Event, 'events', @http_client)
106
+ Pagination::Cursor.new(Event, 'events', @http_client)
109
107
  end
110
108
 
111
109
  def list_status_changes(key, object_id = nil)
112
110
  if object_id != nil
113
111
  status_changes_for_object key: key, object_id: object_id
114
112
  else
115
- Pagination::Cursor.new(Domain::StatusChange, "/events/#{key}/status-changes", @http_client)
113
+ Pagination::Cursor.new(StatusChange, "/events/#{key}/status-changes", @http_client)
116
114
  end
117
115
  end
118
116
 
119
117
  def status_changes_for_object(key:, object_id:)
120
- Pagination::Cursor.new(Domain::StatusChange, "/events/#{key}/objects/#{object_id}/status-changes", @http_client)
118
+ Pagination::Cursor.new(StatusChange, "/events/#{key}/objects/#{object_id}/status-changes", @http_client)
121
119
  end
122
120
 
123
121
  def mark_as_not_for_sale(key:, objects: nil, categories: nil)
@@ -157,12 +155,11 @@ module Seatsio
157
155
  payload
158
156
  end
159
157
 
160
- def build_event_request(chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil, social_distancing_ruleset_key: nil)
158
+ def build_event_request(chart_key: nil, event_key: nil, table_booking_config: nil, social_distancing_ruleset_key: nil)
161
159
  result = {}
162
160
  result["chartKey"] = chart_key if chart_key
163
161
  result["eventKey"] = event_key if event_key
164
- result["bookWholeTables"] = book_whole_tables if book_whole_tables != nil
165
- result["tableBookingModes"] = table_booking_modes if table_booking_modes != nil
162
+ result["tableBookingConfig"] = table_booking_config_to_request(table_booking_config) if table_booking_config != nil
166
163
  result["socialDistancingRulesetKey"] = social_distancing_ruleset_key if social_distancing_ruleset_key != nil
167
164
  result
168
165
  end
@@ -179,12 +176,18 @@ module Seatsio
179
176
  params.each do |param|
180
177
  r = {}
181
178
  r["eventKey"] = param[:event_key] if param[:event_key] != nil
182
- r["bookWholeTables"] = param[:book_whole_tables] if param[:book_whole_tables] != nil
183
- r["tableBookingModes"] = param[:table_booking_modes] if param[:table_booking_modes] != nil
179
+ r["tableBookingConfig"] = table_booking_config_to_request(param[:table_booking_config]) if param[:table_booking_config] != nil
184
180
  result.push(r)
185
181
  end
186
182
  result
187
183
  end
188
184
 
185
+ def table_booking_config_to_request(table_booking_config)
186
+ result = {}
187
+ result["mode"] = table_booking_config.mode
188
+ result["tables"] = table_booking_config.tables if table_booking_config.tables != nil
189
+ result
190
+ end
191
+
189
192
  end
190
193
  end
@@ -1,4 +1,4 @@
1
- def create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys)
1
+ def create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys, ignore_social_distancing)
2
2
  result = {}
3
3
  result[:objects] = normalize(object_or_objects)
4
4
  result[:status] = status
@@ -12,6 +12,7 @@ def create_change_object_status_request(object_or_objects, status, hold_token, o
12
12
  result[:keepExtraData] = keep_extra_data if keep_extra_data != nil
13
13
  result[:ignoreChannels] = ignore_channels if ignore_channels != nil
14
14
  result[:channelKeys] = channel_keys if channel_keys != nil
15
+ result[:ignoreSocialDistancing] = ignore_social_distancing if ignore_social_distancing != nil
15
16
  result
16
17
  end
17
18
 
@@ -21,18 +21,18 @@ module Seatsio
21
21
  body[:expiresInMinutes] = expires_in_minutes
22
22
  end
23
23
  response = @http_client.post('hold-tokens', body)
24
- Domain::HoldToken.new(response)
24
+ HoldToken.new(response)
25
25
  end
26
26
 
27
27
  def retrieve(hold_token)
28
28
  response = @http_client.get("/hold-tokens/#{hold_token}")
29
- Domain::HoldToken.new(response)
29
+ HoldToken.new(response)
30
30
  end
31
31
 
32
32
  def expire_in_minutes(hold_token, expires_in_minutes = nil)
33
33
  body = {"expiresInMinutes": expires_in_minutes}
34
34
  response = @http_client.post("/hold-tokens/#{hold_token}", body)
35
- Domain::HoldToken.new(response)
35
+ HoldToken.new(response)
36
36
  end
37
37
  end
38
38
  end
@@ -17,7 +17,7 @@ module Seatsio
17
17
  body['name'] = name if name
18
18
 
19
19
  response = @http_client.post("subaccounts", body)
20
- Domain::Subaccount.new(response)
20
+ Subaccount.new(response)
21
21
  end
22
22
 
23
23
  def update(id:, name: nil)
@@ -50,17 +50,17 @@ module Seatsio
50
50
 
51
51
  def retrieve(id:)
52
52
  response = @http_client.get("/subaccounts/#{id}")
53
- Domain::Subaccount.new(response)
53
+ Subaccount.new(response)
54
54
  end
55
55
 
56
56
  def copy_chart_to_parent(id: nil, chart_key: nil)
57
57
  response = @http_client.post("/subaccounts/#{id}/charts/#{chart_key}/actions/copy-to/parent")
58
- Domain::Chart.new(response)
58
+ Chart.new(response)
59
59
  end
60
60
 
61
61
  def copy_chart_to_subaccount(from_id: nil, to_id: nil, chart_key: nil)
62
62
  response = @http_client.post("/subaccounts/#{from_id}/charts/#{chart_key}/actions/copy-to/#{to_id}")
63
- Domain::Chart.new(response)
63
+ Chart.new(response)
64
64
  end
65
65
 
66
66
  def regenerate_secret_key(id:)
@@ -75,7 +75,7 @@ module Seatsio
75
75
 
76
76
  def cursor(status: nil)
77
77
  endpoint = status ? "subaccounts/#{status}" : 'subaccounts'
78
- Pagination::Cursor.new(Domain::Subaccount, endpoint, @http_client)
78
+ Pagination::Cursor.new(Subaccount, endpoint, @http_client)
79
79
  end
80
80
  end
81
81
  end
@@ -13,19 +13,19 @@ module Seatsio
13
13
  def summary_for_all_months
14
14
  url = "reports/usage"
15
15
  body = @http_client.get(url)
16
- Domain::UsageSummaryForAllMoths.new(body)
16
+ UsageSummaryForAllMoths.new(body)
17
17
  end
18
18
 
19
19
  def details_for_month(month)
20
20
  url = "reports/usage/month/" + month.serialize
21
21
  body = @http_client.get(url)
22
- body.map { |item| Domain::UsageDetails.new(item) }
22
+ body.map { |item| UsageDetails.new(item) }
23
23
  end
24
24
 
25
25
  def details_for_event_in_month(eventId, month)
26
26
  url = "reports/usage/month/" + month.serialize + "/event/" + eventId.to_s
27
27
  body = @http_client.get(url)
28
- body.map { |item| Domain::UsageForObject.new(item) }
28
+ body.map { |item| UsageForObject.new(item) }
29
29
  end
30
30
  end
31
31
  end
@@ -1,3 +1,3 @@
1
1
  module Seatsio
2
- VERSION = "26.2.0"
2
+ VERSION = "31.0.0"
3
3
  end
@@ -18,7 +18,7 @@ module Seatsio
18
18
  body['isTest'] = is_test if is_test
19
19
 
20
20
  response = @http_client.post("workspaces", body)
21
- Domain::Workspace.new(response)
21
+ Workspace.new(response)
22
22
  end
23
23
 
24
24
  def update(key:, name:)
@@ -52,13 +52,13 @@ module Seatsio
52
52
 
53
53
  def retrieve(key:)
54
54
  response = @http_client.get("/workspaces/#{key}")
55
- Domain::Workspace.new(response)
55
+ Workspace.new(response)
56
56
  end
57
57
 
58
58
  private
59
59
 
60
60
  def cursor()
61
- Pagination::Cursor.new(Domain::Workspace, 'workspaces', @http_client)
61
+ Pagination::Cursor.new(Workspace, 'workspaces', @http_client)
62
62
  end
63
63
  end
64
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seatsio
3
3
  version: !ruby/object:Gem::Version
4
- version: 26.2.0
4
+ version: 31.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seats.io
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-01 00:00:00.000000000 Z
11
+ date: 2021-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,9 +100,10 @@ extensions: []
100
100
  extra_rdoc_files: []
101
101
  files:
102
102
  - ".editorconfig"
103
+ - ".github/workflows/build.yml"
104
+ - ".github/workflows/publish.yml"
103
105
  - ".gitignore"
104
106
  - ".ruby-version"
105
- - ".travis.yml"
106
107
  - Gemfile
107
108
  - Gemfile.lock
108
109
  - README.md
@@ -132,7 +133,7 @@ files:
132
133
  homepage: http://seats.io
133
134
  licenses: []
134
135
  metadata: {}
135
- post_install_message:
136
+ post_install_message:
136
137
  rdoc_options: []
137
138
  require_paths:
138
139
  - lib
@@ -147,8 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
148
  - !ruby/object:Gem::Version
148
149
  version: '0'
149
150
  requirements: []
150
- rubygems_version: 3.0.8
151
- signing_key:
151
+ rubygems_version: 3.1.2
152
+ signing_key:
152
153
  specification_version: 4
153
154
  summary: the official Seats.io Ruby client library
154
155
  test_files: []
data/.travis.yml DELETED
@@ -1,19 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.3.0
5
- before_install: gem install bundler -v 1.16.1
6
- notifications:
7
- slack:
8
- rooms:
9
- - seatsio:AGaZISx4HlvoEx6WTbVaX50V
10
- on_pull_requests: false
11
- on_failure: always
12
- on_success: change
13
- deploy:
14
- provider: rubygems
15
- gem: seatsio
16
- on:
17
- tags: true
18
- api_key:
19
- secure: mQmsVgbIYF16i0rzDYQoOzcXwG8ppJl/czjTWf/KaEtSCWG5tQKBzflXFIkrfoP7EyjC+2TvT4Z5tWIBUVR4gG2KjcV2lGgq2vV/sVYrmUIXO2LZHBu5n35QHBF//0IOvbZMufm7W8PIVM6do1tMxdRE+qMZVtb5M9YIQpDHc6jXru/PKxOffwTNEWMVX1Xjfz4wtuJCpvhR+BHuBoi9uE4dyWrF5WgkL2aELUvHpUmc2wn0gGypqJ9Whrcxq8n3EREvO0kiSMww+MMdWd57ACo4q5J8Za+h4tXvVd49EyEdevjWMvT0wYx+nSz+/vk4B9vOmd5Un9/gzoLbq8qEpAgEHXKw/J6l9KHlJDMNy2dVsMzqSOceEtBx5LA0fizWD4U2XfI0GaiM5Rdt96iNtVlU9lQuiXPhcz7igEFVRSZAkzTNHlh0cAr2FJIBBh27fffrblF/xRw1ziLwDnjutTg8lZsxmdjTrnMkAAuNWMIXKzWvh7n2bZ+jqwzp5bSqp1ckOCae7ozsG1Kx1eS8pMepsvMtmb5w6dsuWGVAI8ASd8XmYFHKisKmi6xHYOGw7uy7yE7rXHa0Ypx/K4xKCoqhv+5Y7RdTvT2tkqC0mwMOh/Io2eslgjTA0vy87sVKyLTCU/ElKRTd2165cRL2JRNH3l/X0gxglT4WpXQEEXs=