[
https://issues.apache.org/jira/browse/HTTPCLIENT-2199?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17481142#comment-17481142
]
Oleg Kalnichevski commented on HTTPCLIENT-2199:
-----------------------------------------------
> processChallenge function is trying to read challenge using getValue()
> function.
[[email protected]] NTLM scheme can have no parameters. It has a single opaque
challenge value. Your assumption looks wrong to me. I also can see the
three-way NTLM handshake correctly executed.
I am not sure I understand what is it that you think is wrong.
Oleg
{noformat}
Executing request GET http://ntlm.herokuapp.com/
2022-01-24 15:34:54,349 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ex-0000000001 preparing request execution
2022-01-24 15:34:54,359 DEBUG
[main][org.apache.hc.client5.http.protocol.RequestAddCookies] ex-0000000001
Cookie spec selected: strict
2022-01-24 15:34:54,364 DEBUG
[main][org.apache.hc.client5.http.protocol.RequestAuthCache] ex-0000000001 Auth
cache not set in the context
2022-01-24 15:34:54,364 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-0000000001
target auth state: UNCHALLENGED
2022-01-24 15:34:54,365 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-0000000001
proxy auth state: UNCHALLENGED
2022-01-24 15:34:54,365 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ConnectExec] ex-0000000001
acquiring connection with route {}->http://ntlm.herokuapp.com:80
2022-01-24 15:34:54,365 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ex-0000000001 acquiring endpoint (3 MINUTES)
2022-01-24 15:34:54,367 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 endpoint lease request (3 MINUTES) [route:
{}->http://ntlm.herokuapp.com:80][total available: 0; route allocated: 0 of 5;
total allocated: 0 of 25]
2022-01-24 15:34:54,371 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 endpoint leased [route: {}->http://ntlm.herokuapp.com:80][total
available: 0; route allocated: 1 of 5; total allocated: 1 of 25]
2022-01-24 15:34:54,381 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 acquired ep-0000000000
2022-01-24 15:34:54,381 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ex-0000000001 acquired endpoint ep-0000000000
2022-01-24 15:34:54,381 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ConnectExec] ex-0000000001
opening connection {}->http://ntlm.herokuapp.com:80
2022-01-24 15:34:54,382 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000000 connecting endpoint (3 MINUTES)
2022-01-24 15:34:54,382 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000000 connecting endpoint to http://ntlm.herokuapp.com:80 (3 MINUTES)
2022-01-24 15:34:54,384 DEBUG
[main][org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator]
http-outgoing-0 connecting to ntlm.herokuapp.com/54.159.116.102:80
2022-01-24 15:34:54,573 DEBUG
[main][org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator]
http-outgoing-0 connection established 192.168.8.102:58984<->54.159.116.102:80
2022-01-24 15:34:54,573 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000000 connected http-outgoing-0
2022-01-24 15:34:54,573 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000000 endpoint connected
2022-01-24 15:34:54,575 DEBUG
[main][org.apache.hc.client5.http.impl.classic.MainClientExec] ex-0000000001
executing GET / HTTP/1.1
2022-01-24 15:34:54,575 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000000 start execution ex-0000000001
2022-01-24 15:34:54,576 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000000 executing exchange ex-0000000001 over http-outgoing-0
2022-01-24 15:34:54,577 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> GET / HTTP/1.1
2022-01-24 15:34:54,577 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Accept-Encoding: gzip, x-gzip, deflate
2022-01-24 15:34:54,578 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Host: ntlm.herokuapp.com
2022-01-24 15:34:54,578 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Connection: keep-alive
2022-01-24 15:34:54,578 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> User-Agent: Apache-HttpClient/5.1.3-SNAPSHOT (Java/1.8.0_272)
2022-01-24 15:34:54,736 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << HTTP/1.1 401 Unauthorized
2022-01-24 15:34:54,736 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Connection: keep-alive
2022-01-24 15:34:54,736 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Www-Authenticate: NTLM
2022-01-24 15:34:54,736 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Server: WEBrick/1.3.1 (Ruby/2.0.0/2014-09-19)
2022-01-24 15:34:54,736 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Date: Mon, 24 Jan 2022 14:34:55 GMT
2022-01-24 15:34:54,736 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Content-Length: 0
2022-01-24 15:34:54,737 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Via: 1.1 vegur
2022-01-24 15:34:54,743 DEBUG
[main][org.apache.hc.client5.http.impl.classic.MainClientExec] ex-0000000001
connection can be kept alive for 3 MINUTES
2022-01-24 15:34:54,750 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000000 releasing valid endpoint
2022-01-24 15:34:54,750 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000000 releasing endpoint
2022-01-24 15:34:54,752 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000000 connection http-outgoing-0 can be kept alive for 3 MINUTES
2022-01-24 15:34:54,752 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000000 connection released [route:
{}->http://ntlm.herokuapp.com:80][total available: 1; route allocated: 1 of 5;
total allocated: 1 of 25]
2022-01-24 15:34:54,752 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Authentication required
2022-01-24 15:34:54,753 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
ntlm.herokuapp.com:80 requested authentication
2022-01-24 15:34:54,754 DEBUG
[main][org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy]
ex-0000000001 Authentication schemes in the order of preference: [Negotiate,
Kerberos, NTLM, Digest, Basic]
2022-01-24 15:34:54,754 DEBUG
[main][org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy]
ex-0000000001, Challenge for Negotiate authentication scheme not available
2022-01-24 15:34:54,755 DEBUG
[main][org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy]
ex-0000000001, Challenge for Kerberos authentication scheme not available
2022-01-24 15:34:54,765 DEBUG
[main][org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy]
ex-0000000001, Challenge for Digest authentication scheme not available
2022-01-24 15:34:54,765 DEBUG
[main][org.apache.hc.client5.http.impl.DefaultAuthenticationStrategy]
ex-0000000001, Challenge for Basic authentication scheme not available
2022-01-24 15:34:54,765 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Selecting authentication options
2022-01-24 15:34:54,766 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Selected authentication options: [NTLM{CHALLENGE_RECEIVED null}]
2022-01-24 15:34:54,767 DEBUG
[main][org.apache.hc.client5.http.protocol.RequestAddCookies] ex-0000000001
Cookie spec selected: strict
2022-01-24 15:34:54,767 DEBUG
[main][org.apache.hc.client5.http.protocol.RequestAuthCache] ex-0000000001 Auth
cache not set in the context
2022-01-24 15:34:54,767 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-0000000001
target auth state: CHALLENGED
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Generating response to an authentication challenge using NTLM scheme
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-0000000001
proxy auth state: UNCHALLENGED
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ConnectExec] ex-0000000001
acquiring connection with route {}->http://ntlm.herokuapp.com:80
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ex-0000000001 acquiring endpoint (3 MINUTES)
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 endpoint lease request (3 MINUTES) [route:
{}->http://ntlm.herokuapp.com:80][total available: 1; route allocated: 1 of 5;
total allocated: 1 of 25]
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 endpoint leased [route: {}->http://ntlm.herokuapp.com:80][total
available: 0; route allocated: 1 of 5; total allocated: 1 of 25]
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 acquired ep-0000000001
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ex-0000000001 acquired endpoint ep-0000000001
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.classic.MainClientExec] ex-0000000001
executing GET / HTTP/1.1
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000001 start execution ex-0000000001
2022-01-24 15:34:54,768 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000001 executing exchange ex-0000000001 over http-outgoing-0
2022-01-24 15:34:54,768 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> GET / HTTP/1.1
2022-01-24 15:34:54,768 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Host: ntlm.herokuapp.com
2022-01-24 15:34:54,768 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Connection: keep-alive
2022-01-24 15:34:54,769 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> User-Agent: Apache-HttpClient/5.1.3-SNAPSHOT (Java/1.8.0_272)
2022-01-24 15:34:54,769 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Authorization: NTLM
TlRMTVNTUAABAAAAAYIIogAAAAAoAAAAAAAAACgAAAAFASgKAAAADw==
2022-01-24 15:34:54,968 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << HTTP/1.1 401 Unauthorized
2022-01-24 15:34:54,968 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Connection: keep-alive
2022-01-24 15:34:54,968 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Www-Authenticate: NTLM
TlRMTVNTUAACAAAAAAAAACgAAAABAAAAAAAAAAAAAAA=
2022-01-24 15:34:54,968 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Server: WEBrick/1.3.1 (Ruby/2.0.0/2014-09-19)
2022-01-24 15:34:54,968 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Date: Mon, 24 Jan 2022 14:34:55 GMT
2022-01-24 15:34:54,969 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Content-Length: 0
2022-01-24 15:34:54,969 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Via: 1.1 vegur
2022-01-24 15:34:54,969 DEBUG
[main][org.apache.hc.client5.http.impl.classic.MainClientExec] ex-0000000001
connection can be kept alive for 3 MINUTES
2022-01-24 15:34:54,969 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000001 releasing valid endpoint
2022-01-24 15:34:54,969 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000001 releasing endpoint
2022-01-24 15:34:54,970 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000001 connection http-outgoing-0 can be kept alive for 3 MINUTES
2022-01-24 15:34:54,970 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000001 connection released [route:
{}->http://ntlm.herokuapp.com:80][state: test][total available: 1; route
allocated: 1 of 5; total allocated: 1 of 25]
2022-01-24 15:34:54,971 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Authentication required
2022-01-24 15:34:54,971 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
ntlm.herokuapp.com:80 requested authentication
2022-01-24 15:34:54,972 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Authorization challenge processed
2022-01-24 15:34:54,972 DEBUG
[main][org.apache.hc.client5.http.protocol.RequestAddCookies] ex-0000000001
Cookie spec selected: strict
2022-01-24 15:34:54,972 DEBUG
[main][org.apache.hc.client5.http.protocol.RequestAuthCache] ex-0000000001 Auth
cache not set in the context
2022-01-24 15:34:54,973 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-0000000001
target auth state: HANDSHAKE
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ProtocolExec] ex-0000000001
proxy auth state: UNCHALLENGED
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.classic.ConnectExec] ex-0000000001
acquiring connection with route {}->http://ntlm.herokuapp.com:80
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ex-0000000001 acquiring endpoint (3 MINUTES)
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 endpoint lease request (3 MINUTES) [route:
{}->http://ntlm.herokuapp.com:80][state: test][total available: 1; route
allocated: 1 of 5; total allocated: 1 of 25]
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 endpoint leased [route: {}->http://ntlm.herokuapp.com:80][state:
test][total available: 0; route allocated: 1 of 5; total allocated: 1 of 25]
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ex-0000000001 acquired ep-0000000002
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ex-0000000001 acquired endpoint ep-0000000002
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.classic.MainClientExec] ex-0000000001
executing GET / HTTP/1.1
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000002 start execution ex-0000000001
2022-01-24 15:34:55,041 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000002 executing exchange ex-0000000001 over http-outgoing-0
2022-01-24 15:34:55,041 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> GET / HTTP/1.1
2022-01-24 15:34:55,041 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Host: ntlm.herokuapp.com
2022-01-24 15:34:55,041 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Connection: keep-alive
2022-01-24 15:34:55,041 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> User-Agent: Apache-HttpClient/5.1.3-SNAPSHOT (Java/1.8.0_272)
2022-01-24 15:34:55,042 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 >> Authorization: NTLM
TlRMTVNTUAADAAAAGAAYAEgAAAAYABgAYAAAAAAAAAB4AAAACAAIAHgAAAAAAAAAgAAAAAAAAACAAAAAAQAAAAUBKAoAAAAPktCVP2PMA1qv1+4jRL2U9lfpobeVQMN0M1xXBx1vHg3GXh87OUMpLYw52cRTCTbFdABlAHMAdAA=
2022-01-24 15:34:55,210 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << HTTP/1.1 401 Unauthorized
2022-01-24 15:34:55,210 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Connection: keep-alive
2022-01-24 15:34:55,210 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Server: WEBrick/1.3.1 (Ruby/2.0.0/2014-09-19)
2022-01-24 15:34:55,210 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Date: Mon, 24 Jan 2022 14:34:55 GMT
2022-01-24 15:34:55,210 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Content-Length: 39
2022-01-24 15:34:55,210 DEBUG [main][org.apache.hc.client5.http.headers]
http-outgoing-0 << Via: 1.1 vegur
2022-01-24 15:34:55,210 DEBUG
[main][org.apache.hc.client5.http.impl.classic.MainClientExec] ex-0000000001
connection can be kept alive for 3 MINUTES
2022-01-24 15:34:55,211 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Authentication required
2022-01-24 15:34:55,211 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
ntlm.herokuapp.com:80 requested authentication
2022-01-24 15:34:55,211 DEBUG
[main][org.apache.hc.client5.http.impl.auth.HttpAuthenticator] ex-0000000001
Response contains no valid authentication challenges
----------------------------------------
401 Unauthorized
2022-01-24 15:34:55,214 DEBUG
[main][org.apache.hc.client5.http.impl.classic.InternalHttpClient]
ep-0000000002 releasing valid endpoint
2022-01-24 15:34:55,214 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000002 releasing endpoint
2022-01-24 15:34:55,214 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000002 connection http-outgoing-0 can be kept alive for 3 MINUTES
2022-01-24 15:34:55,214 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
ep-0000000002 connection released [route:
{}->http://ntlm.herokuapp.com:80][state: test][total available: 1; route
allocated: 1 of 5; total allocated: 1 of 25]
You are not authorized to see this page
2022-01-24 15:34:55,215 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
Shutdown connection pool GRACEFUL
2022-01-24 15:34:55,216 DEBUG
[main][org.apache.hc.client5.http.impl.io.DefaultManagedHttpClientConnection]
http-outgoing-0 close connection GRACEFUL
2022-01-24 15:34:55,217 DEBUG
[main][org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager]
Connection pool shut down
{noformat}
> NTLM auth is failing while processing 2nd challenge response
> ------------------------------------------------------------
>
> Key: HTTPCLIENT-2199
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2199
> Project: HttpComponents HttpClient
> Issue Type: Bug
> Components: HttpClient (classic)
> Affects Versions: 5.1.2
> Reporter: can
> Priority: Major
> Attachments: 150694519-4216bb91-ad43-40d1-ba8e-1818af685560.png,
> NoRequestAfter2ndResponse.txt, RequestAfter2ndResponse.txt
>
>
> In NTLMScheme class (NTLMScheme.java), processChallenge function is trying to
> read challenge using getValue() function.
> But it is always returning null.
> Challenge is actually stored inside params and can be accessed by getParams()
> function.
> see [^150694519-4216bb91-ad43-40d1-ba8e-1818af685560.png]
--
This message was sent by Atlassian Jira
(v8.20.1#820001)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]