JDK-8199450 : [Nestmates] several runtime/RedefineTests/* failed with the nestmates build
  • Type: Bug
  • Component: hotspot
  • Sub-Component: jvmti
  • Affected Version: repo-valhalla
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2018-03-12
  • Updated: 2018-06-04
  • Resolved: 2018-06-04
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
repo-valhallaFixed
Related Reports
Relates :  
Relates :  
Sub Tasks
JDK-8199837 :  
Description
The following tests:
  hotspot/jtreg/runtime/RedefineTests/RedefineFinalizer.java
  hotspot/jtreg/runtime/RedefineTests/RedefineRunningMethods.java
  hotspot/jtreg/runtime/RedefineTests/RedefinePreviousVersions.java
  hotspot/jtreg/runtime/RedefineTests/RedefineDoubleDelete.java
  hotspot/jtreg/runtime/RedefineTests/RedefineInterfaceMethods.java
  hotspot/jtreg/runtime/RedefineTests/RedefineInterfaceCall.java
  hotspot/jtreg/runtime/RedefineTests/ RedefineRunningMethodsWithBacktrace.java

fail with similar errors like below:

----------System.out:(1/134)----------
[1.584s][trace][redefine,class,nestmates] redefined class RedefineRunningMethods$B attribute change error: NestHost attribute removed
----------System.err:(17/1392)----------
java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the class NestHost or NestMembers attribute
	at java.instrument/sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
	at java.instrument/sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:190)
	at RedefineClassHelper.redefineClass(RedefineClassHelper.java:60)
	at RedefineClassHelper.redefineClass(RedefineClassHelper.java:50)
	at RedefineRunningMethods.main(RedefineRunningMethods.java:108)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:115)
	at java.base/java.lang.Thread.run(Thread.java:844)

JavaTest Message: Test threw exception: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the class NestHost or NestMembers attribute
JavaTest Message: shutting down test

The issue with these tests is that they are are using a class redefinition framework (RedefineClassHelper.redefineClass + InMemoryJavaCompiler.compile) that changes the NestHost and NestMembers attributes in the redefined versions of classes which is not allowed by the Nestmates-related JVMTI Spec update.

Below is full RedefineRunningMethods.jtr log:

#Test Results (version 2)
#Mon Mar 12 01:58:24 PDT 2018
#-----testdescription-----
$file=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests/RedefineRunningMethods.java
$root=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg
keywords=bug8055008 othervm
library=/test/lib
modules=java.base/jdk.internal.misc java.compiler java.instrument jdk.jartool/sun.tools.jar
run=USER_SPECIFIED main RedefineClassHelper\nUSER_SPECIFIED main/othervm -javaagent\:redefineagent.jar -Xlog\:redefine+class+iklass+add\=trace,redefine+class+iklass+purge\=trace RedefineRunningMethods\n
source=RedefineRunningMethods.java
title=Redefine EMCP and non-EMCP methods that are running in an infinite loop

#-----environment-----

#-----testresult-----
description=file\:/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests/RedefineRunningMethods.java
elapsed=3815 0\:00\:03.815
end=Mon Mar 12 01\:58\:24 PDT 2018
environment=regtest
execStatus=Failed. Execution failed\: `main' threw exception\: java.lang.UnsupportedOperationException\: class redefinition failed\: attempted to change the class NestHost or NestMembers attribute
harnessLoaderMode=Classpath Loader
harnessVariety=Full Bundle
hostname=sca00jqu.us.oracle.com
javatestOS=Linux 4.1.12-112.14.13.el7uek.x86_64 (amd64)
javatestVersion=5.0
jtregVersion=jtreg 4.2 fcs b13
modules=java.base/jdk.internal.misc java.compiler java.instrument jdk.jartool/sun.tools.jar
script=com.sun.javatest.regtest.exec.RegressionScript
sections=script_messages build main build compile main
start=Mon Mar 12 01\:58\:20 PDT 2018
test=runtime/RedefineTests/RedefineRunningMethods.java
testJDK=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk
totalTime=3817
user.name=sspitsyn
work=/scratch/sspitsyn/tst/valhalla/JTwork/runtime/RedefineTests

#section:script_messages
----------messages:(7/476)----------
JDK under test: /scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk
java version "11-internal" 2018-03-20
Java(TM) SE Runtime Environment 18.9 (build 11-internal+0-adhoc.sspitsyn.open)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11-internal+0-adhoc.sspitsyn.open, mixed mode)
Library /test/lib; kind: packages
   source directory: /scratch/sspitsyn/valhalla/open/test/lib
   class directory: /scratch/sspitsyn/tst/valhalla/JTwork/classes/test/lib

#section:build
----------messages:(3/102)----------
command: build RedefineClassHelper
reason: Named class compiled on demand
elapsed time (seconds): 0.0
result: Passed. All files up to date

#section:main
----------messages:(5/344)----------
command: main RedefineClassHelper
reason: User specified action: run main RedefineClassHelper 
Mode: othervm
Additional options from @modules: --add-modules java.base,java.compiler,java.instrument,jdk.jartool --add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-exports jdk.jartool/sun.tools.jar=ALL-UNNAMED
elapsed time (seconds): 0.84
----------configuration:(5/190)----------
Boot Layer
  add modules: java.base java.compiler java.instrument jdk.jartool 
  add exports: java.base/jdk.internal.misc ALL-UNNAMED
               jdk.jartool/sun.tools.jar   ALL-UNNAMED

----------System.out:(0/0)----------
----------System.err:(1/15)----------
STATUS:Passed.
----------rerun:(29/2543)*----------
cd /scratch/sspitsyn/tst/valhalla/JTwork/scratch && \\
DISPLAY=localhost:13.0 \\
HOME=/home/sspitsyn \\
JTREG_HOME=/java/re/jtreg/4.2/promoted/latest/binaries/jtreg \\
LANG=en_US.UTF-8 \\
PATH=/bin:/usr/bin \\
TZ=PST8PDT \\
CLASSPATH=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests:/scratch/sspitsyn/tst/valhalla/JTwork/classes/test/lib:/scratch/sspitsyn/valhalla/open/test/lib:/net/scanas416.us.oracle.com/export/java_re2/misc/nightly/jtreg/jtreg4.2/binaries/jtreg/lib/javatest.jar:/net/scanas416.us.oracle.com/export/java_re2/misc/nightly/jtreg/jtreg4.2/binaries/jtreg/lib/jtreg.jar \\
    /scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk/bin/java \\
        -Dtest.src=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests \\
        -Dtest.src.path=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests:/scratch/sspitsyn/valhalla/open/test/lib \\
        -Dtest.classes=/scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d \\
        -Dtest.class.path=/scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d:/scratch/sspitsyn/tst/valhalla/JTwork/classes/test/lib \\
        -Dtest.vm.opts='-Dtest.java.opts=-server -Xlog:redefine+class+nestmates=trace' \\
        -Dtest.tool.vm.opts='-J-Dtest.java.opts=-server -J-Xlog:redefine+class+nestmates=trace' \\
        -Dtest.compiler.opts= \\
        -Dtest.java.opts= \\
        -Dtest.jdk=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk \\
        -Dcompile.jdk=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk \\
        -Dtest.timeout.factor=1.0 \\
        -Dtest.modules='java.base/jdk.internal.misc java.compiler java.instrument jdk.jartool/sun.tools.jar' \\
        -Dtest.nativepath=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/test/hotspot/jtreg/native \\
        --add-modules java.base,java.compiler,java.instrument,jdk.jartool \\
        --add-exports java.base/jdk.internal.misc=ALL-UNNAMED \\
        --add-exports jdk.jartool/sun.tools.jar=ALL-UNNAMED \\
        -Dtest.java.opts=-server \\
        -Xlog:redefine+class+nestmates=trace \\
        -Djava.library.path=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/test/hotspot/jtreg/native \\
        com.sun.javatest.regtest.agent.MainWrapper /scratch/sspitsyn/tst/valhalla/JTwork/runtime/RedefineTests/RedefineRunningMethods.d/main.0.jta
result: Passed. Execution successful

#section:build
----------messages:(5/157)----------
command: build RedefineRunningMethods
reason: Named class compiled on demand
Test directory:
  compile: RedefineRunningMethods
elapsed time (seconds): 1.365
result: Passed. Build successful

#section:compile
----------messages:(5/418)----------
command: compile /scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests/RedefineRunningMethods.java
reason: .class file out of date or does not exist
Additional options from @modules: --add-modules java.base,java.compiler,java.instrument,jdk.jartool --add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-exports jdk.jartool/sun.tools.jar=ALL-UNNAMED
Mode: othervm
elapsed time (seconds): 1.364
----------configuration:(10/624)----------
javac compilation environment
  add modules: java.base java.compiler java.instrument jdk.jartool 
  add exports: java.base/jdk.internal.misc ALL-UNNAMED
               jdk.jartool/sun.tools.jar   ALL-UNNAMED
  source path: /scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests 
               /scratch/sspitsyn/valhalla/open/test/lib 
  class path:  /scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests 
               /scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d 
               /scratch/sspitsyn/tst/valhalla/JTwork/classes/test/lib 

----------rerun:(24/1809)*----------
cd /scratch/sspitsyn/tst/valhalla/JTwork/scratch && \\
DISPLAY=localhost:13.0 \\
HOME=/home/sspitsyn \\
JTREG_HOME=/java/re/jtreg/4.2/promoted/latest/binaries/jtreg \\
LANG=en_US.UTF-8 \\
PATH=/bin:/usr/bin \\
TZ=PST8PDT \\
    /scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk/bin/javac \\
        -J-Dtest.java.opts=-server \\
        -J-Xlog:redefine+class+nestmates=trace \\
        -J-Dtest.src=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests \\
        -J-Dtest.src.path=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests:/scratch/sspitsyn/valhalla/open/test/lib \\
        -J-Dtest.classes=/scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d \\
        -J-Dtest.class.path=/scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d:/scratch/sspitsyn/tst/valhalla/JTwork/classes/test/lib \\
        -J-Dtest.vm.opts='-Dtest.java.opts=-server -Xlog:redefine+class+nestmates=trace' \\
        -J-Dtest.tool.vm.opts='-J-Dtest.java.opts=-server -J-Xlog:redefine+class+nestmates=trace' \\
        -J-Dtest.compiler.opts= \\
        -J-Dtest.java.opts= \\
        -J-Dtest.jdk=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk \\
        -J-Dcompile.jdk=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk \\
        -J-Dtest.timeout.factor=1.0 \\
        -J-Dtest.modules='java.base/jdk.internal.misc java.compiler java.instrument jdk.jartool/sun.tools.jar' \\
        -J-Dtest.nativepath=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/test/hotspot/jtreg/native \\
        @/scratch/sspitsyn/tst/valhalla/JTwork/runtime/RedefineTests/RedefineRunningMethods.d/compile.1.jta
----------System.out:(0/0)----------
----------System.err:(0/0)----------
result: Passed. Compilation successful

#section:main
----------messages:(5/582)----------
command: main -javaagent:redefineagent.jar -Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace RedefineRunningMethods
reason: User specified action: run main/othervm -javaagent:redefineagent.jar -Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace RedefineRunningMethods 
Mode: othervm [/othervm specified]
Additional options from @modules: --add-modules java.base,java.compiler,java.instrument,jdk.jartool --add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-exports jdk.jartool/sun.tools.jar=ALL-UNNAMED
elapsed time (seconds): 1.608
----------configuration:(5/190)----------
Boot Layer
  add modules: java.base java.compiler java.instrument jdk.jartool 
  add exports: java.base/jdk.internal.misc ALL-UNNAMED
               jdk.jartool/sun.tools.jar   ALL-UNNAMED

----------System.out:(1/134)----------
[1.584s][trace][redefine,class,nestmates] redefined class RedefineRunningMethods$B attribute change error: NestHost attribute removed
----------System.err:(17/1392)----------
java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the class NestHost or NestMembers attribute
	at java.instrument/sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
	at java.instrument/sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:190)
	at RedefineClassHelper.redefineClass(RedefineClassHelper.java:60)
	at RedefineClassHelper.redefineClass(RedefineClassHelper.java:50)
	at RedefineRunningMethods.main(RedefineRunningMethods.java:108)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:115)
	at java.base/java.lang.Thread.run(Thread.java:844)

JavaTest Message: Test threw exception: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the class NestHost or NestMembers attribute
JavaTest Message: shutting down test

STATUS:Failed.`main' threw exception: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the class NestHost or NestMembers attribute
----------rerun:(31/2759)*----------
cd /scratch/sspitsyn/tst/valhalla/JTwork/scratch && \\
DISPLAY=localhost:13.0 \\
HOME=/home/sspitsyn \\
JTREG_HOME=/java/re/jtreg/4.2/promoted/latest/binaries/jtreg \\
LANG=en_US.UTF-8 \\
PATH=/bin:/usr/bin \\
TZ=PST8PDT \\
CLASSPATH=/scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d:/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests:/scratch/sspitsyn/tst/valhalla/JTwork/classes/test/lib:/scratch/sspitsyn/valhalla/open/test/lib:/net/scanas416.us.oracle.com/export/java_re2/misc/nightly/jtreg/jtreg4.2/binaries/jtreg/lib/javatest.jar:/net/scanas416.us.oracle.com/export/java_re2/misc/nightly/jtreg/jtreg4.2/binaries/jtreg/lib/jtreg.jar \\
    /scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk/bin/java \\
        -Dtest.src=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests \\
        -Dtest.src.path=/scratch/sspitsyn/valhalla/open/test/hotspot/jtreg/runtime/RedefineTests:/scratch/sspitsyn/valhalla/open/test/lib \\
        -Dtest.classes=/scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d \\
        -Dtest.class.path=/scratch/sspitsyn/tst/valhalla/JTwork/classes/runtime/RedefineTests/RedefineRunningMethods.d:/scratch/sspitsyn/tst/valhalla/JTwork/classes/test/lib \\
        -Dtest.vm.opts='-Dtest.java.opts=-server -Xlog:redefine+class+nestmates=trace' \\
        -Dtest.tool.vm.opts='-J-Dtest.java.opts=-server -J-Xlog:redefine+class+nestmates=trace' \\
        -Dtest.compiler.opts= \\
        -Dtest.java.opts= \\
        -Dtest.jdk=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk \\
        -Dcompile.jdk=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/jdk \\
        -Dtest.timeout.factor=1.0 \\
        -Dtest.modules='java.base/jdk.internal.misc java.compiler java.instrument jdk.jartool/sun.tools.jar' \\
        -Dtest.nativepath=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/test/hotspot/jtreg/native \\
        --add-modules java.base,java.compiler,java.instrument,jdk.jartool \\
        --add-exports java.base/jdk.internal.misc=ALL-UNNAMED \\
        --add-exports jdk.jartool/sun.tools.jar=ALL-UNNAMED \\
        -Dtest.java.opts=-server \\
        -Xlog:redefine+class+nestmates=trace \\
        -Djava.library.path=/scratch/sspitsyn/valhalla/build/linux-x86_64-normal-server-release/images/test/hotspot/jtreg/native \\
        -javaagent:redefineagent.jar \\
        -Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace \\
        com.sun.javatest.regtest.agent.MainWrapper /scratch/sspitsyn/tst/valhalla/JTwork/runtime/RedefineTests/RedefineRunningMethods.d/main.2.jta
result: Failed. Execution failed: `main' threw exception: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the class NestHost or NestMembers attribute


test result: Failed. Execution failed: `main' threw exception: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the class NestHost or NestMembers attribute

Comments
Changeset: cf8d878e8aa7 Author: dholmes Date: 2018-06-04 02:53 -0400 URL: http://hg.openjdk.java.net/valhalla/valhalla/rev/cf8d878e8aa7 8199450: [Nestmates] several runtime/RedefineTests/* failed with the nestmates build Reviewed-by: mainline RFR for 8010319 ! test/hotspot/jtreg/ProblemList.txt ! test/hotspot/jtreg/runtime/RedefineTests/RedefineDoubleDelete.java ! test/hotspot/jtreg/runtime/RedefineTests/RedefineFinalizer.java ! test/hotspot/jtreg/runtime/RedefineTests/RedefineInterfaceCall.java ! test/hotspot/jtreg/runtime/RedefineTests/RedefineInterfaceMethods.java ! test/hotspot/jtreg/runtime/RedefineTests/RedefinePreviousVersions.java ! test/hotspot/jtreg/runtime/RedefineTests/RedefineRunningMethods.java ! test/hotspot/jtreg/runtime/RedefineTests/RedefineRunningMethodsWithBacktrace.java ! test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineBasic.java ! test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineBasicTest.java ! test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineRunningMethods_Shared.java
04-06-2018

The tests will need to be modified regardless as a simple string like: class A$B {} would actually have to be written as class A { class B {} } to define a nested class A$B. Consequently it may be simpler to just not use nested classes in tests that are not testing anything in relation to nested classes.
04-06-2018

Also: test/hotspot/jtreg/testlibrary_tests/RedefineClassTest.java
14-05-2018

That's one option. But if we can fix RedefineClassesHelper to actually deal with nested types correctly that will fix a number of existing tests and future ones.
04-05-2018

These test cases weren't written to test inner classes. I think they can be rewritten to not use inner classes.
04-05-2018

I'm investigating whether we can easily adapt the InMemoryJavaCompiler to actually produce correctly formed nested types.
19-04-2018

The related appcds tests fail as well.
19-04-2018

The InMemoryJavaCompiler is capable of compiling a source string that defines nested classes, but the "file manager" that the RedefineClassesHelper uses is badly formed and not suitable for retrieving multiple outputs as is the case when compiling a class with nested types. Simplest fix here seems to be to not use nested classes if possible.
19-03-2018

The compiler is off-the-hook. The $ is a legal, though discouraged, character in an identifier. So A$B is not a nested class definition it is a top-level class. The resulting class has no InnerClasses attribute nor any NestHost attribute. So we've been successfully using this form only through accident. If class redefinition looked at the InnerClasses attribute this would never have worked. Now that class redefinition does look at the NestHost attribute, it doesn't work. The tests need to be modified to either correctly create a nested class or to not use nested classes at all.
19-03-2018

This is actually a problem with javax.tools.JavaCompiler I think. The problem is that we pass a string like: public static String newB = "class RedefineFinalizer$B {" + " protected void finalize() { " + " System.out.println(\"Finalizer called\");" + " }" + "}"; to the compiler to compile, expecting to produce a classfile for a nested class B of the enclosing class RedefineFinalizer. But the string is compiled without putting any context to the "$" in the name and we simply generate a classfile representation for a class that happens to have "$" in its name. But it does not define a nested class. It doesn't have the NestHost attribute that javac would produce - it may not even have an InnerClasses attribute. So we need to look in detail at how this compiler operates.
12-03-2018