0634e5c77b903038973c6ca96a4934b64edb332c
Guides/Webform-Integration-Sub-Folder.md
| ... | ... | @@ -221,6 +221,8 @@ href="Resources/...." and change them to href="Izenda/Resources/...." |
| 221 | 221 | |
| 222 | 222 | **c.** At the end < Head > section, insert the below code snippet. If the sub folder has a different name, replace the index of 'Izenda' below with that name. |
| 223 | 223 | ```html |
| 224 | +<!-- The below code hides Izenda from the main page --> |
|
| 225 | + |
|
| 224 | 226 | <script type="text/javascript"> |
| 225 | 227 | $(document).ready(function HideHeader() { |
| 226 | 228 | if (window.location.href.indexOf('Izenda') === -1) { |
| ... | ... | @@ -428,368 +430,9 @@ Add the Reporting folder in mvc5r3\Views to the project's Views |
| 428 | 430 | |
| 429 | 431 |  |
| 430 | 432 | |
| 431 | -###Step 7. Add _sitelayout to project’s Views\Shared |
|
| 432 | - |
|
| 433 | -Add _sitelayout from mvc5r3\Views\Shared to project’s Views\Shared |
|
| 434 | - |
|
| 435 | - |
|
| 436 | - |
|
| 437 | - |
|
| 438 | - |
|
| 439 | -**b.** Paste it in project’s Global.asax |
|
| 440 | - |
|
| 441 | -###Global.asax from Sample_MVCApp(C♯) |
|
| 442 | -```csharp |
|
| 443 | -<%@ Application Codebehind="Global.asax.cs" Inherits="Sample_MVCApp.MvcApplication" Language="C#" %> |
|
| 444 | - |
|
| 445 | -//THE BELOW IS PASTED CODE |
|
| 446 | - |
|
| 447 | -<%@ Import Namespace="Izenda.AdHoc"%> |
|
| 448 | -<%@ Import Namespace="System.IO"%> |
|
| 449 | - |
|
| 450 | -<script runat="server"> |
|
| 451 | - void Application_AcquireRequestState(object sender, EventArgs e) { |
|
| 452 | - CustomAdHocConfig.InitializeReporting(); |
|
| 453 | - } |
|
| 454 | - |
|
| 455 | - [Serializable] |
|
| 456 | - public class CustomAdHocConfig : FileSystemAdHocConfig { |
|
| 457 | - public static void InitializeReporting() { |
|
| 458 | - if (HttpContext.Current.Session == null || HttpContext.Current.Session["ReportingInitialized"] != null) |
|
| 459 | - return; |
|
| 460 | - AdHocSettings.LicenseKey = "INSERT_LICENSE_KEY_HERE"; |
|
| 461 | - AdHocSettings.SqlServerConnectionString = @"INSERT_CONNECTION_STRING_HERE"; |
|
| 462 | - AdHocSettings.GenerateThumbnails = true; |
|
| 463 | - AdHocSettings.ShowSimpleModeViewer = true; |
|
| 464 | - AdHocSettings.IdentifiersRegex = "^.*[iI][Dd]$"; |
|
| 465 | - AdHocSettings.TabsCssUrl = "/Resources/css/tabs.css"; |
|
| 466 | - AdHocSettings.ReportCssUrl = "../Resources/css/Report.css"; |
|
| 467 | - AdHocSettings.ShowBetweenDateCalendar = true; |
|
| 468 | - AdHocSettings.DashboardViewer = "Dashboards"; |
|
| 469 | - AdHocSettings.ReportViewer = "ReportViewer"; |
|
| 470 | - AdHocSettings.InstantReport = "InstantReport"; |
|
| 471 | - AdHocSettings.ReportDesignerUrl = "ReportDesigner"; |
|
| 472 | - AdHocSettings.DashboardDesignerUrl = "DashboardDesigner"; |
|
| 473 | - AdHocSettings.ReportList = "ReportList"; |
|
| 474 | - AdHocSettings.SettingsPageUrl = "Settings"; |
|
| 475 | - AdHocSettings.ParentSettingsUrl = "Settings"; |
|
| 476 | - AdHocSettings.ResponseServer = "rs.aspx"; |
|
| 477 | - AdHocSettings.ReportsPath = Path.Combine(HttpContext.Current.Server.MapPath("~/"), "Reports"); |
|
| 478 | - AdHocSettings.PrintMode = PrintMode.Html2PdfAndHtml; |
|
| 479 | - AdHocSettings.ChartingEngine = ChartingEngine.HtmlChart; |
|
| 480 | - AdHocSettings.AdHocConfig = new CustomAdHocConfig(); |
|
| 481 | - HttpContext.Current.Session["ReportingInitialized"] = true; |
|
| 482 | - } |
|
| 483 | - } |
|
| 484 | -</script> |
|
| 485 | -``` |
|
| 486 | - |
|
| 487 | - |
|
| 488 | -###Step 9. Copy constraints classes from Global.asax.cs |
|
| 489 | - |
|
| 490 | - |
|
| 491 | -**a.** Copy below two constraints from Global.asax.cs of mvc5r3 |
|
| 492 | -```csharp |
|
| 493 | - |
|
| 494 | -//IRouteConstraint |
|
| 495 | -public class SpecificFileRouterConstraint : IRouteConstraint { |
|
| 496 | - private string extensionToBeRouted = null; |
|
| 497 | - private string fileToBeRouted = null; |
|
| 498 | - |
|
| 499 | - public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { |
|
| 500 | - return !String.IsNullOrEmpty(extensionToBeRouted) && !String.IsNullOrEmpty(fileToBeRouted) && values[extensionToBeRouted] != null && values[extensionToBeRouted].ToString().ToLower().Contains(fileToBeRouted); |
|
| 501 | - } |
|
| 502 | - |
|
| 503 | - public SpecificFileRouterConstraint() { } |
|
| 504 | - |
|
| 505 | - public SpecificFileRouterConstraint(string extension, string fileName) { |
|
| 506 | - extensionToBeRouted = extension.ToLower(); |
|
| 507 | - fileToBeRouted = fileName.ToLower(); |
|
| 508 | - } |
|
| 509 | - } |
|
| 510 | - |
|
| 511 | - |
|
| 512 | - |
|
| 513 | - |
|
| 514 | -//IRouteConstraint |
|
| 515 | -public class IzendaResourceConstraint : IRouteConstraint { |
|
| 516 | - private string extensionToBeRouted = null; |
|
| 517 | - |
|
| 518 | - public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { |
|
| 519 | - if (String.IsNullOrEmpty(extensionToBeRouted) || values[extensionToBeRouted] == null) { |
|
| 520 | - return false; |
|
| 521 | - } |
|
| 522 | - string requestUrl = values[extensionToBeRouted].ToString().ToLower(); |
|
| 523 | - bool result = false; |
|
| 524 | - if (extensionToBeRouted == "js") { |
|
| 525 | - result = result || requestUrl.Contains("reportviewerfilters.js"); |
|
| 526 | - result = result || requestUrl.Contains("reportlist.js"); |
|
| 527 | - result = result || requestUrl.Contains("data-sources.js"); |
|
| 528 | - result = result || requestUrl.Contains("data-sources-preview.js"); |
|
| 529 | - result = result || requestUrl.Contains("charts.js"); |
|
| 530 | - result = result || requestUrl.Contains("datasources-search.js"); |
|
| 531 | - result = result || requestUrl.Contains("jquery-1.6.1.min.js"); |
|
| 532 | - result = result || requestUrl.Contains("jquery-ui-1.8.13.custom.min.js"); |
|
| 533 | - result = result || requestUrl.Contains("elrte.full.js"); |
|
| 534 | - result = result || requestUrl.Contains("elrte.ru.js"); |
|
| 535 | - result = result || requestUrl.Contains("fieldproperties.js"); |
|
| 536 | - result = result || requestUrl.Contains("shrinkable-grid.js"); |
|
| 537 | - } |
|
| 538 | - if (extensionToBeRouted == "css") { |
|
| 539 | - result = result || requestUrl.Contains("tabs.css"); |
|
| 540 | - result = result || requestUrl.Contains("report.css"); |
|
| 541 | - result = result || requestUrl.Contains("filters.css"); |
|
| 542 | - result = result || requestUrl.Contains("base.css"); |
|
| 543 | - result = result || requestUrl.Contains("report-list-modal.css"); |
|
| 544 | - result = result || requestUrl.Contains("data-sources.css"); |
|
| 545 | - result = result || requestUrl.Contains("charts.css"); |
|
| 546 | - result = result || requestUrl.Contains("jquery-ui-1.8.13.custom.css"); |
|
| 547 | - result = result || requestUrl.Contains("elrte.min.css"); |
|
| 548 | - result = result || requestUrl.Contains("elrte-inner.css"); |
|
| 549 | - result = result || requestUrl.Contains("shrinkable-grid.css"); |
|
| 550 | - } |
|
| 551 | - if (extensionToBeRouted == "png") { |
|
| 552 | - result = result || requestUrl.Contains("elrtebg.png"); |
|
| 553 | - result = result || requestUrl.Contains("elrte-toolbar.png"); |
|
| 554 | - } |
|
| 555 | - if (extensionToBeRouted == "gif") { |
|
| 556 | - result = result || requestUrl.Contains("elrte/images/pixel.gif"); |
|
| 557 | - } |
|
| 558 | - return result; |
|
| 559 | - } |
|
| 560 | - |
|
| 561 | - public IzendaResourceConstraint() { } |
|
| 562 | - |
|
| 563 | - public IzendaResourceConstraint(string extension) { |
|
| 564 | - extensionToBeRouted = extension.ToLower(); |
|
| 565 | - } |
|
| 566 | - } |
|
| 567 | - |
|
| 568 | -``` |
|
| 569 | - |
|
| 570 | -**b.** Paste it above MVCapplication class in Global.asax.cs of project |
|
| 571 | - |
|
| 572 | -```csharp |
|
| 573 | - |
|
| 574 | -namespace Sample_MVCApp |
|
| 575 | -{ |
|
| 576 | - public class SpecificFileRouterConstraint : IRouteConstraint |
|
| 577 | - { |
|
| 578 | - private string extensionToBeRouted = null; |
|
| 579 | - private string fileToBeRouted = null; |
|
| 580 | - |
|
| 581 | - public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) |
|
| 582 | - { |
|
| 583 | - return !String.IsNullOrEmpty(extensionToBeRouted) && !String.IsNullOrEmpty(fileToBeRouted) && values[extensionToBeRouted] != null && values[extensionToBeRouted].ToString().ToLower().Contains(fileToBeRouted); |
|
| 584 | - } |
|
| 585 | - |
|
| 586 | - public SpecificFileRouterConstraint() { } |
|
| 587 | - |
|
| 588 | - public SpecificFileRouterConstraint(string extension, string fileName) |
|
| 589 | - { |
|
| 590 | - extensionToBeRouted = extension.ToLower(); |
|
| 591 | - fileToBeRouted = fileName.ToLower(); |
|
| 592 | - } |
|
| 593 | - } |
|
| 594 | - |
|
| 595 | - public class IzendaResourceConstraint : IRouteConstraint |
|
| 596 | - { |
|
| 597 | - private string extensionToBeRouted = null; |
|
| 598 | - |
|
| 599 | - public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) |
|
| 600 | - { |
|
| 601 | - if (String.IsNullOrEmpty(extensionToBeRouted) || values[extensionToBeRouted] == null) |
|
| 602 | - { |
|
| 603 | - return false; |
|
| 604 | - } |
|
| 605 | - string requestUrl = values[extensionToBeRouted].ToString().ToLower(); |
|
| 606 | - bool result = false; |
|
| 607 | - if (extensionToBeRouted == "js") |
|
| 608 | - { |
|
| 609 | - result = result || requestUrl.Contains("reportviewerfilters.js"); |
|
| 610 | - result = result || requestUrl.Contains("reportlist.js"); |
|
| 611 | - result = result || requestUrl.Contains("data-sources.js"); |
|
| 612 | - result = result || requestUrl.Contains("data-sources-preview.js"); |
|
| 613 | - result = result || requestUrl.Contains("charts.js"); |
|
| 614 | - result = result || requestUrl.Contains("datasources-search.js"); |
|
| 615 | - result = result || requestUrl.Contains("jquery-1.6.1.min.js"); |
|
| 616 | - result = result || requestUrl.Contains("jquery-ui-1.8.13.custom.min.js"); |
|
| 617 | - result = result || requestUrl.Contains("elrte.full.js"); |
|
| 618 | - result = result || requestUrl.Contains("elrte.ru.js"); |
|
| 619 | - result = result || requestUrl.Contains("fieldproperties.js"); |
|
| 620 | - result = result || requestUrl.Contains("shrinkable-grid.js"); |
|
| 621 | - } |
|
| 622 | - if (extensionToBeRouted == "css") |
|
| 623 | - { |
|
| 624 | - result = result || requestUrl.Contains("tabs.css"); |
|
| 625 | - result = result || requestUrl.Contains("report.css"); |
|
| 626 | - result = result || requestUrl.Contains("filters.css"); |
|
| 627 | - result = result || requestUrl.Contains("base.css"); |
|
| 628 | - result = result || requestUrl.Contains("report-list-modal.css"); |
|
| 629 | - result = result || requestUrl.Contains("data-sources.css"); |
|
| 630 | - result = result || requestUrl.Contains("charts.css"); |
|
| 631 | - result = result || requestUrl.Contains("jquery-ui-1.8.13.custom.css"); |
|
| 632 | - result = result || requestUrl.Contains("elrte.min.css"); |
|
| 633 | - result = result || requestUrl.Contains("elrte-inner.css"); |
|
| 634 | - result = result || requestUrl.Contains("shrinkable-grid.css"); |
|
| 635 | - } |
|
| 636 | - if (extensionToBeRouted == "png") |
|
| 637 | - { |
|
| 638 | - result = result || requestUrl.Contains("elrtebg.png"); |
|
| 639 | - result = result || requestUrl.Contains("elrte-toolbar.png"); |
|
| 640 | - } |
|
| 641 | - if (extensionToBeRouted == "gif") |
|
| 642 | - { |
|
| 643 | - result = result || requestUrl.Contains("elrte/images/pixel.gif"); |
|
| 644 | - } |
|
| 645 | - return result; |
|
| 646 | - } |
|
| 647 | - |
|
| 648 | - public IzendaResourceConstraint() { } |
|
| 649 | - |
|
| 650 | - public IzendaResourceConstraint(string extension) |
|
| 651 | - { |
|
| 652 | - extensionToBeRouted = extension.ToLower(); |
|
| 653 | - } |
|
| 654 | - } |
|
| 655 | - |
|
| 656 | - |
|
| 657 | - |
|
| 658 | - // Note: For instructions on enabling IIS6 or IIS7 classic mode, |
|
| 659 | - // visit http://go.microsoft.com/?LinkId=9394801 |
|
| 660 | - |
|
| 661 | - public class MvcApplication : System.Web.HttpApplication |
|
| 662 | - { |
|
| 663 | - protected void Application_Start() |
|
| 664 | - { |
|
| 665 | - AreaRegistration.RegisterAllAreas(); |
|
| 666 | - |
|
| 667 | - WebApiConfig.Register(GlobalConfiguration.Configuration); |
|
| 668 | - FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); |
|
| 669 | - RouteConfig.RegisterRoutes(RouteTable.Routes); |
|
| 670 | - BundleConfig.RegisterBundles(BundleTable.Bundles); |
|
| 671 | - AuthConfig.RegisterAuth(); |
|
| 672 | - } |
|
| 673 | - } |
|
| 674 | -} |
|
| 675 | - |
|
| 676 | - |
|
| 677 | -``` |
|
| 678 | - |
|
| 679 | - |
|
| 680 | -###Step 10. Copy over RegisterRoutes in MvcApplication |
|
| 681 | - |
|
| 682 | -**a.** Copy the below class from Global.asax.cs of mvc5r3 |
|
| 683 | - |
|
| 684 | -```csharp |
|
| 685 | -public static void RegisterRoutes(RouteCollection routes) { |
|
| 686 | - routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); |
|
| 687 | - routes.MapRoute("IzendaResources", "Reporting/Resources/{*resource}", new { controller = "IzendaStaticResources", action = "Index" }); |
|
| 688 | - routes.MapRoute("IzendaJsResources", "{*js}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("js") }); |
|
| 689 | - routes.MapRoute("IzendaCssResources", "{*css}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("css") }); |
|
| 690 | - routes.MapRoute("IzendaPngResources", "{*png}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("png") }); |
|
| 691 | - routes.MapRoute("IzendaGifResources", "{*gif}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("gif") }); |
|
| 692 | - routes.MapRoute("IzendaReporting", "{controller}/{action}/{id}", new { controller = "Reporting", id = UrlParameter.Optional }); |
|
| 693 | - routes.MapRoute("StarterKitDefault", "{controller}/{action}/{id}", new { controller = "Reporting", action = "ReportList", id = UrlParameter.Optional }); |
|
| 694 | - routes.MapRoute("HomeDefault", "{*pathInfo}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); |
|
| 695 | - } |
|
| 696 | -``` |
|
| 697 | - |
|
| 698 | -**b.** Paste it inside MvcApplication class of tproject’s Global.asax.cs |
|
| 699 | - |
|
| 700 | -```csharp |
|
| 701 | -public class MvcApplication : System.Web.HttpApplication |
|
| 702 | - { |
|
| 703 | - |
|
| 704 | - public static void RegisterRoutes(RouteCollection routes) |
|
| 705 | - { |
|
| 706 | - routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); |
|
| 707 | - routes.MapRoute("IzendaResources", "Reporting/Resources/{*resource}", new { controller = "IzendaStaticResources", action = "Index" }); |
|
| 708 | - routes.MapRoute("IzendaJsResources", "{*js}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("js") }); |
|
| 709 | - routes.MapRoute("IzendaCssResources", "{*css}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("css") }); |
|
| 710 | - routes.MapRoute("IzendaPngResources", "{*png}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("png") }); |
|
| 711 | - routes.MapRoute("IzendaGifResources", "{*gif}", new { controller = "IzendaStaticResources", action = "Index" }, new { irc = new IzendaResourceConstraint("gif") }); |
|
| 712 | - routes.MapRoute("IzendaReporting", "{controller}/{action}/{id}", new { controller = "Reporting", id = UrlParameter.Optional }); |
|
| 713 | - routes.MapRoute("StarterKitDefault", "{controller}/{action}/{id}", new { controller = "Reporting", action = "ReportList", id = UrlParameter.Optional }); |
|
| 714 | - routes.MapRoute("HomeDefault", "{*pathInfo}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); |
|
| 715 | - } |
|
| 716 | - |
|
| 717 | - protected void Application_Start() |
|
| 718 | - { |
|
| 719 | - AreaRegistration.RegisterAllAreas(); |
|
| 720 | - |
|
| 721 | - WebApiConfig.Register(GlobalConfiguration.Configuration); |
|
| 722 | - FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); |
|
| 723 | - RouteConfig.RegisterRoutes(RouteTable.Routes); |
|
| 724 | - BundleConfig.RegisterBundles(BundleTable.Bundles); |
|
| 725 | - AuthConfig.RegisterAuth(); |
|
| 726 | - } |
|
| 727 | - } |
|
| 728 | - |
|
| 729 | -``` |
|
| 730 | - |
|
| 731 | - |
|
| 732 | -###Step 11. Change the LicenseKey and ConnnectionString in Global.asax of project |
|
| 733 | - |
|
| 734 | - To get a new trial key, you may contact [sales@izenda.com](mailto:sales@izenda.com). |
|
| 735 | - |
|
| 736 | -```csharp |
|
| 737 | - |
|
| 738 | -AdHocSettings.LicenseKey = "INSERT_LICENSE_KEY_HERE"; |
|
| 739 | -AdHocSettings.SqlServerConnectionString = @"INSERT_CONNECTION_STRING_HERE"; |
|
| 740 | - |
|
| 741 | -``` |
|
| 742 | - |
|
| 743 | -###Step 12. Run it! |
|
| 744 | - |
|
| 745 | -After Step#11, the Sample_MVCApp should build and work without a problem. To see if Izenda is integrated with this web application, |
|
| 746 | - |
|
| 747 | -**a.** Open _Layout.cshtml in Views\Shared\ in Solution Explorer |
|
| 748 | - |
|
| 749 | -**b.** Add an ActionLink which leads to Izenda as below |
|
| 750 | - |
|
| 751 | -```html |
|
| 752 | -<li>@Html.ActionLink("Home", "Index", "Home")</li> |
|
| 753 | -<li>@Html.ActionLink("About", "About", "Home")</li> |
|
| 754 | -<li>@Html.ActionLink("Contact", "Contact", "Home")</li> |
|
| 755 | -<li>@Html.ActionLink("Izenda", "ReportList", "Reporting")</li> //Add this line |
|
| 756 | -``` |
|
| 757 | - |
|
| 758 | -**c.** Notice 'Izenda' item added to the menu as below. Click it and see if it leads to Izenda ReportList page. |
|
| 759 | - |
|
| 760 | - |
|
| 761 | - |
|
| 762 | - |
|
| 763 | -###Step 13. Change the Logo |
|
| 764 | - |
|
| 765 | -**a.** Open _SiteLayout.cshtml in Views\Shared\ in Solution Explorer |
|
| 766 | - |
|
| 767 | -**b.** Find below two lines in the body of the html and edit the source image directory, alt, and the link address for top-right image |
|
| 768 | - |
|
| 769 | -```html |
|
| 770 | -<img src="~/Resources/FromDLL/Resources/ModernImages/bi-logo.png" alt="Business intelligence" /> //top-left image |
|
| 771 | - |
|
| 772 | -<a href="http://izenda.com" style="position: relative; top: 4px;"><img class="right-logo" src="~/Resources/FromDLL/Resources/ModernImages/IzendaNewLogoBlue.png" alt="Izenda Reports" /></a> //top-right image |
|
| 773 | - |
|
| 774 | -``` |
|
| 775 | -**c.** Run the application and check if the images appear as edited. |
|
| 776 | - |
|
| 777 | - |
|
| 778 | -In this guide, two images, Logo.png and SeaEagle.png, were put in the project folder, /Sample_MVCApp, and the above two lines were edited as below |
|
| 779 | - |
|
| 780 | -```html |
|
| 781 | -<img src="~/Logo.png" alt="Angry Sea Eagle" /> //top-left image |
|
| 782 | - |
|
| 783 | -<a href="http://SeaEagle.com" style="position: relative; top: 4px;"><img class="right-logo" src="~/SeaEagle.png" alt="SeaEagle.Com" /></a> //top-right image |
|
| 784 | -``` |
|
| 785 | - |
|
| 786 | - |
|
| 787 | - |
|
| 788 | -Two top logos have changed as below |
|
| 789 | - |
|
| 790 | - |
|
| 433 | +###Step 7. Change MasterPageFile="~/Default.master" to MasterPageFile="~/Site.master" |
|
| 791 | 434 | |
| 792 | -[Izenda MVC Kit Integration Guide Phase II](http://wiki.izenda.us/Guides/MVC-Integration/Phase-II-Draft) |
|
| 435 | +Change MasterPageFile="~/Default.master" to MasterPageFile="~/Site.master" in all Izenda .aspx pages. This can be done easily using Visual Studio's 'Find and Replace' tool. |
|
| 793 | 436 | |
| 437 | + |
|
| 794 | 438 | |
| 795 | - |
|
| ... | ... | \ No newline at end of file |