close

SharePoint 2013

SharePoint 2016

Web Application Proxy + SharePoint 2016

beitragsbild-time-for-success-1800×1200
Wozu brauche ich das?

Immer wieder erhalten wir Anfragen von Kunden, wie man am einfachsten eine SharePoint Farm auch außerhalb des Firmennetzwerks verfügbar machen kann.  Früher waren dafür zum Beispiel Microsoft Threat Managment Gateway (TMG) oder Unified Access Gateway (UAG) Server als Reverse Proxy im Einsatz. Diese beiden Technologien werden aber in dieser Form nicht mehr weiterentwickelt oder supportet.

Die WebApplication Proxy (WAP) Rolle von Windows Server 2016 kann hier eine mögliche Antwort sein.

mehr lesen
AllgemeinAutomation, Workflow, Self ServiceCloudCollaboration, ProduktivitätHow-To, Tutorial, SzenarioHybridOffice 365On-PremisesSharePoint 2013SharePoint 2016SharePoint OnlineTool, Bot, App, Add-In

Der moderne Arbeitsplatz: Mein intelligentes Dokument weiß was ich will!

Beitragsbild-Anleitung-Erste-Schritte-Ziel-Weg-Erfolg

Ein erfolgreiches Telefongespräch zwischen Ihnen und Ihrem Kunden geht zu Ende. Bevor die nächsten Meetings eine Stunde später starten, soll das besprochene Angebot noch schnell versendet werden.

ABER: Nach Kopieren der Produkt- und Kundeninformationen geht sich das individuelle Anpassen nicht mehr aus und so schaffen Sie es erst am Abend das Angebot zu versenden. In Summe hat Sie diese Arbeit mehr als eine Stunde (und viele Nerven) gekostet! Ihr Kunde hat den ganzen Tag gewartet. Hat denn der moderne Arbeitsplatz für diese repetitive und zeitintensive Tätigkeit nicht schon eine Lösung zu bieten?

Die gute Nachricht: JA! Denn das Generieren individueller und komplexer Dokumente geht nun automatisiert und Sie haben mehr Zeit für die wirklich wichtigen Dinge – mit dox42!

mehr lesen
Teams, Groups

Microsoft Teams – Das All-In-One Frontend

beitragsbild-teamwork-herausforderung-loesung

Bei unserem Event “10 Jahre HATAHET” am 18.05.2017 musste ich leider einige Punkte, was Teams anbelangt, auslassen. Dieses möchte ich nun nachholen.

Bevor wir die Weiterführenden Funktionen und Einstellungsmöglichkeiten besprechen möchte ich noch eine kurze Zusammenfassung unseres Vortrags zum Thema „Chat basierende Zusammenarbeit mit Teams und BOTS“ geben.

mehr lesen
AllgemeinCollaboration, ProduktivitätSharePoint 2013Success Story, Kundenreferenz

Kundenreferenz: Digitalisierung zweier Prozesse unterstützt ISS-Mitarbeiter bei der Konzentration auf deren Kernaufgaben

ISS-Mitarbeiter

Mit über 500.000 Mitarbeitern global ist ISS der viertgrößte private Arbeitgeber der Welt. Das Unternehmen ist als Gesamtanbieter positioniert und  stellt seinen Kunden demnach eine Vielzahl an Facility Services zur Verfügung, die von der Gebäudetechnik und Außenanlagenbetreuung bis hin zu Cleaning Services und Security Services reichen. „Um unsere Serviceleistungen ständig verbessern zu können, sind wir bei den Trends immer vorne mit dabei“, sagt Christoph Feytl, Development Manager bei ISS Austria Holding, und nennt Internet of Things und Sensorik als wesentliche Zukunftstechnologien im Bereich Facility Management.

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013SharePoint 2016

SharePoint Basics: Publishing Pages

Beitragsbild-Übern-den-Wolken-fliegen-Freiheit

Site Pages in SharePoint programmatisch zu verändern wäre einfach und böte viele Möglichkeiten, wären da nicht die Publishing Pages. Sie verhindern oft konsistente Änderungen über alle Pages, da sie im Hintergrund anders verwaltet werden.

Besonders bei dynamischen Änderungen (zB über ein Http-Module) ist Vorsicht geboten. Beim Aufruf einer normalen Page sind viele Möglichkeiten offen, die bei Publishing Pages ausgeschlossen wurden. Die Unterschiede resultieren daraus, dass bei Publishing Pages im Hintergrund „TemplateRedirectionPages“ verwendet werden, die die Erstellung der eigentlichen Page kapseln.

mehr lesen
Development, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013SharePoint 2016

SharePoint Basics: Erhöhte Rechte

beitragsbild-loesung-anleitung-punktgenau-beschreibung-zielorientiert

Rechte sind im SharePoint einer der wichtigsten Bereiche. Deshalb folgt hier ein How-To, wie die erhöhte Rechte im SharePoint für Zugriffe richtig verwendet werden. Die Standardmethode, um Funktionen oder Codeabschnitte mit erhöhten Rechten auszuführen, ist die Funktion „SPSecurity.RunWithElevatedPrivileges“. Sie änderte die Rechte des aktuellen Users zum Application Pool Account.

Es wird bei dieser Funktion auch kein wirklich neuer Thread im Hintergrund angelegt, sondern nur eine Personifikation mit der Identity des Application Pool Accounts durchgeführt. Diese wird beim Verlassen zurückgesetzt.

01. SPSecurity.RunWithElevatedPrivileges(delegate()
02.{
03.   using (SPSite site = new SPSite(siteID))
04.   {

mehr lesen
CloudCollaboration, ProduktivitätHybridMobilityOffice 365On-PremisesSharePoint 2013SharePoint 2016SharePoint OnlineTool, Bot, App, Add-InYammer

HATAHET evaluiert: Microsoft Flow

Developer Working From Home Office.

Es gibt etwas Neues! Also eigentlich ist es schon einige Zeit verfügbar. Aber es musste schon einige Zeit vergehen, bis eine nähere Betrachtung von Microsoft Flow auch wirklich Sinn macht.

Was ist Microsoft Flow?
Dieses Tool/Service gehört zum Genre der sogenannten „Internet Middleware“. Ein Beispiel: Nach dem Empfang einer E-Mail auf meine Office 365 E-Mail-Adresse soll das Attachment automatisch in meiner Dropbox gespeichert werden.
In diesem Satz sind zwei Services von zwei unterschiedlichen Firmen erwähnt, die jetzt plötzlich zusammenarbeiten sollen. Mit Tools wie Zapier oder IFTTT war das bisher schon möglich (Yahoo Pipes ist auch noch in guter Erinnerung). Allerdings ist die Integration von Tools und Services aus dem Hause Microsoft nicht so detailiert möglich, wie das jetzt Microsoft Flow anbietet.

Wo kann ich mir selbst ein Bild machen?
Es gibt zwei Komponenten von Microsoft Flow:

  • Microsoft Flow Webseite – Im Web ist die zentrale Administrationsoberfläche von Microsoft Flow. Hier können Flows erstellt und bearbeitet, alle administative Tätigkeiten durchgeführt und Vorlagen verwendet werden.
  • Microsoft Flow App für Android & iOS – Die Mobile App von Microsoft Flow ist die Verbindung aufs Telefon.

Zum Beispiel muss die App am Telefon installiert sein, um den hier dargestellten Flow ausführen zu können:

Abgebildet ist die Webseite von Microsoft Flow. Sichtbar ist ein von mir erstellter Flow, der mir eine Push Notification am Telefon anzeigt, wenn ich eine Mail von Nahed bekommen habe. Diese Push Notification erfordert allerdings, dass ich auch die Microsoft Flow App am Telefon installiert habe.

Grundsätzlich ist es auch möglich, mit der App am Telefon Flows zu erstellen und zu bearbeiten:

Allerdings ist das eher umständlich. Während der Bearbeitung hatte ich den Eindruck, dass der Flow Editor am Telefon nur ein Web View auf den Editor der Webseite ist. Somit würde ich das mobile Bearbeiten nur als Ausweichmöglichkeit empfehlen und eher zum Desktop greifen.

Warum ist das für mich interessant?
Gemeinsam mit meinem Kollegen Benjamin habe ich letztes Jahr in einem Vortrag am HATAHET Next Destination Event schon darüber berichtet. Die Entwicklung von Microsoft Flow dürfte unter anderem deswegen vorangetrieben worden sein, weil es für SharePoint Online in Zukunft nicht mehr so einfach sein wird, ohne Drittanbieter komplexere Workflows zu realisieren. Hier füllt Microsoft Flow einerseits eine Lücke die erst entstehen wird, andererseits rückt das Thema Workflows etwas näher zum Power User und ist dort in eine Strategie eingebettet. Flow ist neben PowerApps und PowerBI eine Säule dieser Strategie um Power Usern zu ermöglichen, ihre Arbeitsprozesse effizienter und angenehmer zu gestalten.

Was hat das mit SharePoint zu tun?
Der Zusammenhang mit SharePoint besteht in der stärkeren Integration mit allen Office 365 Services inklusive SharePoint Online. Alle Ereignisse die im Office 365 Universum ausgelöst werden (empfangene E-Mails, raufgeladene Dateien, etc.), können mit Microsoft Flow behandelt und als Trigger verwendet werden.
Und: Nicht nur die Cloud profitiert, mit dem Data Gateway kann auch eine Verbindung on-premises Daten hergestellt werden.
Mehr Details und Links gibt es hier.

Ich will mehr!

  • Weiter Details zum Thema Flow sind zum Beispiel die sogenannten Environments (auf Deutsch: Umgebungen). In einem Environment (zu erstellen vom Admin im Flow Admin Center) können innerhalb eines Office 365 Tenants getrennte Umgebungen für zum Beispiel geographisch Getrennte Umgebungen erstellt werden. Mehr zu Enviromnents gibt es hier.
  • Wie ähnliche Services in diesem Genre ist auch Microsoft Flow nicht immer kostenlos. Informationen zu Preisen gibt es hier.
  • Die Schwester von Flow ist PowerApps – auch einen Blick wert! Hier geht es zu PowerApps. Randnotiz für die ganz Fortgeschrittenen: Es gibt etwa auch die Möglichkeit, einen Flow aus einer PowerApp zu starten.

Zum Schluss
Behalten Sie den Microsoft Flow Blog im Blick – hier werden immer wieder neu unterstützte Services und zu automatisierende Vorgänge beschrieben. Trotz der General Availability würde ich empfehlen, Microsoft Flow zuerst in einem Pilot-Projekt zu evaluieren, bevor ein großer Einsatz geplant wird. Sowohl die Webseite als auch die Mobile Apps werden weiterhin ständig aktualisiert und bieten eventuell mit dem nächsten Update die für Sie relevante Funktionalität.

 

Wie immer stehen wir für Beratung zu diesen und allen anderen Themen rund um SharePoint jederzeit zur Verfügung.
Reden wir miteinander 😉

mehr lesen
AllgemeinCollaboration, ProduktivitätHybridOn-PremisesSharePoint 2013Success Story, Kundenreferenz

Kundenreferenz: Wienerberger iComm – Umfassender Intranet-Relaunch definiert Kommunikationskultur der gesamten Wienerberger Gruppe neu

beitragsbild-loesung-anleitung-punktgenau-beschreibung-zielorientiert

Um das Unternehmen nachhaltig weiterzuentwickeln, hat Wienerberger u.a. das Ziel formuliert, die interne Kommunikation und Zusammenarbeit auf neue Beine zu stellen. Als zentrales Medium der vom Vorstand formulierten Vision sollte das Intranet namens iComm dienen, das diesen Zweck in der Vergangenheit nur eingeschränkt erfüllen konnte. So wurde der Produktivitäts-Experte HATAHET productivity solutions GmbH beauftragt, iComm einem grundlegenden Relaunch zu unterziehen. Die auf Microsoft SharePoint basierende Plattform bietet heute neben klassischen Informationselementen, die je nach Anforderung lokalisiert werden können, auch dynamische Social Media-Komponente wie Communities, die mit einem hohen Self Service-Anteil und ebensolcher Usability punkten.

Lesen Sie hier die gesamte Wienerberger Success-Story: Download als PDF

 

Unternehmensgröße

  • rund 16.000 Mitarbeiter (Stand 2015)
  • 203 Produktionsstandorte in 30 Ländern

mehr lesen
AllgemeinDevelopment, CodingSharePoint 2013SharePoint 2016SharePoint Online

#ESPC16 Tag 2, Bericht 3-3, Meine Zusammenfassung

Beitragsbild Web Page Source Codes Macro

#ESPC16 Tag 1, Bericht 1, Meine ZusammenfassungAls Web-Developer der noch nicht allzu lange mit SharePoint zu tun hat, habe ich mir erhofft auf der ESPC2016 einen Einblick in die Best Practices und Erfahrungen der alteingesessenen SharePoint Frontend-Entwickler zu erhalten. In SharePoint gibt es verschiedene Vorgehensweisen um die Benutzeroberfläche mittels Javascript und CSS zu erweitern. Sei es über die Masterpage, Custom Actions, innerhalb eines Page Layouts oder über einen Skript-Editor Webpart. Durch das Einbinden von Skripts an verschiedenen Stellen kann es schnell etwas unübersichtlich werden und eine strikte Trennung von Logik, Design und Layout ist nicht immer möglich.
Genau aus diesem Grund wird der Fokus in Zukunft auf TypeScript, dem neuen SharePoint Framework (SPFx) und dem Frontend Framework Microsoft UI Fabric liegen. Die meißten Vorträge im Bereich Entwicklung drehten sich daher um diese neuen, sehr vielversprechenden Technologien.

Session 1: Developing Modular SharePoint Solutions using TypeScript
Da sich JavaScript nach und nach als die Standardmethode zum Anpassen der SharePoint Oberfläche durchsetzt, folgt als logischer nächster Schritt der Umstieg auf das von Microsoft entwickelte TypeScript. Es bietet Klassen, Module, Interfaces und weitere Features und liefert somit Entwicklern die nicht aus dem JavaScript Bereich kommen eine vertrautere Umgebung. Nach einer etwas längeren Einführung in diese relativ neue Programmiersprache zeigt Arto Kaitosaari wie TypeScript Module erstellt, kompiliert und letztendlich innerhalb von SharePoint verwendet werden können. Ein sehr interessanter Vortrag der dem Publikum vermitteln soll, wie die Zukunft der SharePoint Frontend-Entwicklung aussieht.

Session 2: Office 365 Microsoft Graph API Deep Dive
Die Microsoft Graph API ist eine Zusammenführung aller APIs, die Zugriff auf die Office 365 Plattform bieten. Sie ist sozusagen ein universeller Endpunkt mit dem es möglich ist, auf alle Office 365 Services zuzugreifen, ohne sich dabei mit mehreren Authentifizierungen herumplagen zu müssen. Sie vereint alles unter einem Dach. Donald Hessing erklärt zuerst den Authentifizierungsvorgang und zeigt danach an Hand einiger Beispiele wie der Zugriff auf die wichtigsten Endpunkte funktioniert. Trotz einiger Pannen bei der Demo ein sehr spannendes Tool mit viel Potential.

Session 3: Extending the SharePoint Search Experience with SharePoint Add-ins
Result Sources, Result Types, Display Templates, Managed Properties, Search Queries. Alles Dinge mit denen man sich bestens auskennen sollte, wenn es darum geht die SharePoint Suche optimal zu nutzen. Robrecht Van Caenegem erläutert die oft nicht ganz verständlichen Zusammenhänge zwischen diesen Komponenten. Weiters erläutert er wie mit Hilfe von SharePoint Add-Ins eine noch umfangreichere Sucherfahrung entwickelt werden kann.

Session 4: Explore the SharePoint Framework
Mike Ammerlaan spricht über das neue SharePoint Framework, kurz SPFx, welches sich aktuell in Entwicklung befindet und eine kleine Revolution im Bereich SharePoint Frontend-Development verspricht. Neben großen Veränderungen an der Oberfläche von SharePoint selbst wird sich auch die Art und Weise verändern, wie SharePoint Add-Ins in Zukunft entwickelt werden. Nämlich mit Hilfe von TypeScript und dem Frontend Framework Office UI Fabric.

Session 5: Beyond Bootstrap: Building a Ridiculously Lightweight Cross-platform Responsive Framework
Eine gute Einführung in die Welt des Responsive Web Design. Mit einigen Verweisen auf den SharePoint Blog von Stefan Bauer, der übrigens ebenfalls anwesend war, erklärt Bill Ayers was es beim Entwickeln von Responsive Websites zu beachten gibt und was die wesentlichen Eigenschaften eines solchen sind. Neben bewährten Frameworks wie Bootstrap bringt er den Zuhörern auch eine etwas unkonventionelle Lösung näher: Das Entwickeln eines eigenen, minimalistischen Frameworks dass sich auf die wichtigsten Dinge beschränkt und weitere Features wie Typografie, Farbgebung und zusätzliche Komponenten, welche es beispielsweise bei Bootstrap in Hülle und Fülle gibt, außen vor lässt. Gar keine so schlechte Idee, da SharePoint viele dieser Features bereits beinhaltet.

mehr lesen
AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridOffice 365On-PremisesSharePoint 2013SharePoint 2016SharePoint Online

Javascript und CSS einbinden mit User Custom Actions

beitragsbild-source-code-scripting-coding-terminal

 

User Custom Actions können einem spezifischem Web, einer Site, oder einer Liste (für unsere Zwecke eher uninteressant) zugewiesen werden. Sie bieten einem die Möglichkeit mittels ScriptLink Javascript einzubinden, ohne die Masterpage anrühren zu müssen. Generell stehen einem hierfür zwei Lösungsansätze zur Verfügung: Das Client Side Object Model (CSOM), oder die Sharepoint REST-API. Wir werden im Laufe dieses Artikels einige Anwendungsbeispiele mit REST anführen.

Jede User Custom Action besitzt die Eigenschaft „Location“, welche immer angegeben werden muss. Sie legt fest wo und wie die User Custom Action eingebunden wird. Um Beispielsweise eine Javascript Datei einzubinden muss der Wert „ScriptLink“ angegeben werden.

Folgende Parameter sind beim Einbinden von Scripts von Bedeutung:

  • Location: „ScriptLink“ gibt an dass es sich um ein Script handelt, dass eingebunden werden soll
  • Sequence: eine ganze Zahl, legt fest in welcher Reihenfolge Scripts eingebunden werden sollen
  • ScriptSrc: Der Pfad zur Datei, gleichzusetzten mit dem „src“-Attribute eines „script“-Tags in HTML
  • ScriptBlock: Optional, hier könnte direkt Javascript Code angegeben werden. Nicht empfehlenswert, da die Reihenfolge (Sequence) dann nicht eingehalten werden kann, jedoch notwendig um Stylesheets einzubinden.
  • Title & Description: Titel und Beschreibung der User Custom Action
  • ID: Optional, hier kann eine eigene ID angegeben werden. Falls nicht vorhanden wird von Sharepoint eine ID generiert


Wichtig: ScriptSrc darf in Sharepoint 2010 und 2013 keine absoluten Pfade beinhalten. Dies ist unbedingt zu vermeiden da Sharepoint sonst gar keine Seiten mehr anzeigt. In Sharepoint Online und Sharepoint 2016 lassen sich auch absolute Pfade problemlos einbinden.

Im folgenden Beispiel wird demonstriert, wie jQuery in eine Site eingebunden werden kann und somit auf allen Pages und Subsites dieser Site verfügbar ist.

$.post({
	url: "/pfad/zur/site/_api/site/usercustomactions",
	data: JSON.stringify({
		"__metadata": { "type": "SP.UserCustomAction" },
		"Location":"ScriptLink",
		"Sequence":"0",
		"Title":"jQuery 3.0.0",
		"Description":"User Custom Action zum Einbinden von jQuery",
		"ScriptSrc" : "~sitecollection/siteassets/css/jquery-3.0.0.min.js"
	}),
	headers: { 
		"X-RequestDigest": $("#__REQUESTDIGEST").val(),
		"content-type": "application/json;odata=verbose",
	},
	success: successHandler,
	error: errorHandler
});

Der angeführte REST-Call liefert einem nach erfolgreichem Erstellen der User Custom Action die eben erstellte UCA als Objekt oder in Form von XML zurück. Sie besitzt eine eindeutige ID (selber angegeben oder von Sharepoint generiert), mit deren Hilfe sie nachträglich wieder bearbeitet oder gelöscht werden kann.

Das folgende Beispiel zeigt wie man Änderungen an einer UCA vornimmt. Wir werden die Eigenschaft „ScriptSrc“ der eben erstellen UCA ändern, um eine aktuellere Version von jQuery zu laden.

$.post({
	url: "/pfad/zur/site/_api/site/usercustomactions('<GUID>')",
	data: JSON.stringify({
		"__metadata": { "type": "SP.UserCustomAction" },
		"ScriptSrc":"~sitecollection/siteassets/css/jquery-3.1.0.min.js"
	}),
	headers: { 
		"X-RequestDigest": $("#__REQUESTDIGEST").val(),
		"content-type": "application/json;odata=verbose",
		"X-HTTP-Method": "MERGE"
	},
	success: successHandler,
	error: errorHandler
});

Das folgende Beispiel zeigt wie die User Custom Action wieder gelöscht werden kann.

$.post({
	url: "/pfad/zur/site/_api/site/usercustomactions('<GUID>')",
	headers: { 
		"X-RequestDigest": $("#__REQUESTDIGEST").val(),
		"X-HTTP-Method": "DELETE"
	},
	success: successHandler,
	error: errorHandler
});

Da es auch Sinn macht Stylesheets einzubinden, ohne die Masterpage bearbeiten zu müssen, werden wir uns nun diesem Problem widmen. In Sharepoint hat man standardmäßig die Möglichkeit eine einzelne CSS Datei einzubinden (Websiteeinstellungen > Gestaltungsvorlage > Alternative URL für CSS-Datei). Dieses Feature hat jedoch einige Nachteile.

  • Es kann nur eine einzige Datei eingebunden werden
  • Erstellt man nachträglich eine Unterseite, muss die Einstellung erneut gespeichert werden damit diese auch für die neue Unterseite gilt.

Die Nutzung von User Custom Actions zum Einbinden von CSS Dateien ist wesentlich flexibler.

User Custom Actions bieten generell keine Möglichkeit, Stylesheets einzubinden. Es kann jedoch die „ScriptBlock“ Eigenschaft genutzt werden um eine Datei mit Javascript einzubinden.

Javascript zum einbinden einer CSS Datei:

(function(){
	var head = document.getElementsByTagName('head')[0];
	var link = document.createElement('link');
	link.type = 'text/css';
	link.rel = 'stylesheet';
	link.href = '~site/pfad/zu/einer/datei.css';
	head.appendChild(link);
})();

Alternatives Javascript zum einbinden einer CSS Datei (ab Sharepoint 2013):

(function(){ registerCssLink('~site/pfad/zu/einer/datei.css') })();

Einbinden eines Stylesheets mittels User Custom Action, diesmal nur für ein spezifisches Web (z.B. eine Unterseite):

var url = "~site/pfad/zu/einer/datei.css";

var block = [
	"(function(){",
	"var head = document.getElementsByTagName('head')[0];",
	"var link = document.createElement('link');",
	"link.type = 'text/css';",
	"link.rel = 'stylesheet';",
	"link.href = '" + url + "';",
	"head.appendChild(link);",
	"})();"
].join("");

$.post({
	url: "/pfad/zur/site/subsite/_api/web/usercustomactions",
	data: JSON.stringify({
		"__metadata": { "type": "SP.UserCustomAction" },
		"Location":"ScriptLink",
		"Sequence":"100",
		"Title":"",
		"Description":"",
		"ScriptBlock" : block
	}),
	headers: { 
		"X-RequestDigest": $("#__REQUESTDIGEST").val(),
		"content-type": "application/json;odata=verbose",
	},
	success: successHandler,
	error: errorHandler
});

 

Um Änderungen am Layout von Sharepoint vorzunehmen, oder zusätzliche Funktionen zu implementieren, müssen in der Regel diverse Javascripts und Stylesheets eingebunden werden. Dies kann entweder über Skript-Editor Webparts oder über die Masterpage erfolgen. Beide Varianten sind jedoch mit einer Reihe von Nachteilen und Einschränkungen behaftet. Skript-Editor Webparts sind auf eine Seite begrenzt. Die Masterpage wiederum ist umständlich zu bearbeiten und es besteht die Gefahr dass Anpassungen bei Sharepoint-Updates wieder verloren gehen. Daher haben wir uns nach einer besseren Lösung umgesehen: User Custom Actions

Published: 25.07.2016 14:09

Source: New feed

mehr lesen
1 2 3 10
Page 1 of 10