9b621aa2b063242958547574d4f39e2dc044efba
[sdnc/northbound.git] / vnfapi / model / src / main / yang / VNF-API.yang
1 module VNF-API {\r
2 \r
3     yang-version 1;\r
4 \r
5     namespace "org:onap:sdnctl:vnf";\r
6 \r
7     prefix vnfapi;\r
8 \r
9     import ietf-inet-types { prefix "ietf"; revision-date "2010-09-24"; }\r
10 \r
11     include "vnfsubmodule";\r
12 \r
13     organization "ONAP";\r
14 \r
15     contact\r
16         "Network Controller <onap-sdnc@lists.onap.org>";\r
17 \r
18     description\r
19         "Defines API interface for VNF Orchestration";\r
20 \r
21     revision "2015-07-20" {\r
22         description\r
23             "Initial draft";\r
24     }\r
25 \r
26     // Last updated on 8-17-2016\r
27     grouping sdnc-request-header {\r
28         container sdnc-request-header {\r
29             leaf svc-request-id {\r
30                 type string;\r
31             }\r
32             leaf svc-action {\r
33                 type enumeration {\r
34                     enum "reserve";\r
35                     enum "assign";\r
36                     enum "activate";  // equal to commit\r
37                     enum "delete";    // equal to commit\r
38                     enum "changeassign";\r
39                     enum "changedelete";\r
40                     enum "rollback";\r
41                 }\r
42             }\r
43             leaf svc-notification-url {\r
44                 type string;\r
45             }\r
46         }\r
47     }\r
48 \r
49     grouping request-information {\r
50         container request-information {\r
51             leaf request-id {\r
52                 type string;\r
53             }\r
54             leaf request-action {\r
55                 type enumeration {\r
56                     enum "PreloadNetworkRequest";\r
57                     enum "DeletePreloadNetworkRequest";\r
58                     enum "NetworkActivateRequest";\r
59                     enum "DisconnectNetworkRequest";\r
60                     enum "PreloadVNFRequest";\r
61                     enum "DeletePreloadVNFRequest";\r
62                     enum "VNFActivateRequest";\r
63                     enum "ChangeVNFActivateRequest";\r
64                     enum "DisconnectVNFRequest";\r
65                     enum "PreloadVnfInstanceRequest";\r
66                     enum "DeletePreloadVnfInstanceRequest";\r
67                     enum "VnfInstanceActivateRequest";\r
68                     enum "ChangeVnfInstanceActivateRequest";\r
69                     enum "DisconnectVnfInstanceRequest";\r
70                     enum "PreloadVfModuleRequest";\r
71                     enum "DeletePreloadVfModuleRequest";\r
72                     enum "VfModuleActivateRequest";\r
73                     enum "ChangeVfModuleActivateRequest";\r
74                     enum "DisconnectVfModuleRequest";\r
75                 }\r
76             }\r
77             leaf request-sub-action {\r
78                 type enumeration {\r
79                     enum "SUPP";\r
80                     enum "CANCEL";\r
81                 }\r
82             }\r
83             leaf source {\r
84                 type string;\r
85             }\r
86             leaf notification-url {\r
87                 type string;\r
88             }\r
89             leaf order-number {\r
90                 type string;\r
91             }\r
92             leaf order-version {\r
93                 type string;\r
94             }\r
95         }\r
96     }\r
97 \r
98     grouping service-information {\r
99         container service-information {\r
100             // 1610 use for AnAI subscription-service-type\r
101             leaf service-type {\r
102                 type string;\r
103                 description "AnAI subscription-service-type";\r
104             }\r
105             leaf service-id {\r
106                 type string;\r
107             }\r
108             leaf service-instance-id {\r
109                 type string;\r
110                 description "A service instance that a VNF or a l3-network is associated with";\r
111             }\r
112             // 1610 use for global-customer-id\r
113             leaf subscriber-name {\r
114                 type string;\r
115                 description "AnAI global-customer-id";\r
116             }\r
117         }\r
118     }\r
119 \r
120 \r
121     grouping vnf-request-information {\r
122         container vnf-request-information {\r
123             leaf vnf-request-version {\r
124                 type string;\r
125             }\r
126             leaf model-customization-uuid {\r
127                 type string;\r
128                 description "customized resource, i.e. vf-module, for use within a given service";\r
129             }\r
130             leaf use-preload {\r
131                 type enumeration {\r
132                     enum "Y";\r
133                     enum "N";\r
134                 }\r
135                 description "orchestrate vf-module with full preload data or TOSCA lookup plus EIPAM automation";\r
136             }\r
137             leaf vnf-id {\r
138                 type string;\r
139                 description "vf-module-id";\r
140             }\r
141             leaf vnf-type {\r
142                 type string;\r
143                 description "vf-module-type";\r
144             }\r
145             leaf vnf-name {\r
146                 type string;\r
147                 description "vf-module-name";\r
148             }\r
149             leaf generic-vnf-id {\r
150                 type string;\r
151                 description "generic vnf-id";\r
152             }\r
153             leaf generic-vnf-type {\r
154                 type string;\r
155                 description "generic vnf type";\r
156             }\r
157             leaf generic-vnf-name {\r
158                 type string;\r
159                 description "generic vnf name";\r
160             }\r
161             leaf tenant {\r
162                 type string;\r
163             }\r
164             leaf aic-clli {\r
165                 type string;\r
166             }\r
167             leaf aic-cloud-region {\r
168                 type string;\r
169                 description "The AIC cloud region which maps to contrail versions";\r
170             }\r
171             list vnf-networks {\r
172                 key network-role;\r
173                 uses vnf-network;\r
174                 description "Network List";\r
175             }\r
176         }\r
177     }\r
178 \r
179     grouping network-request-information {\r
180         container network-request-information {\r
181             leaf network-id {\r
182                 type string;\r
183             }\r
184             leaf network-type {\r
185                 type string;\r
186             }\r
187             leaf network-name {\r
188                 type string;\r
189             }\r
190             leaf tenant {\r
191                 type string;\r
192             }\r
193             leaf aic-clli {\r
194                 type string;\r
195             }\r
196             leaf aic-cloud-region {\r
197                 type string;\r
198                 description "The AIC cloud region which maps to contrail versions";\r
199             }\r
200         }\r
201     }\r
202 \r
203     /***********************************************************/\r
204     /*               PRELOAD DATA                                 */\r
205     /***********************************************************/\r
206 \r
207     container preload-vnfs {\r
208         uses preload-model-information;\r
209     }\r
210     grouping preload-model-information {\r
211         list vnf-preload-list {\r
212             key "vnf-name vnf-type";\r
213             leaf vnf-name {\r
214                 type string;\r
215                 description "vf-module-name";\r
216             }\r
217             leaf vnf-type {\r
218                 type string;\r
219                 description "vf-module-type";\r
220             }\r
221             uses preload-data;\r
222         }\r
223     }\r
224 \r
225     // For preload networks it will have network-topology-information\r
226     // For preload vnfs, it will have vnf-topology-information\r
227     grouping preload-data {\r
228         container preload-data {\r
229             uses vnf-topology-information;\r
230             uses network-topology-information;\r
231             uses oper-status;\r
232         }\r
233     }\r
234 \r
235 \r
236     grouping vnf-topology-information {\r
237         container vnf-topology-information {\r
238             uses vnf-topology-identifier;\r
239             uses vnf-assignments;\r
240             uses vnf-parameters;\r
241         }\r
242     }\r
243 \r
244     grouping vnf-topology-identifier {\r
245         container vnf-topology-identifier {\r
246             leaf service-type {\r
247                 type string;\r
248             }\r
249             leaf service-id {\r
250                 type string;\r
251             }\r
252             leaf vnf-name {\r
253                 type string;\r
254                 description "vf-module-name";\r
255             }\r
256             leaf vnf-type {\r
257                 type string;\r
258                 description "vf-module-type";\r
259             }\r
260             leaf generic-vnf-name {\r
261                 type string;\r
262             }\r
263             leaf generic-vnf-type {\r
264                 type string;\r
265             }\r
266             leaf generic-vnf-id {\r
267                 type string;\r
268             }\r
269         }\r
270     }\r
271 \r
272     grouping vnf-assignments {\r
273         container vnf-assignments {\r
274             leaf vnf-status {\r
275                 type string;\r
276                 description "Orchestration Status from AAI - to be set by SDNC";\r
277             }\r
278             list availability-zones {\r
279                 key "availability-zone";\r
280                 ordered-by  user;\r
281                 leaf availability-zone {\r
282                     type string;\r
283                     description "Openstack availability zone name or UUID";\r
284                 }\r
285             }\r
286             list vnf-networks {\r
287                 key network-role;\r
288                 uses vnf-network;\r
289                 // 1610\r
290                 uses sriov-vlan-filter-list;\r
291                 description "Network List";\r
292             }\r
293             uses vm-topology;\r
294         }\r
295     }\r
296 \r
297     grouping vm-topology {\r
298         list vnf-vms {\r
299             key vm-type;\r
300             leaf vm-type {\r
301                 type string;\r
302             }\r
303             leaf vm-count {\r
304                 type uint8;\r
305             }\r
306             list vm-names {\r
307                 key "vm-name";\r
308                 ordered-by user;\r
309                 leaf vm-name {\r
310                     type string;\r
311                 }\r
312             }\r
313             //leaf-list vm-names {\r
314             //    type string;\r
315             //    ordered-by user;\r
316             //}\r
317             list vm-networks {\r
318                 key network-role;\r
319                 uses vm-network;\r
320                 description "Network List";\r
321             }\r
322         }\r
323     }\r
324 \r
325     grouping vnf-network {\r
326         leaf network-role {\r
327             type string;\r
328             description "A Network Role to which a VNF must connect";\r
329         }\r
330         leaf network-name {\r
331             type string;\r
332             description "Unique Neutron UUID of an instance of the network role ";\r
333         }\r
334         leaf neutron-id {\r
335             type string;\r
336             description "Unique Neutron UUID of an instance of the network role ";\r
337         }\r
338         leaf network-id {\r
339             type string;\r
340             description "Unique Neutron UUID of an instance of the network role ";\r
341         }\r
342         leaf subnet-id {\r
343             type string;\r
344             description "ipv4 subnet UUID to be passed into the HEAT template for DHCP assignment";\r
345         }\r
346         leaf contrail-network-fqdn {\r
347             type string;\r
348             description "contrail network policy object";\r
349         }\r
350         // 1610\r
351         leaf ipv6-subnet-id {\r
352             type string;\r
353             description "ipv6 subnet UUID to be passed into the HEAT template for DHCP assignment";\r
354         }\r
355         leaf ipv6-subnet-name {\r
356             type string;\r
357             description "ipv6 subnet-name that corresponds to the ipv6 subnet-id";\r
358         }\r
359         leaf subnet-name {\r
360             type string;\r
361             description "ipv4 subnet-name that corresponds to the ipv4 subnet-id";\r
362         }\r
363     }\r
364 \r
365     // 1610\r
366     grouping sriov-vlan-filter-list {\r
367         list sriov-vlan-filter-list {\r
368             key "sriov-vlan-filter";\r
369             leaf sriov-vlan-filter {\r
370                 type string;\r
371             }\r
372         }\r
373     }\r
374 \r
375     grouping vm-network {\r
376         leaf network-role {\r
377             type string;\r
378             description "network (identified by role) that this VM connects to.  Should also be included in the vnf-networks for the containing VNF";\r
379 \r
380         }\r
381         leaf use-dhcp {\r
382             type enumeration {\r
383                   enum "Y";\r
384                   enum "N";\r
385             }\r
386             description "Indicator to use DHCP on this network for this VM";\r
387         }\r
388         leaf ip-count {\r
389             type uint8;\r
390             description "The number of ip addresses to be assigned per vm for this network role";\r
391         }\r
392         list network-ips {\r
393             key "ip-address";\r
394             ordered-by user;\r
395             leaf ip-address {\r
396                 //type string;\r
397                 type ietf:ip-address;\r
398                 description "List of assigned ipv4 addresses on a network";\r
399             }\r
400         }\r
401         list network-ips-v6 {\r
402             key "ip-address-ipv6";\r
403             ordered-by user;\r
404             leaf ip-address-ipv6 {\r
405                 //type string;\r
406                 type ietf:ipv6-address;\r
407                 description "List of assigned ipv6 addresses on a network";\r
408             }\r
409         }\r
410         list network-macs {\r
411             key "mac-address";\r
412             ordered-by user;\r
413             leaf mac-address {\r
414                 type string;\r
415                 description "List of network assignments for this VM (one per network)";\r
416             }\r
417         }\r
418         leaf floating-ip {\r
419             //type string;\r
420             type ietf:ip-address;\r
421             description "Floating ipv4 for VMs of a given type on this network";\r
422         }\r
423         leaf floating-ip-v6 {\r
424             //type string;\r
425             type ietf:ipv6-address;\r
426             description "Floating ipv6 for VMs of a given type on this network";\r
427         }\r
428         list interface-route-prefixes {\r
429             key "interface-route-prefix-cidr";\r
430             ordered-by user;\r
431             leaf interface-route-prefix {\r
432                 type ietf:ip-address;\r
433                 description "OBSOLETE, route prefixes (CIDRs) to be provided to MSO in vnf-topology as a list of static routes";\r
434             }\r
435             leaf interface-route-prefix-cidr {\r
436                 type string;\r
437                 description "route prefixes (CIDRs) in ip/cidr format to be provided to MSO in vnf-topology as a list of static routes";\r
438             }\r
439         }\r
440     }\r
441 \r
442     grouping vnf-parameters {\r
443         list vnf-parameters {\r
444             key vnf-parameter-name;\r
445             leaf vnf-parameter-name {\r
446                 type string;\r
447                 description "The name of an arbitrary instance-specific vnf-parameters";\r
448             }\r
449             leaf vnf-parameter-value {\r
450                 type string;\r
451                 description "The value of an arbitrary instance-specific vnf-parameters ";\r
452             }\r
453         }\r
454     }\r
455 \r
456     grouping network-topology-information {\r
457         container network-topology-information {\r
458             uses network-topology-identifier;\r
459             uses subnets;\r
460             uses vpn-bindings;\r
461             uses network-policy;\r
462             uses route-table-reference;\r
463             uses provider-network-information;\r
464         }\r
465     }\r
466 \r
467     grouping network-topology-identifier {\r
468         container network-topology-identifier {\r
469             leaf service-type {\r
470                 type string;\r
471             }\r
472             leaf network-name {\r
473                 type string;\r
474             }\r
475             leaf network-role {\r
476                 type string;\r
477             }\r
478             leaf network-type {\r
479                 type string;\r
480             }\r
481             leaf network-technology{\r
482                 type string;\r
483             }\r
484         }\r
485     }\r
486     grouping subnets {\r
487         list subnets {\r
488             key start-address;\r
489             leaf start-address{\r
490                 type ietf:ip-address;\r
491                 //type string;\r
492             }\r
493             leaf gateway-address{\r
494                 //type string;\r
495                 type ietf:ip-address;\r
496             }\r
497             leaf cidr-mask{\r
498                 type string;\r
499             }\r
500             leaf ip-version {\r
501                 type string;\r
502             }\r
503             leaf dhcp-enabled {\r
504                 type enumeration {\r
505                     enum "Y";\r
506                     enum "N";\r
507                 }\r
508             }\r
509             leaf dhcp-start-address {\r
510                 type string;\r
511             }\r
512             leaf dhcp-end-address {\r
513                 type string;\r
514             }\r
515             // 1610\r
516             leaf subnet-name {\r
517                 type string;\r
518             }\r
519 \r
520         }\r
521     }\r
522 \r
523     grouping vpn-bindings {\r
524         list vpn-bindings {\r
525             key vpn-binding-id;\r
526             leaf vpn-binding-id {\r
527                 type string;\r
528             }\r
529             leaf global-route-target {\r
530                 type string;\r
531             }\r
532         }\r
533     }\r
534 \r
535     grouping network-policy {\r
536         list network-policy {\r
537             key network-policy-fqdn;\r
538             leaf network-policy-fqdn {\r
539                 type string;\r
540             }\r
541             leaf network-policy-id {\r
542                 type string;\r
543             }\r
544         }\r
545     }\r
546 \r
547     //1610\r
548     grouping route-table-reference {\r
549         list route-table-reference {\r
550             key "route-table-reference-id";\r
551             leaf route-table-reference-id {\r
552                 type string;\r
553             }\r
554             leaf route-table-reference-fqdn {\r
555                 type string;\r
556             }\r
557         }\r
558     }\r
559 \r
560     // 1610\r
561     grouping provider-network-information {\r
562         container provider-network-information {\r
563                 leaf physical-network-name {\r
564                     type string;\r
565                 }\r
566                 leaf is-provider-network {\r
567                     type boolean;\r
568                 }\r
569                 leaf is-shared-network {\r
570                     type boolean;\r
571                 }\r
572                 leaf is-external-network {\r
573                 type boolean;\r
574             }\r
575         }\r
576     }\r
577 \r
578     /***********************************************************/\r
579     /*               SERVICE_DATA                                */\r
580     /***********************************************************/\r
581     container vnfs {\r
582         uses vnf-model-infrastructure;\r
583     }\r
584     grouping vnf-model-infrastructure {\r
585         list vnf-list {\r
586             key vnf-id;\r
587             leaf vnf-id {\r
588                 type string;\r
589                 mandatory true;\r
590                 description "vf-module-id";\r
591             }\r
592             uses service-data;\r
593             uses service-status;\r
594         }\r
595     }\r
596     grouping service-data {\r
597         container service-data {\r
598             uses vnf-configuration-information;\r
599             uses oper-status;\r
600         }\r
601     }\r
602     grouping service-status {\r
603         container service-status {\r
604             leaf response-code {\r
605                 type string;\r
606             }\r
607             leaf response-message {\r
608                 type string;\r
609             }\r
610             leaf final-indicator {\r
611                 type string;\r
612             }\r
613             leaf request-status {\r
614                 type enumeration {\r
615                     enum "synccomplete";\r
616                     enum "asynccomplete";\r
617                     enum "notifycomplete";\r
618                 }\r
619             }\r
620             leaf vnfsdn-action {\r
621                 type enumeration {\r
622                     enum "PreloadNetworkRequest";\r
623                     enum "DeletePreloadNetworkRequest";\r
624                     enum "NetworkActivateRequest";\r
625                     enum "DisconnectNetworkRequest";\r
626                     enum "PreloadVNFRequest";\r
627                     enum "DeletePreloadVNFRequest";\r
628                     enum "VNFActivateRequest";\r
629                     enum "ChangeVNFActivateRequest";\r
630                     enum "DisconnectVNFRequest";\r
631                     enum "PreloadVnfInstanceRequest";\r
632                     enum "DeletePreloadVnfInstanceRequest";\r
633                     enum "VnfInstanceActivateRequest";\r
634                     enum "ChangeVnfInstanceActivateRequest";\r
635                     enum "DisconnectVnfInstanceRequest";\r
636                     enum "PreloadVfModuleRequest";\r
637                     enum "DeletePreloadVfModuleRequest";\r
638                     enum "VfModuleActivateRequest";\r
639                     enum "ChangeVfModuleActivateRequest";\r
640                     enum "DisconnectVfModuleRequest";\r
641                 }\r
642             }\r
643             leaf vnfsdn-subaction {\r
644                 type enumeration {\r
645                     enum "SUPP";\r
646                     enum "CANCEL";\r
647                 }\r
648             }\r
649             leaf rpc-name {\r
650                 type enumeration {\r
651                     enum "vnf-topology-operation";\r
652                     enum "preload-vnf-topology-operation";\r
653                     enum "vnf-instance-topology-operation";\r
654                     enum "preload-vnf-instance-topology-operation";\r
655                     enum "vf-module-topology-operation";\r
656                     enum "preload-vf-module-topology-operation";\r
657                 }\r
658             }\r
659             leaf rpc-action {\r
660                 type enumeration {\r
661                     enum "reserve";\r
662                     enum "assign";\r
663                     enum "activate";  // equal to commit\r
664                     enum "delete";      // equal to commit\r
665                     enum "changeassign";\r
666                     enum "changedelete";\r
667                     enum "rollback";\r
668                 }\r
669             }\r
670             leaf response-timestamp {\r
671                 type string;\r
672             }\r
673         }\r
674     }\r
675     grouping vnf-configuration-information {\r
676         uses sdnc-request-header;\r
677         uses request-information;\r
678         uses service-information;\r
679         uses vnf-request-information;\r
680         uses vnf-topology;\r
681     }\r
682     grouping vnf-topology-response-body {\r
683         leaf svc-request-id {\r
684             type string;\r
685         }\r
686         leaf response-code {\r
687             type string;\r
688         }\r
689         leaf response-message {\r
690             type string;\r
691         }\r
692         leaf ack-final-indicator {\r
693             type string;\r
694         }\r
695     }\r
696 \r
697     grouping vnf-information {\r
698         container vnf-information {\r
699             leaf vnf-service-type {\r
700                 type string;\r
701             }\r
702             leaf vnf-id {\r
703                 type string;\r
704                 description "vf-module-id";\r
705             }\r
706         }\r
707     }\r
708 \r
709     grouping network-information {\r
710         container network-information {\r
711             leaf network-service-type {\r
712                 type string;\r
713             }\r
714             leaf network-id {\r
715                 type string;\r
716             }\r
717         }\r
718     }\r
719 \r
720 \r
721     // Carried over from l3sdn and potentially not needed\r
722     grouping oper-status {\r
723         container oper-status {\r
724             leaf order-status {\r
725                 type enumeration {\r
726                     enum "Active";\r
727                     enum "PendingAssignment";\r
728                     enum "PendingCreate";\r
729                     enum "PendingUpdate";\r
730                     enum "PendingDelete";\r
731                     enum "Deleted";\r
732 \r
733                 }\r
734             }\r
735             leaf last-action {\r
736                 type enumeration {\r
737                     enum "VNFActivateRequest";\r
738                     enum "ChangeVNFActivateRequest";\r
739                     enum "VnfInstanceActivateRequest";\r
740                     enum "ChangeVnfInstanceActivateRequest";\r
741                     enum "VfModuleActivateRequest";\r
742                     enum "ChangeVfModuleActivateRequest";\r
743                     enum "DisconnectVNFRequest";\r
744                     enum "DisconnectVnfInstanceRequest";\r
745                     enum "DisconnectVfModuleRequest";\r
746                     enum "PreloadVNFRequest";\r
747                     enum "DeletePreloadVNFRequest";\r
748                     enum "PreloadVnfInstanceRequest";\r
749                     enum "DeletePreloadVnfInstanceRequest";\r
750                     enum "PreloadVfModuleRequest";\r
751                     enum "DeletePreloadVfModuleRequest";\r
752                 }\r
753             }\r
754             leaf last-svc-request-id {\r
755                 type string;\r
756             }\r
757             leaf last-order-status {\r
758                 type enumeration {\r
759                     enum "Active";\r
760                     enum "PendingAssignment";\r
761                     enum "PendingCreate";\r
762                     enum "PendingUpdate";\r
763                     enum "PendingDelete";\r
764                     enum "Deleted";\r
765                 }\r
766             }\r
767             leaf create-timestamp {\r
768                 type string;\r
769             }\r
770             leaf modify-timestamp {\r
771                 type string;\r
772             }\r
773             leaf maintenance-indicator {\r
774                 type enumeration {\r
775                     enum "Y";\r
776                     enum "N";\r
777                 }\r
778             }\r
779         }\r
780     }\r
781     grouping vnf-topology {\r
782         leaf vnf-id {\r
783             type string;\r
784             description "vf-module-id";\r
785         }\r
786         uses vnf-topology-information;\r
787     }\r
788 \r
789 \r
790     rpc vnf-topology-operation {\r
791         input {\r
792             uses sdnc-request-header;\r
793             uses request-information;\r
794             uses service-information;\r
795             uses vnf-request-information;\r
796         }\r
797         output {\r
798             uses vnf-topology-response-body;\r
799             uses vnf-information;\r
800             uses service-information;\r
801         }\r
802     }\r
803 \r
804     rpc network-topology-operation {\r
805         input {\r
806             uses sdnc-request-header;\r
807             uses request-information;\r
808             uses service-information;\r
809             uses network-request-information;\r
810         }\r
811         output {\r
812             uses vnf-topology-response-body;\r
813             uses network-information;\r
814             uses service-information;\r
815         }\r
816     }\r
817 \r
818     rpc preload-vnf-topology-operation {\r
819         input {\r
820             uses sdnc-request-header;\r
821             uses request-information;\r
822             uses vnf-topology-information;\r
823         }\r
824         output {\r
825             uses vnf-topology-response-body;\r
826         }\r
827     }\r
828 \r
829     rpc preload-network-topology-operation {\r
830         input {\r
831             uses sdnc-request-header;\r
832             uses request-information;\r
833             uses network-topology-information;\r
834         }\r
835         output {\r
836             uses vnf-topology-response-body;\r
837         }\r
838     }\r
839 }\r