Modify pom and features file for CLI renderer. 02/30702/1
authorShixing Liu <liushixing@huawei.com>
Fri, 4 Dec 2015 10:24:51 +0000 (18:24 +0800)
committerShixing Liu <liushixing@huawei.com>
Fri, 4 Dec 2015 10:27:18 +0000 (18:27 +0800)
Add some config files for CLI renderer.

Change-Id: Ia3d9179f028796a7a49c082527dd8815246b05d6
Signed-off-by: Shixing Liu <liushixing@huawei.com>
nemo-features/pom.xml
nemo-features/src/main/features/features.xml
nemo-renderers/cli-renderer/pom.xml
nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/external-resource.json [new file with mode: 0644]
nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/host-resource.json [new file with mode: 0644]
nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/link-resource.json [new file with mode: 0644]
nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/node-resource.json [new file with mode: 0644]

index 44bd72b9ed24eafc202d6ef153f9788aacb6e7e9..99f119de5dc9cb4cc2007898de5370da75fd858b 100644 (file)
@@ -181,6 +181,34 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <classifier>config</classifier>
       <type>xml</type>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>cli-renderer</artifactId>
+      <version>${project.version}</version>
+      <classifier>node-resource</classifier>
+      <type>json</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>cli-renderer</artifactId>
+      <version>${project.version}</version>
+      <classifier>host-resource</classifier>
+      <type>json</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>cli-renderer</artifactId>
+      <version>${project.version}</version>
+      <classifier>link-resource</classifier>
+      <type>json</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>cli-renderer</artifactId>
+      <version>${project.version}</version>
+      <classifier>external-resource</classifier>
+      <type>json</type>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>nemo-ui</artifactId>
index f28721a61536110029171207fed3aa3a022d0a2f..e81288b1ba95bfbc65d8684d164db6df439fe830 100644 (file)
@@ -45,6 +45,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <feature version='${project.version}'>odl-nemo-engine-rest</feature>\r
     <bundle>mvn:org.opendaylight.nemo/cli-renderer/${project.version}</bundle>\r
     <configfile finalname='etc/opendaylight/karaf/02-nemo-cli-renderer.xml'>mvn:org.opendaylight.nemo/cli-renderer/${project.version}/xml/config</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-cli-renderer-node-resource.json'>mvn:org.opendaylight.nemo/cli-renderer/${project.version}/json/node-resource</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-cli-renderer-link-resource.json'>mvn:org.opendaylight.nemo/cli-renderer/${project.version}/json/link-resource</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-cli-renderer-host-resource.json'>mvn:org.opendaylight.nemo/cli-renderer/${project.version}/json/host-resource</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-cli-renderer-external-resource.json'>mvn:org.opendaylight.nemo/cli-renderer/${project.version}/json/external-resource</configfile>\r
   </feature>\r
   <feature name='odl-nemo-engine-ui' version='${project.version}' description='OpenDaylight :: NEMO :: Engine :: UI'>\r
     <feature version='${dlux.version}'>odl-dlux-core</feature>\r
index 9ec4d1563ab46a5f975d690c3475b997a26056a8..58579df09d6e5bb8e94a085981338204284602a4 100644 (file)
@@ -29,6 +29,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   </properties>
 
   <dependencies>
+    <dependency>
+      <groupId>org.jboss.netty</groupId>
+      <artifactId>netty</artifactId>
+      <version>3.2.6.Final</version>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>nemo-api</artifactId>
@@ -39,6 +44,22 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>nemo-impl</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jettison</groupId>
+      <artifactId>jettison</artifactId>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
@@ -66,6 +87,20 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       </plugins>
     </pluginManagement>
     <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <configuration>
+          <instructions>
+            <Export-Package>
+              org.codehaus.jackson,
+              org.codehaus.jackson.*,
+              org.joda.time.*
+            </Export-Package>
+            <Import-Package>*</Import-Package>
+          </instructions>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.opendaylight.yangtools</groupId>
         <artifactId>yang-maven-plugin</artifactId>
@@ -116,6 +151,26 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
                   <type>xml</type>
                   <classifier>config</classifier>
                 </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/node-resource.json</file>
+                  <type>json</type>
+                  <classifier>node-resource</classifier>
+                </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/host-resource.json</file>
+                  <type>json</type>
+                  <classifier>host-resource</classifier>
+                </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/link-resource.json</file>
+                  <type>json</type>
+                  <classifier>link-resource</classifier>
+                </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/external-resource.json</file>
+                  <type>json</type>
+                  <classifier>external-resource</classifier>
+                </artifact>
               </artifacts>
             </configuration>
           </execution>
diff --git a/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/external-resource.json b/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/external-resource.json
new file mode 100644 (file)
index 0000000..5201bf3
--- /dev/null
@@ -0,0 +1,32 @@
+{\r
+    "external-network: [\r
+        {\r
+          "node-id": "bank-branch1",\r
+          "access-node-id":"HW:NE40E:CE1",\r
+          "access-port-id":"HW:NE40E:CE1:GE1/0/0",\r
+          "layer":"3",\r
+          "protocol":"static",\r
+          "mac-address":""\r
+        },\r
+        {\r
+          "node-id": "bank-branch2",\r
+          "access-node-id":"HW:NE40E:CE2",\r
+          "access-port-id":"HW:NE40E:CE2:GE3/0/2",\r
+          "layer":"3",\r
+          "protocol":"static",\r
+          "mac-address":""\r
+        },\r
+        {\r
+          "node-id": "bank-DC",\r
+          "access-node-id":"HW:NE40E:CE3",\r
+          "access-port-id":"HW:NE40E:CE3:GE1/0/0",\r
+          "layer":"3",\r
+          "protocol":"static"          \r
+          "mac-address":""\r
+        }\r
+    ]\r
+}\r
+\r
+\r
+\r
+\r
diff --git a/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/host-resource.json b/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/host-resource.json
new file mode 100644 (file)
index 0000000..a86a271
--- /dev/null
@@ -0,0 +1,3 @@
+{ \r
+    "host":[]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/link-resource.json b/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/link-resource.json
new file mode 100644 (file)
index 0000000..5949908
--- /dev/null
@@ -0,0 +1,141 @@
+{  \r
+    "link": [\r
+        {\r
+          "link-id":"link_1",\r
+          "left-node-id":"HW:NE40E:CE1",\r
+          "left-port-id":"HW:NE40E:CE1:GE1/0/6",\r
+          "right-node-id":"HW:NE40E:PE1",\r
+          "right-port-id":"HW:NE40E:PE1:GE2/0/6",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"link_2",\r
+          "left-node-id":"HW:NE40E:PE1",\r
+          "left-port-id":"HW:NE40E:PE1:GE2/0/6",\r
+          "right-node-id":"HW:NE40E:CE1",\r
+          "right-port-id":"HW:NE40E:CE1:GE1/0/6",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+    \r
+        {\r
+          "link-id":"link_3",\r
+          "left-node-id":"HW:NE40E:PE1",\r
+          "left-port-id":"HW:NE40E:PE1:GE2/0/7",\r
+          "right-node-id":"HW:NE40E:PE2",\r
+          "right-port-id":"HW:NE40E:PE2:GE3/0/2",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"link_4",\r
+          "left-node-id":"HW:NE40E:PE2",\r
+          "left-port-id":"HW:NE40E:PE2:GE3/0/2",\r
+          "right-node-id":"HW:NE40E:PE1",\r
+          "right-port-id":"HW:NE40E:PE1:GE2/0/7",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+    \r
+        { \r
+          "link-id":"link_5",\r
+          "left-node-id":"HW:NE40E:PE1",\r
+          "left-port-id":"HW:NE40E:PE1:GE2/0/8",\r
+          "right-node-id":"HW:NE40E:PE3",\r
+          "right-port-id":"HW:NE40E:PE3:GE1/0/8",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"link_6",\r
+          "left-node-id":"HW:NE40E:PE3",\r
+          "left-port-id":"HW:NE40E:PE3:GE1/0/8",\r
+          "right-node-id":"HW:NE40E:PE1",\r
+          "right-port-id":"HW:NE40E:PE1:GE2/0/8",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+\r
+        {\r
+          "link-id":"link_7",\r
+          "left-node-id":"HW:NE40E:CE2",\r
+          "left-port-id":"HW:NE40E:CE2:GE3/0/3",\r
+          "right-node-id":"HW:NE40E:PE2",\r
+          "right-port-id":"HW:NE40E:PE2:GE3/0/3",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"link_8",\r
+          "left-node-id":"HW:NE40E:PE2",\r
+          "left-port-id":"HW:NE40E:PE2:GE3/0/3",\r
+          "right-node-id":"HW:NE40E:CE2",\r
+          "right-port-id":"HW:NE40E:CE2:GE3/0/3",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+    \r
+        {\r
+          "link-id":"link_9",\r
+          "left-node-id":"HW:NE40E:PE2",\r
+          "left-port-id":"HW:NE40E:PE2:GE3/0/1",\r
+          "right-node-id":"HW:NE40E:PE3",\r
+          "right-port-id":"HW:NE40E:PE3:GE1/0/2",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"link_10",\r
+          "left-node-id":"HW:NE40E:PE3",\r
+          "left-port-id":"HW:NE40E:PE3:GE1/0/2",\r
+          "right-node-id":"HW:NE40E:PE2",\r
+          "right-port-id":"HW:NE40E:PE2:GE3/0/1",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+    \r
+        {\r
+          "link-id":"link_11",\r
+          "left-node-id":"HW:NE40E:PE3",\r
+          "left-port-id":"HW:NE40E:PE3:GE1/0/0",\r
+          "right-node-id":"HW:NE40E:CE3",\r
+          "right-port-id":"HW:NE40E:CE3:GE1/0/10",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"link_12",\r
+          "left-node-id":"HW:NE40E:CE3",\r
+          "left-port-id":"HW:NE40E:CE3:GE1/0/10",\r
+          "right-node-id":"HW:NE40E:PE3",\r
+          "right-port-id":"HW:NE40E:PE3:GE1/0/0",\r
+          "link-bandwidth":"10240",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        }\r
+    ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/node-resource.json b/nemo-renderers/cli-renderer/src/main/resources/etc/opendaylight/karaf/node-resource.json
new file mode 100644 (file)
index 0000000..052dd0a
--- /dev/null
@@ -0,0 +1,311 @@
+{\r
+    "node": [\r
+        {\r
+          "node-id": "HW:NE40E:PE1",\r
+          "node-type": "router",\r
+          "attribute":[\r
+            {\r
+                "name":"location",\r
+                "value":"HW:NE40E:PE1"\r
+            },\r
+            {\r
+                "name":"capacity",\r
+                "value":""\r
+            }\r
+          ],\r
+          "port": [\r
+            {\r
+              "port-id": "HW:NE40E:PE1:GE2/0/6",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE1:GE2/0/6"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:PE1:GE2/0/7",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE1:GE2/0/7"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:PE1:GE2/0/8",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE1:GE2/0/8"\r
+                }\r
+              ]\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "node-id": "HW:NE40E:PE2",\r
+          "node-type": "router",\r
+          "attribute":[\r
+            {\r
+                "name":"location",\r
+                "value":"HW:NE40E:PE2"\r
+            },\r
+            {\r
+                "name":"capacity",\r
+                "value":""\r
+            }\r
+          ],\r
+          "port": [\r
+            {\r
+              "port-id": "HW:NE40E:PE2:GE3/0/1",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE2:GE3/0/1"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:PE2:GE3/0/2",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE2:GE3/0/2"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:PE2:GE3/0/3",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE2:GE3/0/3"\r
+                }\r
+              ]\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "node-id": "HW:NE40E:PE3",\r
+          "node-type": "router",\r
+          "attribute":[\r
+            {\r
+                "name":"location",\r
+                "value":"HW:NE40E:PE3"\r
+            },\r
+            {\r
+                "name":"capacity",\r
+                "value":""\r
+            }\r
+          ],\r
+          "port": [\r
+            {\r
+              "port-id": "HW:NE40E:PE3:GE1/0/0",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE3:GE1/0/0"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:PE3:GE1/0/2",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE3:GE1/0/2"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:PE3:GE1/0/8",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:PE3:GE1/0/8"\r
+                }\r
+              ]\r
+            }\r
+          ]\r
+        },   \r
+        {\r
+          "node-id": "HW:NE40E:CE1",\r
+          "node-type": "router",\r
+          "attribute":[\r
+            {\r
+                "name":"location",\r
+                "value":"HW:NE40E:CE1"\r
+            },\r
+            {\r
+                "name":"capacity",\r
+                "value":""\r
+            }\r
+          ],\r
+          "port": [\r
+            {\r
+              "port-id": "HW:NE40E:CE1:GE1/0/0",\r
+              "port-type":"external",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:CE1:GE1/0/0"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:CE1:GE1/0/6",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:CE1:GE1/0/6"\r
+                }\r
+              ]\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "node-id": "HW:NE40E:CE2",\r
+          "node-type": "router",\r
+          "attribute":[\r
+            {\r
+                "name":"location",\r
+                "value":"HW:NE40E:CE2"\r
+            },\r
+            {\r
+                "name":"capacity",\r
+                "value":""\r
+            }\r
+          ],\r
+          "port": [\r
+            {\r
+              "port-id": "HW:NE40E:CE2:GE3/0/2",\r
+              "port-type":"external",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:CE2:GE3/0/2"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:CE2:GE3/0/3",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:CE2:GE3/0/3"\r
+                }\r
+              ]\r
+            }\r
+          ] \r
+        },\r
+        {\r
+          "node-id": "HW:NE40E:CE3",\r
+          "node-type": "router",\r
+          "attribute":[\r
+            {\r
+                "name":"location",\r
+                "value":"HW:NE40E:CE3"\r
+            },\r
+            {\r
+                "name":"capacity",\r
+                "value":""\r
+            }\r
+          ],\r
+          "port": [\r
+            {\r
+              "port-id": "HW:NE40E:CE3:GE1/0/0",\r
+              "port-type":"external",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:CE3:GE1/0/0"\r
+                }\r
+              ]\r
+            },\r
+            {\r
+              "port-id": "HW:NE40E:CE3:GE1/0/10",\r
+              "port-type":"internal",\r
+              "port-ip-address": "",\r
+              "port-mac-address":"",\r
+              "mask": "",\r
+              "bandwidth":"",\r
+              "attribute":[\r
+                {\r
+                    "name":"location",\r
+                    "value":"HW:NE40E:CE3:GE1/0/10"\r
+                }\r
+              ]\r
+            }\r
+          ]\r
+        }\r
+\r
+    ]\r
+}
\ No newline at end of file