-
Notifications
You must be signed in to change notification settings - Fork 28
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ERROR] Could not find auth config for quay.io. Returning empty builder #386
Comments
Sorry for that, it seems that there are some issues between this image and our new permission system. When This is done so that output files will be owned by the current user and permission checks are supposed to be disabled inside the container but for some reason that didn't happen here. Are you using OSX? That could be a reason, and if you are using osx you can safely disable |
I'm using linux (arch linux). I was able to change that config setting, and got it to run. I would like to have the output files owned by the current user, so hopefully this can be fixed in another way. Thanks. |
We are investigating this issue and what can be changed. But it seems that there is another way to fix ownership issues on docker deamon level on your system. You'd first edit your /etc/docker/daemon.json to contain the value: After you restart the docker deamon all files created while inside any container (not only rabix-created ones) will be remaped to be owned by you when inspected outside. Because OSX, our standard development environment and cloud environments we target for execution have different permission/ownership handling than regular linux users we might default to suggesting linux users add this config. Not to mention that this method also fixes the same issue when using any docker container and not only in rabix. Additional information about userns-remap can be found in this article: https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/ |
Seeing the same issue on MacOS 10.13.2 with a new install of Docker and Rabix 1.0.4. Example fails. Tried the executor.set_permissions=false modification of the config/core.properties without success.
Thanks, David |
@DavidAustinNix There is maybe something wrong with your docker server that caused the client to hang and not complete the execution. Which version of docker are you running and have you tested running docker images outside of rabix? |
I just installed docker. Ran through some tests and it looks OK:
macbook-pro-5:~ u0028003$ docker --version
Docker version 17.12.0-ce, build c97c6d6
macbook-pro-5:~ u0028003$ docker-compose --version
docker-compose version 1.18.0, build 8dd22a9
macbook-pro-5:~ u0028003$ docker-machine --version
docker-machine version 0.13.0, build 9ba6da9
macbook-pro-5:~ u0028003$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
macbook-pro-5:~ u0028003$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
… On Jan 16, 2018, at 10:37 AM, milos-ljubinkovic ***@***.***> wrote:
@DavidAustinNix <https://github.com/davidaustinnix>
The key issue here is the line "[WARN] Start container method timed-out but still started the container, recovering. "
There is maybe something wrong with your docker server that caused the client to hang and maybe not complete the execution. Which version of docker are you running and have tested running docker images outside of rabix?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub <#386 (comment)>, or mute the thread <https://github.com/notifications/unsubscribe-auth/ALVfDaE6B8aOAaXfDsLyf6gpfWsRO78kks5tLN5DgaJpZM4Qg6f0>.
|
Would like to try some steps to see what happens.
|
Thanks for the help here.
Output for #1:
I changed the docker.remove_containers to false and ran ps:
macbook-pro-5:rabix-cli-1.0.4 u0028003$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4af1adf572f python:2-alpine "/bin/sh -c 'python …" 7 minutes ago Created laughing_babbage
dadfd6894c50 python:2-alpine "/bin/sh -c 'python …" 7 minutes ago Created angry_babbage
895c1a477c47 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago amazing_bose
2c45307c2d57 hello-world "/hello" 23 hours ago Exited (0) 23 hours ago laughing_hugle
Inspected the first container, see attached.
#2) No luck:
macbook-pro-5:rabix-cli-1.0.4 u0028003$ ./rabix examples/dna2protein/dna2protein.cwl.json examples/dna2protein/inputs.json
[2018-01-16 14:53:28.257] [INFO] Job root.Transcribe has started
[2018-01-16 14:53:29.420] [INFO] Job root.Transcribe failed with exit code 125. with message:
/usr/local/bin/docker: Error response from daemon: Mounts denied:
The paths /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/data/input.txt and /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-145326.639/root/Transcribe
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
.
Job root.Transcribe failed with exit code 125. with message:
/usr/local/bin/docker: Error response from daemon: Mounts denied:
The paths /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/data/input.txt and /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-145326.639/root/Transcribe
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
.
#3) Seeing stack trace errors:
macbook-pro-5:rabix-cli-1.0.2 u0028003$ ./rabix examples/dna2protein/dna2protein.cwl.json examples/dna2protein/inputs.json
[2018-01-16 15:00:43.434] [INFO] Job root.Transcribe has started
[2018-01-16 15:00:43.465] [INFO] Pulling docker image python:2-alpine
[2018-01-16 15:00:43.471] [WARN] Could not find auth field for https://index.docker.io/v1/
^Cmacbook-pro-5:rabix-cli-1.0.2 u0028003$ ./rabix examples/dna2protein/dna2protein.cwl.json examples/dna2protein/inputs.json
[2018-01-16 15:00:48.896] [INFO] Job root.Transcribe has started
[2018-01-16 15:00:48.926] [INFO] Pulling docker image python:2-alpine
[2018-01-16 15:00:48.931] [WARN] Could not find auth field for https://index.docker.io/v1/
[2018-01-16 15:00:49.579] [INFO] Running command line: python transcribe_argparse.py -d /Applications/BioApps/Rabix/rabix-cli-1.0.2/examples/dna2protein/data/input.txt --verbose > /Applications/BioApps/Rabix/rabix-cli-1.0.2/examples/dna2protein/dna2protein.cwl-2018-01-16-150046.501/root/Transcribe/rna.txt
[2018-01-16 15:00:49.762] [ERROR] Method invocation failed. Method public synchronized void org.rabix.executor.container.impl.DockerContainerHandler$DockerClientLockDecorator.startContainer(java.lang.String) throws com.spotify.docker.client.exceptions.DockerException,java.lang.InterruptedException
java.util.concurrent.ExecutionException: java.lang.Exception: com.spotify.docker.client.exceptions.DockerRequestException: Request error: POST unix://localhost:80/containers/54871585d6c65b46a0df42d6ea1acccb803f87b81c79b37301ad068f12121f3e/start: 502
at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:1.8.0_121]
at java.util.concurrent.FutureTask.get(FutureTask.java:206) ~[na:1.8.0_121]
at org.rabix.common.retry.RetryMethodInterceptor.callWithTimeout(RetryMethodInterceptor.java:88) ~[rabix-cli.jar:na]
at org.rabix.common.retry.RetryMethodInterceptor.invoke(RetryMethodInterceptor.java:45) ~[rabix-cli.jar:na]
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:75) [rabix-cli.jar:na]
at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:55) [rabix-cli.jar:na]
at org.rabix.executor.container.impl.DockerContainerHandler$DockerClientLockDecorator$$EnhancerByGuice$$9b3f02d3.startContainer(<generated>) [rabix-cli.jar:na]
at org.rabix.executor.container.impl.DockerContainerHandler.start(DockerContainerHandler.java:269) [rabix-cli.jar:na]
at org.rabix.executor.handler.impl.JobHandlerImpl.start(JobHandlerImpl.java:195) [rabix-cli.jar:na]
at org.rabix.executor.execution.command.StartCommand.run(StartCommand.java:32) [rabix-cli.jar:na]
at org.rabix.executor.execution.JobHandlerCommand.run(JobHandlerCommand.java:51) [rabix-cli.jar:na]
at org.rabix.executor.execution.JobHandlerRunnable.run(JobHandlerRunnable.java:60) [rabix-cli.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]
Caused by: java.lang.Exception: com.spotify.docker.client.exceptions.DockerRequestException: Request error: POST unix://localhost:80/containers/54871585d6c65b46a0df42d6ea1acccb803f87b81c79b37301ad068f12121f3e/start: 502
at org.rabix.common.retry.RetryMethodInterceptor$1.call(RetryMethodInterceptor.java:83) ~[rabix-cli.jar:na]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_121]
... 3 common frames omitted
Caused by: com.spotify.docker.client.exceptions.DockerRequestException: Request error: POST unix://localhost:80/containers/54871585d6c65b46a0df42d6ea1acccb803f87b81c79b37301ad068f12121f3e/start: 502
at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:1599) ~[rabix-cli.jar:na]
at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1560) ~[rabix-cli.jar:na]
at com.spotify.docker.client.DefaultDockerClient.containerAction(DefaultDockerClient.java:579) ~[rabix-cli.jar:na]
at com.spotify.docker.client.DefaultDockerClient.startContainer(DefaultDockerClient.java:571) ~[rabix-cli.jar:na]
at org.rabix.executor.container.impl.DockerContainerHandler$DockerClientLockDecorator.startContainer(DockerContainerHandler.java:565) ~[rabix-cli.jar:na]
at org.rabix.common.retry.RetryMethodInterceptor$1.call(RetryMethodInterceptor.java:81) ~[rabix-cli.jar:na]
... 4 common frames omitted
Caused by: javax.ws.rs.ServerErrorException: HTTP 502 Bad Gateway
at org.glassfish.jersey.client.JerseyInvocation.createExceptionForFamily(JerseyInvocation.java:1029) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1009) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:799) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:91) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.JerseyInvocation$5.completed(JerseyInvocation.java:760) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.ClientRuntime.processResponse(ClientRuntime.java:197) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.ClientRuntime.access$300(ClientRuntime.java:78) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.ClientRuntime$2.run(ClientRuntime.java:179) ~[rabix-cli.jar:na]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) ~[rabix-cli.jar:na]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) ~[rabix-cli.jar:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[rabix-cli.jar:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[rabix-cli.jar:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:267) ~[rabix-cli.jar:na]
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:340) ~[rabix-cli.jar:na]
at org.glassfish.jersey.client.ClientRuntime$3.run(ClientRuntime.java:209) ~[rabix-cli.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_121]
... 4 common frames omitted
Again, thanks for your help here. Hopefully some of this makes sense.
On Jan 16, 2018, at 2:26 PM, milos-ljubinkovic ***@***.***> wrote:
@DavidAustinNix <https://github.com/davidaustinnix>
Would like to try some steps to see what happens.
Re-run the example with bunny's docker.remove_containers config changed to false. Afterwards you can list the containers with the docker ps -a command and inspect them with the docker inspect {container-id} to see if there's anything in their status/logs that can explain the error.
Uncomment the #executor.override.command=/usr/local/bin/docker run ... config and re-run. This will force rabix to use the command line interface instead of using the tcp socket. (might need to alter the path to the docker client binary if it isn't located in /usr/local/bin)
Try an older version of bunny. Releases 1.0.0-1.0.2 might behave differently as they use a different version of docker client library.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub <#386 (comment)>, or mute the thread <https://github.com/notifications/unsubscribe-auth/ALVfDY-bV5AkBrZQRPRwSdgG7dlswK_Yks5tLRPygaJpZM4Qg6f0>.
[
{
"Id": "d4af1adf572fa72329fe54df55ad54a51c34e3cfdd11b8a06f9ada1a4785db49",
"Created": "2018-01-16T21:41:07.186518996Z",
"Path": "/bin/sh",
"Args": [
"-c",
"python translate.py > /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate/protein.txt"
],
"State": {
"Status": "created",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "0001-01-01T00:00:00Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0781c116c4062063ec15f1789883b808fe4c7a3fb4b425cd9cd2dbc115cfbbc6",
"ResolvConfPath": "",
"HostnamePath": "",
"HostsPath": "",
"LogPath": "",
"Name": "/laughing_babbage",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": [
"/Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate:/Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": null,
"RestartPolicy": {
"Name": "",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": [
"DAC_OVERRIDE"
],
"CapDrop": null,
"Dns": null,
"DnsOptions": null,
"DnsSearch": null,
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "shareable",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": null,
"DeviceCgroupRules": null,
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/1b69028c1d34e306ce83813dd57f5049f42bfb649f73f27ffe675e38d0b1c049-init/diff:/var/lib/docker/overlay2/ca40c6633fa90d8bb74c2502cf94388623a44cf6ef7e95c422830ec46f379499/diff:/var/lib/docker/overlay2/0e9f4ef1a91c2b2089a47bf8404d346ae3b1d77d1682efba47025d789f5a7ae7/diff:/var/lib/docker/overlay2/cf105ce22852cd5d4df17b18082f19015913e900d30fbae41533859bb730d914/diff:/var/lib/docker/overlay2/13f8047664d1183e8389116d01cf5f250e9a8147f9c147e1db0ad730077b2cf0/diff",
"MergedDir": "/var/lib/docker/overlay2/1b69028c1d34e306ce83813dd57f5049f42bfb649f73f27ffe675e38d0b1c049/merged",
"UpperDir": "/var/lib/docker/overlay2/1b69028c1d34e306ce83813dd57f5049f42bfb649f73f27ffe675e38d0b1c049/diff",
"WorkDir": "/var/lib/docker/overlay2/1b69028c1d34e306ce83813dd57f5049f42bfb649f73f27ffe675e38d0b1c049/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "bind",
"Source": "/Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate",
"Destination": "/Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
"Hostname": "d4af1adf572f",
"Domainname": "",
"User": "504:20",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"HOME=/Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate",
"TMPDIR=/Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate",
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"GPG_KEY=C01E1CAD5EA2C4F0B8E3571504C367C218ADD4FF",
"PYTHON_VERSION=2.7.14",
"PYTHON_PIP_VERSION=9.0.1"
],
"Cmd": [
"-c",
"python translate.py > /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate/protein.txt"
],
"Image": "python:2-alpine",
"Volumes": null,
"WorkingDir": "/Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-144101.639/root/Translate",
"Entrypoint": [
"/bin/sh"
],
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "",
"EndpointID": "",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
}
}
]
|
This seems to be the cause:
After adding the path (something like Weird that this error message wasn't reported on a regular run or that the task didn't fail because of it. I'll see about changing this. |
Yes, that worked!
The issue was I installed Rabix in /Applications/…. This is not one of the default directories that Docker shares. Must add it manually per your instructions.
Thanks!
… On Jan 16, 2018, at 3:09 PM, milos-ljubinkovic ***@***.***> wrote:
This seems to be the cause:
The paths /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/data/input.txt and /Applications/BioApps/Rabix/rabix-cli-1.0.4/examples/dna2protein/dna2protein.cwl-2018-01-16-145326.639/root/Transcribe
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces <https://docs.docker.com/docker-for-mac/osxfs/#namespaces> for more info.
After adding the path (something like /Applications/BioApps/Rabix/rabix-cli-1.0.4/) to the docker shared folders it should work. This is what the window looks like after you click on the docker task bar icon and open the preferences:
<https://user-images.githubusercontent.com/3133629/35014708-f7a46918-fb11-11e7-88d3-3e6af27a6d76.png>
Weird that this error message wasn't reported on a regular run or that the task didn't fail because of it. I'll see about changing this.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub <#386 (comment)>, or mute the thread <https://github.com/notifications/unsubscribe-auth/ALVfDX9GJdb2ZBaKFYqlqPeTQTmOedMYks5tLR4kgaJpZM4Qg6f0>.
|
Hello, I am getting the same error "Could not find auth config for quay.io. Returning empty builder". I did add the Application folder where I have the RabixComposer and the /Users folder is already shared that has the rabix-cli-1.0.1, following your instructions above in the docker preferences. Can you help identify a solution? |
In attempting to run rabix (1.0.3) on the command line on a CWL file that uses a docker container on quay.io, I got the above error message. Attached is a zip with a CWL file, an inputs file, and a log of the run. (I tried this with rabix 1.0.1, and it worked. In that case, that message also appeared, but the job ran without failure.)
KNF.zip
The text was updated successfully, but these errors were encountered: