perimeter_x 1.2.0 → 2.2.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 +5 -5
- data/.gitignore +1 -0
- data/.travis.yml +3 -0
- data/Dockerfile +12 -7
- data/Gemfile.lock +36 -30
- data/Rakefile +1 -0
- data/changelog.md +58 -0
- data/examples/app/controllers/home_controller.rb +1 -1
- data/lib/perimeter_x.rb +195 -71
- data/lib/perimeterx/configuration.rb +74 -22
- data/lib/perimeterx/internal/clients/perimeter_x_activity_client.rb +32 -6
- data/lib/perimeterx/internal/exceptions/px_config_exception.rb +6 -0
- data/lib/perimeterx/internal/first_party/px_first_party.rb +124 -0
- data/lib/perimeterx/internal/{perimeter_x_cookie_v1.rb → payload/perimeter_x_cookie_v1.rb} +1 -1
- data/lib/perimeterx/internal/{perimeter_x_cookie_v3.rb → payload/perimeter_x_cookie_v3.rb} +1 -1
- data/lib/perimeterx/internal/{perimeter_x_cookie.rb → payload/perimeter_x_payload.rb} +12 -4
- data/lib/perimeterx/internal/payload/perimeter_x_token_v1.rb +38 -0
- data/lib/perimeterx/internal/payload/perimeter_x_token_v3.rb +36 -0
- data/lib/perimeterx/internal/perimeter_x_context.rb +74 -32
- data/lib/perimeterx/internal/validators/hash_schema_validator.rb +26 -0
- data/lib/perimeterx/internal/validators/perimeter_x_cookie_validator.rb +29 -21
- data/lib/perimeterx/internal/validators/perimeter_x_s2s_validator.rb +33 -9
- data/lib/perimeterx/utils/px_constants.rb +35 -17
- data/lib/perimeterx/utils/px_http_client.rb +60 -3
- data/lib/perimeterx/utils/px_template_factory.rb +18 -8
- data/lib/perimeterx/utils/templates/block_template.mustache +175 -0
- data/lib/perimeterx/utils/templates/ratelimit.mustache +9 -0
- data/lib/perimeterx/version.rb +1 -1
- data/perimeter_x.gemspec +3 -3
- data/readme.md +115 -31
- metadata +24 -20
- data/lib/perimeterx/internal/validators/perimeter_x_captcha_validator.rb +0 -65
- data/lib/perimeterx/utils/templates/block.mustache +0 -146
- data/lib/perimeterx/utils/templates/captcha.mustache +0 -185
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perimeter_x
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nitzan Goldfeder
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '2.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: concurrent-ruby
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,14 +104,14 @@ dependencies:
|
|
104
104
|
requirements:
|
105
105
|
- - ">="
|
106
106
|
- !ruby/object:Gem::Version
|
107
|
-
version:
|
107
|
+
version: 5.2.4.3
|
108
108
|
type: :runtime
|
109
109
|
prerelease: false
|
110
110
|
version_requirements: !ruby/object:Gem::Requirement
|
111
111
|
requirements:
|
112
112
|
- - ">="
|
113
113
|
- !ruby/object:Gem::Version
|
114
|
-
version:
|
114
|
+
version: 5.2.4.3
|
115
115
|
- !ruby/object:Gem::Dependency
|
116
116
|
name: rspec
|
117
117
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,6 +156,7 @@ extra_rdoc_files:
|
|
156
156
|
- changelog.md
|
157
157
|
files:
|
158
158
|
- ".gitignore"
|
159
|
+
- ".travis.yml"
|
159
160
|
- Dockerfile
|
160
161
|
- Gemfile
|
161
162
|
- Gemfile.lock
|
@@ -170,20 +171,24 @@ files:
|
|
170
171
|
- lib/perimeterx/configuration.rb
|
171
172
|
- lib/perimeterx/internal/clients/perimeter_x_activity_client.rb
|
172
173
|
- lib/perimeterx/internal/clients/perimeter_x_risk_client.rb
|
174
|
+
- lib/perimeterx/internal/exceptions/px_config_exception.rb
|
173
175
|
- lib/perimeterx/internal/exceptions/px_cookie_decryption_exception.rb
|
176
|
+
- lib/perimeterx/internal/first_party/px_first_party.rb
|
177
|
+
- lib/perimeterx/internal/payload/perimeter_x_cookie_v1.rb
|
178
|
+
- lib/perimeterx/internal/payload/perimeter_x_cookie_v3.rb
|
179
|
+
- lib/perimeterx/internal/payload/perimeter_x_payload.rb
|
180
|
+
- lib/perimeterx/internal/payload/perimeter_x_token_v1.rb
|
181
|
+
- lib/perimeterx/internal/payload/perimeter_x_token_v3.rb
|
174
182
|
- lib/perimeterx/internal/perimeter_x_context.rb
|
175
|
-
- lib/perimeterx/internal/
|
176
|
-
- lib/perimeterx/internal/perimeter_x_cookie_v1.rb
|
177
|
-
- lib/perimeterx/internal/perimeter_x_cookie_v3.rb
|
178
|
-
- lib/perimeterx/internal/validators/perimeter_x_captcha_validator.rb
|
183
|
+
- lib/perimeterx/internal/validators/hash_schema_validator.rb
|
179
184
|
- lib/perimeterx/internal/validators/perimeter_x_cookie_validator.rb
|
180
185
|
- lib/perimeterx/internal/validators/perimeter_x_s2s_validator.rb
|
181
186
|
- lib/perimeterx/utils/px_constants.rb
|
182
187
|
- lib/perimeterx/utils/px_http_client.rb
|
183
188
|
- lib/perimeterx/utils/px_logger.rb
|
184
189
|
- lib/perimeterx/utils/px_template_factory.rb
|
185
|
-
- lib/perimeterx/utils/templates/
|
186
|
-
- lib/perimeterx/utils/templates/
|
190
|
+
- lib/perimeterx/utils/templates/block_template.mustache
|
191
|
+
- lib/perimeterx/utils/templates/ratelimit.mustache
|
187
192
|
- lib/perimeterx/version.rb
|
188
193
|
- perimeter_x.gemspec
|
189
194
|
- readme.md
|
@@ -210,8 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
215
|
- !ruby/object:Gem::Version
|
211
216
|
version: '0'
|
212
217
|
requirements: []
|
213
|
-
|
214
|
-
rubygems_version: 2.6.11
|
218
|
+
rubygems_version: 3.0.3
|
215
219
|
signing_key:
|
216
220
|
specification_version: 4
|
217
221
|
summary: PerimeterX ruby implmentation
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'perimeterx/internal/clients/perimeter_x_risk_client'
|
2
|
-
|
3
|
-
module PxModule
|
4
|
-
class PerimeterxCaptchaValidator < PerimeterxRiskClient
|
5
|
-
|
6
|
-
def initialize(px_config, http_client)
|
7
|
-
super(px_config, http_client)
|
8
|
-
end
|
9
|
-
|
10
|
-
def send_captcha_request(vid, uuid, captcha, px_ctx)
|
11
|
-
|
12
|
-
request_body = {
|
13
|
-
:request => {
|
14
|
-
:ip => px_ctx.context[:ip],
|
15
|
-
:headers => format_headers(px_ctx),
|
16
|
-
:uri => px_ctx.context[:uri]
|
17
|
-
},
|
18
|
-
:pxCaptcha => captcha,
|
19
|
-
:vid => vid,
|
20
|
-
:uuid => uuid,
|
21
|
-
:hostname => px_ctx.context[:hostname]
|
22
|
-
}
|
23
|
-
|
24
|
-
# Prepare request
|
25
|
-
headers = {
|
26
|
-
"Authorization" => "Bearer #{@px_config[:auth_token]}" ,
|
27
|
-
"Content-Type" => "application/json"
|
28
|
-
};
|
29
|
-
|
30
|
-
return @http_client.post(PxModule::API_V1_CAPTCHA, request_body, headers, @px_config[:api_timeout], @px_config[:api_timeout_connection])
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
def verify(px_ctx)
|
35
|
-
captcha_validated = false
|
36
|
-
begin
|
37
|
-
if(!px_ctx.context.key?(:px_captcha))
|
38
|
-
return captcha_validated, px_ctx
|
39
|
-
end
|
40
|
-
captcha, vid, uuid = px_ctx.context[:px_captcha].split(':', 3)
|
41
|
-
if captcha.nil? || vid.nil? || uuid.nil?
|
42
|
-
return captcha_validated, px_ctx
|
43
|
-
end
|
44
|
-
|
45
|
-
px_ctx.context[:vid] = vid
|
46
|
-
px_ctx.context[:uuid] = uuid
|
47
|
-
response = send_captcha_request(vid, uuid, captcha, px_ctx)
|
48
|
-
|
49
|
-
if (response.status_code == 200)
|
50
|
-
response_body = eval(response.body)
|
51
|
-
if ( response_body[:status] == 0 )
|
52
|
-
captcha_validated = true
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
return captcha_validated, px_ctx
|
57
|
-
|
58
|
-
rescue Exception => e
|
59
|
-
@logger.error("PerimeterxCaptchaValidator[verify]: failed, returning false")
|
60
|
-
return captcha_validated, px_ctx
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
@@ -1,146 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
6
|
-
<title>Access to this page has been denied.</title>
|
7
|
-
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300" rel="stylesheet">
|
8
|
-
<style>
|
9
|
-
html,body{
|
10
|
-
margin: 0;
|
11
|
-
padding: 0;
|
12
|
-
font-family: 'Open Sans', sans-serif;
|
13
|
-
color: #000;
|
14
|
-
}
|
15
|
-
|
16
|
-
a{
|
17
|
-
color: #c5c5c5;
|
18
|
-
text-decoration: none;
|
19
|
-
}
|
20
|
-
|
21
|
-
.container{
|
22
|
-
align-items: center;
|
23
|
-
display: flex;
|
24
|
-
flex: 1;
|
25
|
-
justify-content: space-between;
|
26
|
-
flex-direction: column;
|
27
|
-
height: 100%;
|
28
|
-
}
|
29
|
-
|
30
|
-
.container > div {
|
31
|
-
width: 100%;
|
32
|
-
display: flex;
|
33
|
-
justify-content:center;
|
34
|
-
}
|
35
|
-
|
36
|
-
.container > div > div {
|
37
|
-
display: flex;
|
38
|
-
width: 80%;
|
39
|
-
}
|
40
|
-
|
41
|
-
.customer-logo-wrapper{
|
42
|
-
padding-top: 2rem;
|
43
|
-
flex-grow: 0;
|
44
|
-
background-color: #fff;
|
45
|
-
visibility: {{logoVisibility}};
|
46
|
-
}
|
47
|
-
|
48
|
-
.customer-logo{
|
49
|
-
border-bottom: 1px solid #000;
|
50
|
-
}
|
51
|
-
|
52
|
-
.customer-logo > img{
|
53
|
-
padding-bottom: 1rem;
|
54
|
-
max-height: 50px;
|
55
|
-
max-width: auto;
|
56
|
-
}
|
57
|
-
|
58
|
-
.page-title-wrapper{
|
59
|
-
flex-grow: 2;
|
60
|
-
}
|
61
|
-
.page-title {
|
62
|
-
flex-direction: column-reverse;
|
63
|
-
}
|
64
|
-
|
65
|
-
.content-wrapper{
|
66
|
-
flex-grow: 5;
|
67
|
-
}
|
68
|
-
.content{
|
69
|
-
flex-direction: column;
|
70
|
-
}
|
71
|
-
|
72
|
-
.page-footer-wrapper{
|
73
|
-
align-items: center;
|
74
|
-
flex-grow: 0.2;
|
75
|
-
background-color: #000;
|
76
|
-
color: #c5c5c5;
|
77
|
-
font-size: 70%;
|
78
|
-
}
|
79
|
-
@media (min-width:768px){
|
80
|
-
html,body{
|
81
|
-
height: 100%;
|
82
|
-
}
|
83
|
-
}
|
84
|
-
</style>
|
85
|
-
<!-- Custom CSS -->
|
86
|
-
{{# cssRef }}
|
87
|
-
<link rel="stylesheet" type="text/css" href="{{cssRef}}" />
|
88
|
-
{{/ cssRef }}
|
89
|
-
</head>
|
90
|
-
<body>
|
91
|
-
<section class="container">
|
92
|
-
<div class="customer-logo-wrapper">
|
93
|
-
<div class="customer-logo">
|
94
|
-
<img src="{{customLogo}}" alt="Logo"/>
|
95
|
-
</div>
|
96
|
-
</div>
|
97
|
-
<div class="page-title-wrapper">
|
98
|
-
<div class="page-title">
|
99
|
-
<h1>Access to this page has been denied.</h1>
|
100
|
-
</div>
|
101
|
-
</div>
|
102
|
-
<div class="content-wrapper">
|
103
|
-
<div class="content">
|
104
|
-
<p>
|
105
|
-
You have been blocked because we believe you are using automation tools to browse the website.
|
106
|
-
</p>
|
107
|
-
<p>
|
108
|
-
Please note that Javascript and Cookies must be enabled on your browser to access the website.
|
109
|
-
</p>
|
110
|
-
<p>
|
111
|
-
If you think you have been blocked by mistake, please contact the website administrator with the reference ID below.
|
112
|
-
</p>
|
113
|
-
<p>
|
114
|
-
Reference ID: #{{refId}}
|
115
|
-
</p>
|
116
|
-
</div>
|
117
|
-
</div>
|
118
|
-
<div class="page-footer-wrapper">
|
119
|
-
<div class="page-footer">
|
120
|
-
<p>
|
121
|
-
Powered by
|
122
|
-
<a href="https://www.perimeterx.com">PerimeterX</a>
|
123
|
-
, Inc.
|
124
|
-
</p>
|
125
|
-
</div>
|
126
|
-
</div>
|
127
|
-
</section>
|
128
|
-
<!-- Px -->
|
129
|
-
<script>
|
130
|
-
(
|
131
|
-
function (){
|
132
|
-
window._pxAppId = '{{appId}}';
|
133
|
-
var p = document.getElementsByTagName("script")[0], s = document.createElement("script");
|
134
|
-
|
135
|
-
s.async = 1;
|
136
|
-
s.src = '//client.perimeterx.net/{{appId}}/main.min.js';
|
137
|
-
p.parentNode.insertBefore(s, p);
|
138
|
-
} ()
|
139
|
-
);
|
140
|
-
</script>
|
141
|
-
<!-- Custom Script -->
|
142
|
-
{{# jsRef }}
|
143
|
-
<script src="{{jsRef}}"></script>
|
144
|
-
{{/ jsRef }}
|
145
|
-
</body>
|
146
|
-
</html>
|
@@ -1,185 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
6
|
-
<title>Access to this page has been denied.</title>
|
7
|
-
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300" rel="stylesheet">
|
8
|
-
<style>
|
9
|
-
html,body{
|
10
|
-
margin: 0;
|
11
|
-
padding: 0;
|
12
|
-
font-family: 'Open Sans', sans-serif;
|
13
|
-
color: #000;
|
14
|
-
}
|
15
|
-
|
16
|
-
a{
|
17
|
-
color: #c5c5c5;
|
18
|
-
text-decoration: none;
|
19
|
-
}
|
20
|
-
|
21
|
-
.container{
|
22
|
-
align-items: center;
|
23
|
-
display: flex;
|
24
|
-
flex: 1;
|
25
|
-
justify-content: space-between;
|
26
|
-
flex-direction: column;
|
27
|
-
height: 100%;
|
28
|
-
}
|
29
|
-
|
30
|
-
.container > div {
|
31
|
-
width: 100%;
|
32
|
-
display: flex;
|
33
|
-
justify-content:center;
|
34
|
-
}
|
35
|
-
|
36
|
-
.container > div > div {
|
37
|
-
display: flex;
|
38
|
-
width: 80%;
|
39
|
-
}
|
40
|
-
|
41
|
-
.customer-logo-wrapper{
|
42
|
-
padding-top: 2rem;
|
43
|
-
flex-grow: 0;
|
44
|
-
background-color: #fff;
|
45
|
-
visibility: {{logoVisibility}};
|
46
|
-
}
|
47
|
-
|
48
|
-
.customer-logo{
|
49
|
-
border-bottom: 1px solid #000;
|
50
|
-
}
|
51
|
-
|
52
|
-
.customer-logo > img{
|
53
|
-
padding-bottom: 1rem;
|
54
|
-
max-height: 50px;
|
55
|
-
max-width: auto;
|
56
|
-
}
|
57
|
-
|
58
|
-
.page-title-wrapper{
|
59
|
-
flex-grow: 2;
|
60
|
-
}
|
61
|
-
.page-title {
|
62
|
-
flex-direction: column-reverse;
|
63
|
-
}
|
64
|
-
|
65
|
-
.content-wrapper{
|
66
|
-
flex-grow: 5;
|
67
|
-
}
|
68
|
-
.content{
|
69
|
-
flex-direction: column;
|
70
|
-
}
|
71
|
-
|
72
|
-
.page-footer-wrapper{
|
73
|
-
align-items: center;
|
74
|
-
flex-grow: 0.2;
|
75
|
-
background-color: #000;
|
76
|
-
color: #c5c5c5;
|
77
|
-
font-size: 70%;
|
78
|
-
}
|
79
|
-
|
80
|
-
@media (min-width:768px){
|
81
|
-
html,body{
|
82
|
-
height: 100%;
|
83
|
-
}
|
84
|
-
}
|
85
|
-
</style>
|
86
|
-
<!-- Custom CSS -->
|
87
|
-
{{#cssRef}}
|
88
|
-
<link rel="stylesheet" type="text/css" href="{{cssRef}}" />
|
89
|
-
{{/cssRef}}
|
90
|
-
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
|
91
|
-
</head>
|
92
|
-
|
93
|
-
<body>
|
94
|
-
<section class="container">
|
95
|
-
<div class="customer-logo-wrapper">
|
96
|
-
<div class="customer-logo">
|
97
|
-
<img src="{{customLogo}}" alt="Logo"/>
|
98
|
-
</div>
|
99
|
-
</div>
|
100
|
-
<div class="page-title-wrapper">
|
101
|
-
<div class="page-title">
|
102
|
-
<h1>Please verify you are a human</h1>
|
103
|
-
</div>
|
104
|
-
</div>
|
105
|
-
<div class="content-wrapper">
|
106
|
-
<div class="content">
|
107
|
-
<p>
|
108
|
-
Please click "I am not a robot" to continue
|
109
|
-
</p>
|
110
|
-
<div class="g-recaptcha" data-sitekey="6Lcj-R8TAAAAABs3FrRPuQhLMbp5QrHsHufzLf7b" data-callback="handleCaptcha" data-theme="dark">
|
111
|
-
</div>
|
112
|
-
<p>
|
113
|
-
Access to this page has been denied because we believe you are using automation tools to browse the website.
|
114
|
-
</p>
|
115
|
-
<p>
|
116
|
-
This may happen as a result of the following:
|
117
|
-
</p>
|
118
|
-
<ul>
|
119
|
-
<li>
|
120
|
-
Javascript is disabled or blocked by an extension (ad blockers for example)
|
121
|
-
</li>
|
122
|
-
<li>
|
123
|
-
Your browser does not support cookies
|
124
|
-
</li>
|
125
|
-
</ul>
|
126
|
-
<p>
|
127
|
-
Please make sure that Javascript and cookies are enabled on your browser and that you are not blocking them from loading.
|
128
|
-
</p>
|
129
|
-
<p>
|
130
|
-
Reference ID: #{{refId}}
|
131
|
-
</p>
|
132
|
-
</div>
|
133
|
-
</div>
|
134
|
-
<div class="page-footer-wrapper">
|
135
|
-
<div class="page-footer">
|
136
|
-
<p>
|
137
|
-
Powered by
|
138
|
-
<a href="https://www.perimeterx.com">PerimeterX</a>
|
139
|
-
, Inc.
|
140
|
-
</p>
|
141
|
-
</div>
|
142
|
-
</div>
|
143
|
-
</section>
|
144
|
-
<!-- Px -->
|
145
|
-
<script>
|
146
|
-
(
|
147
|
-
function (){
|
148
|
-
window._pxAppId = '{{appId}}';
|
149
|
-
var p = document.getElementsByTagName("script")[0], s = document.createElement("script");
|
150
|
-
|
151
|
-
s.async = 1;
|
152
|
-
s.src = '//client.perimeterx.net/{{appId}}/main.min.js';
|
153
|
-
p.parentNode.insertBefore(s, p);
|
154
|
-
} ()
|
155
|
-
);
|
156
|
-
</script>
|
157
|
-
<!-- Captcha -->
|
158
|
-
<script>
|
159
|
-
window.px_vid = '{{vid}}';
|
160
|
-
function handleCaptcha(response){
|
161
|
-
var vid = '{{vid}}';
|
162
|
-
var uuid = '{{uuid}}';
|
163
|
-
var name = "_pxCaptcha";
|
164
|
-
|
165
|
-
var expiryUtc = new Date(Date.now()+1000*10).toUTCString();
|
166
|
-
|
167
|
-
var cookieParts = [
|
168
|
-
name,
|
169
|
-
"=",
|
170
|
-
response+":"+vid+":"+uuid,
|
171
|
-
"; expires=",
|
172
|
-
expiryUtc,
|
173
|
-
"; path=/"
|
174
|
-
];
|
175
|
-
|
176
|
-
document.cookie = cookieParts.join("");
|
177
|
-
location.reload();
|
178
|
-
}
|
179
|
-
</script>
|
180
|
-
<!-- Custom Script -->
|
181
|
-
{{#jsRef}}
|
182
|
-
<script src="{{jsRef}}"></script>
|
183
|
-
{{/jsRef}}
|
184
|
-
</body>
|
185
|
-
</html>
|