renalware-core 2.0.106 → 2.0.108
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 +4 -4
- data/app/documents/renalware/blood_group.rb +1 -1
- data/app/documents/renalware/hd/profile_document.rb +1 -1
- data/app/models/renalware/hd/prescription_administration.rb +1 -0
- data/app/models/renalware/ukrdc/treatment_timeline/generator_factory.rb +3 -1
- data/app/models/renalware/ukrdc/treatment_timeline/hd/generator.rb +1 -1
- data/app/models/renalware/ukrdc/treatment_timeline/transplant/generator.rb +113 -0
- data/app/presenters/renalware/ukrdc/patient_presenter.rb +5 -0
- data/app/views/renalware/api/ukrdc/patients/_clinic_visit_observation.xml.builder +16 -14
- data/app/views/renalware/api/ukrdc/patients/_hd_session_observations.xml.builder +12 -10
- data/app/views/renalware/hd/sessions/form/_drugs_to_be_administered.html.slim +31 -31
- data/app/views/renalware/medications/prescriptions/_table.html.slim +1 -1
- data/config/locales/renalware/hd/profile.yml +8 -0
- data/lib/renalware/configuration.rb +2 -0
- data/lib/renalware/version.rb +1 -1
- data/spec/factories/ukrdc/modality_codes.rb +54 -0
- metadata +7 -7
- data/app/models/renalware/ukrdc/treatment_timeline/transplant/generator.rb.wip +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ddbc1bf89e7d3c6d32c617656f612b98929fab1110a56a48e52d53cc74251c0
|
4
|
+
data.tar.gz: a63750e0fc7606ae785449cef68320c84ceedebd983a4ca568341cea7bdf511b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96ada68134d8d5a5fd76092e38a562ab0c3efdee4c6f7b3d2fc3eac00ef9ea2c7a51f97c43bed32c4647cb39da9e2b3243150f00001575a004d49d44f28310cd
|
7
|
+
data.tar.gz: 5539d4f554e53988a5de121af668fbaf7ae06fc709cf1c88aa3dac31a6e301238813b670dc2c255d2aa8d28079923f531facd3d459842ee12dc9c3a0debe2d14
|
@@ -47,7 +47,7 @@ module Renalware
|
|
47
47
|
attribute :dialysis, Dialysis
|
48
48
|
|
49
49
|
class Anticoagulant < Document::Embedded
|
50
|
-
attribute :type, Document::Enum
|
50
|
+
attribute :type, Document::Enum # See .yml file for values
|
51
51
|
attribute :loading_dose
|
52
52
|
attribute :hourly_dose
|
53
53
|
attribute :stop_time
|
@@ -13,7 +13,9 @@ module Renalware
|
|
13
13
|
# Each modality_description has a :code fiekd
|
14
14
|
def self.call(modality)
|
15
15
|
type = modality.description.code&.to_s&.camelize
|
16
|
-
(klass_for(type) || klass_for(DEFAULT_TYPE)).new(modality)
|
16
|
+
klass = (klass_for(type) || klass_for(DEFAULT_TYPE)).new(modality)
|
17
|
+
Rails.logger.info "GeneratorFactory type = #{type} class = #{klass}"
|
18
|
+
klass
|
17
19
|
end
|
18
20
|
|
19
21
|
def self.klass_for(type)
|
@@ -80,7 +80,7 @@ module Renalware
|
|
80
80
|
# - change of site
|
81
81
|
# - change of hd_type to from hd and (hdf_pre || hdf_post)
|
82
82
|
# - change of hd prescription
|
83
|
-
# Loop through the hd_profiles and trigger
|
83
|
+
# Loop through the hd_profiles and trigger a new treatment when any of these change
|
84
84
|
# There is a problem here as we are creating duplicate treatments
|
85
85
|
# I think we need to first find the hd profile that is associated with the hd modality
|
86
86
|
# and that becomes the 'last_profile' here
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_dependency "renalware/ukrdc"
|
4
|
+
require "attr_extras"
|
5
|
+
|
6
|
+
# QBL TXT Description
|
7
|
+
# "20" "20" "Transplant ; Cadaver donor"
|
8
|
+
# "21" "21" "Transplant ; Live related - sibling"
|
9
|
+
# "74" "74" "Transplant ; Live related - father"
|
10
|
+
# "75" "75" "Transplant ; Live related - mother"
|
11
|
+
# "77" "77" "Transplant ; Live related - child"
|
12
|
+
# "23" "23" "Transplant ; Live related - other"
|
13
|
+
# "24" "24" "Transplant ; Live genetically unrelated"
|
14
|
+
# "25" "25" "Transplant ; Cadaver donor + transp other organ"
|
15
|
+
# "26" "26" "Transplant ; Live donor + transplant other organ"
|
16
|
+
# "27" "27" "Transplant ; Live donor non-UK transplant"
|
17
|
+
# "28" "28" "Transplant ; non-heart-beating donor"
|
18
|
+
# "29" "29" "Transplant ; type unknown"
|
19
|
+
module Renalware
|
20
|
+
module UKRDC
|
21
|
+
module TreatmentTimeline
|
22
|
+
module Transplant
|
23
|
+
class Generator
|
24
|
+
pattr_initialize :modality
|
25
|
+
delegate :patient, to: :modality
|
26
|
+
|
27
|
+
UKRR_TXT = {
|
28
|
+
cadaver: 20,
|
29
|
+
unknown: 29,
|
30
|
+
live_related_other: 23,
|
31
|
+
live_related_sibling: 21,
|
32
|
+
live_related_father: 74,
|
33
|
+
live_related_mother: 75,
|
34
|
+
live_related_child: 77,
|
35
|
+
non_heart_beating: 28,
|
36
|
+
live_unrelated: 24
|
37
|
+
}.freeze
|
38
|
+
|
39
|
+
# We need to create a treatment record to match the UKRDC code expectations
|
40
|
+
# based on donor relationship.
|
41
|
+
# Otherwise Default to 29 Transplant ; type unknown
|
42
|
+
def call
|
43
|
+
create_treatment
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def create_treatment
|
49
|
+
operation
|
50
|
+
Treatment.create!(
|
51
|
+
patient: modality.patient,
|
52
|
+
clinician: modality.created_by,
|
53
|
+
started_on: modality.started_on,
|
54
|
+
modality_id: modality.id,
|
55
|
+
modality_description_id: modality.description_id,
|
56
|
+
ended_on: modality.ended_on,
|
57
|
+
modality_code: ukrr_modality_code
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
def unknown_transplant_ukrr_modality_code
|
62
|
+
ukrr_modality_code_for_txt(UKRR_TXT[:unknown])
|
63
|
+
end
|
64
|
+
|
65
|
+
def ukrr_modality_code
|
66
|
+
return unknown_transplant_ukrr_modality_code if operation.nil?
|
67
|
+
return unknown_transplant_ukrr_modality_code if donor_type.nil?
|
68
|
+
|
69
|
+
if donor_type == :live_related
|
70
|
+
ukrr_modality_code_for_live_donor_relationship
|
71
|
+
else
|
72
|
+
ukrr_modality_code_for_txt(UKRR_TXT[donor_type])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def donor_type
|
77
|
+
operation.document.donor.type&.to_sym
|
78
|
+
end
|
79
|
+
|
80
|
+
def donor_relationship
|
81
|
+
operation.document.donor.relationship&.to_sym
|
82
|
+
end
|
83
|
+
|
84
|
+
# rubocop:disable Style/StringLiterals
|
85
|
+
def ukrr_modality_code_for_live_donor_relationship
|
86
|
+
key = :"live_related_#{donor_relationship || 'other'}"
|
87
|
+
ukrr_modality_code_for_txt(UKRR_TXT.fetch(key))
|
88
|
+
end
|
89
|
+
# rubocop:enable Style/StringLiterals
|
90
|
+
|
91
|
+
def ukrr_modality_code_for_txt(txt_code)
|
92
|
+
UKRDC::ModalityCode.find_by(txt_code: txt_code)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Try and select an operation within the start and end dates of the modality
|
96
|
+
def operation
|
97
|
+
@operation ||= begin
|
98
|
+
Renalware::Transplants::RecipientOperation
|
99
|
+
.for_patient(patient)
|
100
|
+
.where(
|
101
|
+
"performed_on >= ? and performed_on <= ?",
|
102
|
+
modality.started_on,
|
103
|
+
modality.ended_on || Time.zone.today
|
104
|
+
)
|
105
|
+
.order(performed_on: :desc)
|
106
|
+
.first
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -62,11 +62,16 @@ module Renalware
|
|
62
62
|
)
|
63
63
|
end
|
64
64
|
|
65
|
+
# Use DISTINCT ON (performed_on) and an order(performed_on: :desc) to make sure we only
|
66
|
+
# get one hd session per day - the last of the day. This is becuase currrently RW allows
|
67
|
+
# a duplicate session to be added, and this occasionally happens.
|
65
68
|
def finished_hd_sessions
|
66
69
|
hd_patient
|
67
70
|
.finished_hd_sessions
|
68
71
|
.includes(:patient, :dialysate, :updated_by)
|
72
|
+
.select("distinct on (hd_sessions.performed_on) *")
|
69
73
|
.where("hd_sessions.updated_at > ?", changes_since)
|
74
|
+
.order(performed_on: :desc)
|
70
75
|
end
|
71
76
|
|
72
77
|
def current_registration_status_rr_code
|
@@ -1,23 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
measurement = visit.public_send(method)
|
4
4
|
|
5
|
-
|
5
|
+
if measurement.present? && measurement.to_f.nonzero?
|
6
|
+
xml = builder
|
7
|
+
i18n_key ||= method
|
6
8
|
|
7
|
-
|
8
|
-
xml.
|
9
|
-
xml.ObservationTime visit.datetime
|
9
|
+
xml.Observation do
|
10
|
+
xml.ObservationTime visit.datetime
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
xml.ObservationCode do
|
13
|
+
xml.CodingStandard "UKRR"
|
14
|
+
xml.Code I18n.t("loinc.#{i18n_key}.code")
|
15
|
+
xml.Description I18n.t("loinc.#{i18n_key}.description")
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
18
|
+
xml.ObservationValue measurement
|
19
|
+
xml.ObservationUnits I18n.t("loinc.#{i18n_key}.units")
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
xml.Clinician do
|
22
|
+
xml.Description visit.updated_by&.to_s
|
23
|
+
end
|
22
24
|
end
|
23
25
|
end
|
@@ -18,17 +18,19 @@ observation_times = {
|
|
18
18
|
}
|
19
19
|
|
20
20
|
measurements.each do |i18n_key, value|
|
21
|
-
|
22
|
-
xml.
|
23
|
-
|
24
|
-
xml.
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
if value.present? && value.to_f.nonzero?
|
22
|
+
xml.Observation do
|
23
|
+
xml.ObservationTime observation_times[pre_post].iso8601
|
24
|
+
xml.ObservationCode do
|
25
|
+
xml.CodingStandard "UKRR"
|
26
|
+
xml.Code I18n.t("loinc.#{i18n_key}.code")
|
27
|
+
xml.Description I18n.t("loinc.#{i18n_key}.description")
|
28
|
+
end
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
xml.ObservationValue value
|
31
|
+
xml.ObservationUnits I18n.t("loinc.#{i18n_key}.units")
|
32
|
+
xml.PrePost pre_post.to_s.upcase # eg PRE or POST
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -18,8 +18,7 @@
|
|
18
18
|
when false then "not-administered"
|
19
19
|
else "undecided"
|
20
20
|
end
|
21
|
-
|
22
|
-
#- administration_klass = "undecided" if administration.administered.nil?
|
21
|
+
|
23
22
|
.hd-drug-administration(
|
24
23
|
data-token-count="#{'2' if administration.administrator_authorised? && administration.witness_authorised?}"
|
25
24
|
class="#{administration_klass}"
|
@@ -51,34 +50,35 @@
|
|
51
50
|
= fpa.label :reason_id
|
52
51
|
= fpa.association :reason, wrapper: :zilch
|
53
52
|
|
54
|
-
.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
- if Renalware.config.hd_session_prescriptions_require_signoff
|
54
|
+
.authentication(
|
55
|
+
class="#{'disabled-with-faded-overlay' unless administration.administered?}"
|
56
|
+
data-authentication-url=renalware.hd_prescription_administration_authorisations_path
|
57
|
+
)
|
58
|
+
/ Output username and password fields for administrator and witness
|
59
|
+
- { administrator: :administered, witness: :witnessed }.each do |user_role, prefix|
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
61
|
+
- authorised = administration.public_send(:"#{user_role}_authorised?")
|
62
|
+
- token_symbol = :"#{user_role}_authorisation_token"
|
63
|
+
.user-and-password(
|
64
|
+
class="user-and-password--#{user_role} #{'authorised' if authorised} #{'error' if fpa.object.errors[token_symbol].any?}"
|
65
|
+
)
|
66
|
+
= fpa.hidden_field token_symbol, class: "authentication-token"
|
67
|
+
= fpa.label :"#{prefix}_by"
|
68
|
+
= fpa.association :"#{prefix}_by",
|
69
|
+
as: :user_picker,
|
70
|
+
collection: Renalware::User.ordered,
|
71
|
+
wrapper: :zilch,
|
72
|
+
label: false,
|
73
|
+
input_html: { class: "authentication-user-id" }
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
75
|
+
/ Password is only visible as long as the user has not been authenticated
|
76
|
+
= password_field_tag :"#{prefix}_by_password",
|
77
|
+
"",
|
78
|
+
placeholder: "Password",
|
79
|
+
class: "user-password",
|
80
|
+
autocomplete: :off
|
81
|
+
small.error.invalid-password Invalid password
|
82
|
+
.confirmed
|
83
|
+
i.fas.fa-check-circle
|
84
|
+
= link_to "Clear", "#", class: "user-and-password--clear"
|
@@ -51,6 +51,14 @@ en:
|
|
51
51
|
hdf_pre: HDF-PRE
|
52
52
|
hdf_post: HDF-POST
|
53
53
|
|
54
|
+
renalware/hd/profile_document/anticoagulant:
|
55
|
+
# The host app should implement this I18n key to specify available coagulants.
|
56
|
+
# See e.g. dummy/config/locales for anticoagulant types
|
57
|
+
# We always specify a Non option because enumerize complains if the key is not
|
58
|
+
# a non-empty array.
|
59
|
+
type:
|
60
|
+
none: None
|
61
|
+
|
54
62
|
renalware/hd/profile_document/transport:
|
55
63
|
type:
|
56
64
|
ambulance_wheelchair: Ambulance (wheelchair)
|
@@ -83,6 +83,8 @@ module Renalware
|
|
83
83
|
# of the PDF so we can examine its content
|
84
84
|
config_accessor(:render_pdf_as_html_for_debugging) { false }
|
85
85
|
|
86
|
+
config_accessor(:hd_session_prescriptions_require_signoff) { true }
|
87
|
+
|
86
88
|
# A host app can override this to add/remove/re-order the clinical summary display
|
87
89
|
# Note these have to be strings - they mapped to constants in ClinicalSummaryPresenter.
|
88
90
|
config_accessor(:page_layouts) {
|
data/lib/renalware/version.rb
CHANGED
@@ -43,5 +43,59 @@ FactoryBot.define do
|
|
43
43
|
txt_code { 111 }
|
44
44
|
qbl_code { 111 }
|
45
45
|
end
|
46
|
+
|
47
|
+
trait :type_unknown do
|
48
|
+
description { "Transplant ; type unknown" }
|
49
|
+
txt_code { 29 }
|
50
|
+
qbl_code { 29 }
|
51
|
+
end
|
52
|
+
|
53
|
+
trait :cadaver do
|
54
|
+
description { "Transplant ; Cadaver donor" }
|
55
|
+
txt_code { 20 }
|
56
|
+
qbl_code { 20 }
|
57
|
+
end
|
58
|
+
|
59
|
+
trait :live_related_sibling do
|
60
|
+
description { "Transplant ; Transplant; Live related - sibling" }
|
61
|
+
txt_code { 21 }
|
62
|
+
qbl_code { 21 }
|
63
|
+
end
|
64
|
+
|
65
|
+
trait :live_related_father do
|
66
|
+
description { "Transplant ; Transplant; Live related - father" }
|
67
|
+
txt_code { 74 }
|
68
|
+
qbl_code { 74 }
|
69
|
+
end
|
70
|
+
|
71
|
+
trait :live_related_mother do
|
72
|
+
description { "Transplant ; Transplant; Live related - mother" }
|
73
|
+
txt_code { 75 }
|
74
|
+
qbl_code { 75 }
|
75
|
+
end
|
76
|
+
|
77
|
+
trait :live_related_child do
|
78
|
+
description { "Transplant ; Transplant; Live related - child" }
|
79
|
+
txt_code { 77 }
|
80
|
+
qbl_code { 77 }
|
81
|
+
end
|
82
|
+
|
83
|
+
trait :live_related_other do
|
84
|
+
description { "Transplant ; Transplant; Live related - other" }
|
85
|
+
txt_code { 23 }
|
86
|
+
qbl_code { 23 }
|
87
|
+
end
|
88
|
+
|
89
|
+
trait :non_heart_beating do
|
90
|
+
description { "Transplant ; non-heart-beating donor" }
|
91
|
+
txt_code { 28 }
|
92
|
+
qbl_code { 28 }
|
93
|
+
end
|
94
|
+
|
95
|
+
trait :live_unrelated do
|
96
|
+
description { "Transplant ; Live genetically unrelated" }
|
97
|
+
txt_code { 24 }
|
98
|
+
qbl_code { 24 }
|
99
|
+
end
|
46
100
|
end
|
47
101
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renalware-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.108
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Airslie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_type
|
@@ -198,14 +198,14 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - "~>"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: 4.
|
201
|
+
version: 4.7.1
|
202
202
|
type: :runtime
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: 4.
|
208
|
+
version: 4.7.1
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: devise-security
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -660,14 +660,14 @@ dependencies:
|
|
660
660
|
requirements:
|
661
661
|
- - '='
|
662
662
|
- !ruby/object:Gem::Version
|
663
|
-
version: 2.
|
663
|
+
version: 2.24.0
|
664
664
|
type: :runtime
|
665
665
|
prerelease: false
|
666
666
|
version_requirements: !ruby/object:Gem::Requirement
|
667
667
|
requirements:
|
668
668
|
- - '='
|
669
669
|
- !ruby/object:Gem::Version
|
670
|
-
version: 2.
|
670
|
+
version: 2.24.0
|
671
671
|
- !ruby/object:Gem::Dependency
|
672
672
|
name: rails-assets-mousetrap
|
673
673
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1864,7 +1864,7 @@ files:
|
|
1864
1864
|
- app/models/renalware/ukrdc/treatment_timeline/prepare_tables.rb
|
1865
1865
|
- app/models/renalware/ukrdc/treatment_timeline/remap_model_table_names_to_their_prepared_equivalents.rb
|
1866
1866
|
- app/models/renalware/ukrdc/treatment_timeline/transfer_out/generator.rb
|
1867
|
-
- app/models/renalware/ukrdc/treatment_timeline/transplant/generator.rb
|
1867
|
+
- app/models/renalware/ukrdc/treatment_timeline/transplant/generator.rb
|
1868
1868
|
- app/models/renalware/ukrdc/xml_renderer.rb
|
1869
1869
|
- app/models/renalware/user.rb
|
1870
1870
|
- app/models/renalware/version.rb
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_dependency "renalware/ukrdc"
|
4
|
-
require "attr_extras"
|
5
|
-
|
6
|
-
# QBL TXT Description
|
7
|
-
# "20" "20" "Transplant ; Cadaver donor"
|
8
|
-
# "21" "21" "Transplant ; Live related - sibling"
|
9
|
-
# "74" "74" "Transplant ; Live related - father"
|
10
|
-
# "75" "75" "Transplant ; Live related - mother"
|
11
|
-
# "77" "77" "Transplant ; Live related - child"
|
12
|
-
# "23" "23" "Transplant ; Live related - other"
|
13
|
-
# "24" "24" "Transplant ; Live genetically unrelated"
|
14
|
-
# "25" "25" "Transplant ; Cadaver donor + transp other organ"
|
15
|
-
# "26" "26" "Transplant ; Live donor + transplant other organ"
|
16
|
-
# "27" "27" "Transplant ; Live donor non-UK transplant"
|
17
|
-
# "28" "28" "Transplant ; non-heart-beating donor"
|
18
|
-
# "29" "29" "Transplant ; type unknown"
|
19
|
-
module Renalware
|
20
|
-
module UKRDC
|
21
|
-
module TreatmentTimeline
|
22
|
-
module Transplant
|
23
|
-
class Generator
|
24
|
-
pattr_initialize :modality
|
25
|
-
delegate :patient, to: :modality
|
26
|
-
|
27
|
-
# We need to create a treatment record to match the UKRDC code expectations
|
28
|
-
# based on donor relationship.
|
29
|
-
# Otherwise Default to 29 Transplant ; type unknown
|
30
|
-
def call
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|