Wednesday, 5 January 2022

Supercharge your virtual Teams meetings with SharePoint Syntex, whiteboards, polls, presenter modes and more

As we all settle into the next few years of hybrid work, it's somewhat sobering to reflect that Microsoft have clocked up to 2.7 billion minutes of Teams calls in a single day at times. We're irrefutably spending much more of our time in Teams calls and meetings - from all those short "stop by the desk" chats that are now scheduled meetings (reflected by a 22% increase in meetings of 30 mins or less in Microsoft's research), to more organised team and company "all-hands" meetings which have shifted from either fully or partly physical to fully virtual in many cases. The challenge now is how to make the best of meetings - how to elevate beyond the humdrum, ineffective, energy sapping meetings that I suspect are common in many businesses. This post has some tips which my Content+Cloud colleagues and fellow MVPs Steve Goodman and Jason Wynn spoke about at the recent South Coast Summit event here in the UK - our session extended to Teams Voice, Teams rooms, devices and kit, broadcast considerations and many more topics, but here I'll focus on a few things in particular:

  • Whiteboards
  • Polls
  • Presenter modes
  • Using SharePoint Syntex to quickly understand documents during a call

Using Microsoft Whiteboard in a Teams meeting

Being able to lead a remote whiteboard session is becoming a critical skill in a world where everyone isn't in the room. The key, in many cases, is to prepare the whiteboard in advance - and Teams has special support for this. Once you have the meeting in the calendar (even if you haven't invited others yet), click into the meeting within Teams and then go into the Whiteboard tab. Seeding the whiteboard with thoughts rather than starting from a blank canvas during the meeting can have a big effect and takes the pressure off in the meeting itself. With a few minutes of prep you might come out with something like this:

 
This is now in a better state for effective brainstorming during the meeting. Since this is a collaborative whiteboard, participants in the meeting can simultaneously edit, whether that's adding a sticky note on the left for the challenges or a list item on the right for ideas. Microsoft don't state a maximum number of participants in the documentation, and I've certainly heard of folks using with 25 people at once with no issues. Microsoft Whiteboard has recently undergone a significant revamp providing templates and other capabilities like those of Miro and Lucid, and further changes are imminent - in the near future live components (soon to be renamed "Loop components") will be introduced to provide even more collaborative authoring tools. The video below shows myself and my colleague Dan editing the whiteboard simultaneously. It's not the best illustration but I think it does convey the capabilities:

 
In short, spending a bit of personal time playing with Whiteboard and building confidence is a good investment for many people at this point. It will be interesting to see where Microsoft take the interplay between Whiteboard and the forthcoming Microsoft Loop app (expected in the first half of 2022), but being comfortable running collaborative meetings is essential regardless of the tool specifics.

Using in-meeting polls to survey the team and ask questions

One extremely powerful technique which I don't think is widely known yet is the ability to dynamically create an on-the-fly poll during the meeting. Some folks try to gather sentiment by asking people to raise hands at a certain point ("all those who vote for X, raise hands now") but that's sub-optimal because:
  • There's no option for anonymity - everyone can see who raised hands when
  • People may miss the timing or context
  • Results aren't captured anywhere
Teams has some extremely good smarts to help with dynamic polling to speed up the process - this is what makes it possible to do live, on-the-fly as you're also dealing with hosting the meeting and the conversation flow. Specifically, AI is used to help you re-use a question you've asked previously and suggest likely response options to questions you add, saving you from manually typing out each possible option for a multi-choice question.

When you're in a call and realize that a quick poll would be helpful, you add the Forms app to the meeting - the concept of adding an app to a meeting is perhaps the step which isn't widely known. Some key things to observe in the video below:
  • As soon as the app is added to the meeting, there's a poll suggestion from a previous question I used ("how happy are you at the moment?") - I could simply click this to reuse within seconds
  • I decide to create a new poll but with the same "how happy are you?" question, and the Forms app automatically gives suggested options such as "Very happy", "Somewhat happy" etc. - this is such a time saver
  • I can select options around sharing results immediately, keeping responses anonymous and even allowing others to add questions to the poll
  • Once launched, the form appears as a pop-up form (task module) for others in the meeting
You can see all this in action here:


Using presenter mode in Teams

The combination of "speaker plus PowerPoint deck" is one we're all intimately familiar with, but in the vast majority of cases people use the default settings which simply presents the attendee gallery alongside the presentation. Although the spotlight feature can be used for the person speaking, the experience is still far from optimal and doesn't compare to a physical meeting where someone might be stood at the front of the room. Fortunately presenter mode in Teams is designed to improve upon this - it combines the speaker's video and the content being shared (e.g. PowerPoint) in a few different layouts:   

Side-by-side:


Reporter:


Standout:



I think the biggest adoption blocker for presenter mode is simply that people overlook where to do this in Teams. Here's where to find the options:


Note that PowerPoint Cameo takes this even further by allowing you to place exactly where you'd like to appear on each individual slide - this helps ensure you don't block vital content on the slide for example:



PowerPoint Cameo is expected to be available in 'early 2022'.
 

Using SharePoint Syntex in Teams meetings

At first you might think there isn't much connection between SharePoint Syntex and meetings. Syntex, of course, provides the ability for Microsoft 365 to 'understand' your documents, automatically recognizing and classifying known document types and extracting the important parts from them. I liken it to the ability of SharePoint to read your documents like a human does - not only understanding the difference between an invoice and a contract (for example), but also being able to find and read the all-important cost table or assigned project manager - and doing so reliably for a document that has 10 pages and one that has 100 pages. If useful, I walk through Syntex in more detail in two articles starting with SharePoint Syntex - training Syntex to read your documents like a human.

So, the connection with meetings? Well, at Content+Cloud we're starting to use Syntex during certain team meetings. The use cases vary, but one example is a weekly commercial meeting where Statements of Work which were issued to clients through the week by different project managers are gathered up and placed into a central SharePoint library during the call itself to avoid "Sure, I'll get round to that later!" act as a forcing agent. In 1-2 minutes a bunch of SOWs are parsed by Syntex allowing the team to see the total value and any details accidentally missed. This is best summarized by the following image, taken at the end of the processing:

Notice that:
  • The document has been recognised as "C+C Statement of Work"
  • The Engagement total, Business Manager, Exec Sponsor and Project Manager have been located in the documents and extracted into columns
  • There's a visualisation on the engagement total
  • A couple of SOWs do not have a Project Manager specified, and this has been highlighted
Of course, all these opportunities and transactions are going through our CRM and ERP systems but there's always a Statement of Work document sent to the client for signature at some point. Ensuring the details are as expected before sending, keeping the team up-to-date, but doing so at speed on the weekly call is invaluable. The video below shows:
  • A couple of redacted C+C Statement of Work documents, to give a sense of the structure of these documents
  • A set of around 10 SOWs being dropped into a SharePoint library with Syntex enabled
  • The completed processing happening within seconds
 
 

Summary

Hybrid working means a continued focus on Teams meetings and calls for most of us, and running effective meetings takes effort and a good understanding of the tools available. I'd contend it's practically a new skillset for most of us, but there's a lot to be gained by elevating meetings beyond  simply people speaking and raising hands. 

Going beyond the suggestions in this post, the next frontier is building custom apps which extend the Teams meeting experience - clearly that requires some investment but there are all sorts of possibilities with Teams meeting extensions. Take the idea of ensuring stakeholders on a Teams call have accurate client information to hand to support decision making for example - sure, it would be possible for someone on he call to go off to separate apps and platforms to do some lookups, but by baking the tools and data into the Teams call we reduce the friction and make the insights available to all. There's a much higher chance of up-to-date and accurate information being used because it's right there in the context of the call. 

At Content+Cloud we've used this in some of the Teams apps we've developed for clients and are actively thinking about how this dimension can help in just about all Teams solutions we build. 

Hopefully this post has been food for thought, and perhaps a mini-inspiration (or at least a reminder) of some of the techniques which can transform Teams meetings and drive new levels of effectiveness.

Monday, 6 December 2021

Microsoft Ignite November 2021 announcements summary - Teams, Power Platform, Viva, Syntex and new products/experiences

Microsoft held their now twice yearly Ignite conference a few weeks ago, with the usual firehose of announcements - as usual, this included some items which aren't really "new news" at all and some parsing is needed. It always hard to keep up with the detail of developments and launch dates, but never more so than now. Not only are Microsoft keeping their foot to the floor on innovation, but also with some bold and surprising new products and experiences such as Mesh for Teams and Microsoft Loop. Whilst the "Ignite Book of News" that Microsoft create is useful (link at the end), I find myself needing a more concise summary to reference when talking to inside Content+Cloud or with clients. For the last few events I've created "Ignite on a slide" summaries, presenting my view of key announcements and expected availability dates.

In this post you'll find the slides as images, and a downloadable deck which combines all of them. The following areas are covered:

  • Teams
  • Power Platform
  • Microsoft Viva
  • New products and experiences (Microsoft Loop, Mesh, Context IQ, Clipchamp etc)
  • SharePoint Syntex 

Feel free to re-use or share.

Microsoft Teams

Click each image to enlarge:

Power Platform

Microsoft Viva

New products and experiences (Loop, Mesh, Context IQ, Clipchamp etc.)

SharePoint Syntex

Of course, my summaries are somewhat subjective and you might feel there's something I've missed - but hopefully they're useful somehow.

Download the combined deck

You can download the combined deck from:

 

Summary

Hopefully these summaries are useful in some form and you're free to use them as you like. When you need more detail on any of these announcements (and you will), I highly recommend using Microsoft's published "Book of News":

Link:  Ignite November 2021 Book of News

Monday, 15 November 2021

Speaking at the European Collaboration Summit 2021 - Infuse AI into your Power Platform solutions

The European Collaboration Summit (ECS) is a fantastic Microsoft-focused conference in Europe with around 2100 attendees expected, and I'm hugely excited to be speaking there again this year. While we're clearly not done with the pandemic yet, it feels great to be out speaking and networking in-person again and the recent South Coast Summit event here in the UK showed that many others share the same feeling. This year's European Collaboration Summit will be a special event - it essentially combines two conferences in one since the European Cloud Summit which focuses on Azure and Google Cloud has been rolled into this event. I'll be speaking on automation, AI and the Power Platform - some one of my favourite topics of recent times as we embark on the next frontier of process automation.

ECS is held in Düsseldorf this year and as usual has a strong line-up of speakers and significant Microsoft representation. Keynote speakers include Karuana Gatimu, Dan Holme, Vesa Juvonen and others from Microsoft and Bernd Wagner from Google. With over 150 sessions, you can expect deep dives on Microsoft 365, Azure, the Power Platform, Google Cloud as well as business and strategy-focused talks on digital transformation and modern workplace in general. 


The event is almost sold out but it's not too late to get tickets - see below for more details. 

My session - "Infuse AI into your Power Platform solutions"

The session abstract is:

Bringing AI into your applications has never been easier, and huge benefits can be unlocked when some level of intelligent processing of your data happens. From auto-tagging of incident report images uploaded from a Power App, to Flows that detect anomalies in documents, to apps which detect if a retail shelf is low on stock - so many improvements to your SharePoint-based processes are now within easy reach.

In this session we'll cover several scenario demos showing how you can instantly get better insights from your data and better outcomes with little effort - and no developers required! This session is aimed at anyone building solutions on the Power Platform.

The session has a couple of pillars:

  • Demonstrating how to build AI into solutions using the example of an incident reporting Power App. The app uses image recognition to understand photos captured on a mobile phone, auto-tagging the image in Microsoft 365 and integrating with Microsoft Teams to alert a responder group for further triage if the incident appears to be serious
  • An exploration of 3 different techniques to integrate AI. Specifically we look at:
    • Power Apps AI Builder
    • Azure Cognitive Services through code
    • Azure Cognitive Services through Power Automate

Each of these options brings different capability and cost implications, and being able to make the right decisions in this space is vital. One area of focus is cost modelling based on Power Platform premium licensing where I show how what could be considered an architectural choice can have a big impact on the TCO of your solution. 

ECS conference details

Some more high level details of the conference:
  • When - 29 November - 01 December 2021
  • Where - Düsseldorf, Germany
  • Language - English
  • Conference size - expected to be 2100+ attendees
  • Pricing - see the Tickets page on the conference website
It would be great to see you there! The conference website has all the details you need of course:



Wednesday, 8 September 2021

Bringing external data into Microsoft 365 - custom search result types and verticals

 In the previous article we looked at how to integrate other data sources into Microsoft 365, using ServiceNow as an example. This approach of using a Graph Connector to bring external data in can be used with Azure SQL, on-premises SQL Server, Windows file shares, Azure Data Lake, Azure DevOps, Salesforce, Oracle, ServiceNow and several other major platforms - regardless of the target, the process is largely the same. One benefit is that Microsoft Search can now provide a consolidated search engine across all of these platforms - improving discoverability and breaking down silos. There's more to it than that though - beyond search, the other platforms can now be used as "intelligence sources" for Microsoft 365, with some capabilities available now and more to come. Examples of this include:

  • Viva Topics using the other platform to mine knowledge and expertise (later in 2021)
  • "People and workplace intelligence" integrations, where the other platforms feeds information to the Microsoft Graph to power experiences in Microsoft 365. Examples of this might be: 
    • Recommended content from a custom SQL CRM system being displayed to the user on the Office.com home page
    • Entities in another system (e.g. a client in Salesforce) appearing in 'used', 'shared' and 'trending' lists shown to the user within Microsoft 365 (date unknown)   
In this article I want to stay focused on search, and in particular discuss how to control the appearance of search results which come from an external platform. Continuing my scenario from the previous article, I'm bringing in ServiceNow Knowledge Base content - in cases like this you will typically want to do two things:
  • Create a custom search vertical - this is a tab in the search results which only shows results from the external platform. This allows users to filter their search to just this content source
  • Create a custom result type - this allows you to control exactly which pieces of data are displayed in the search result and where
Microsoft provide a layout designer to help with this process. This helps you construct an adaptive card layout which gives you the formatting control of the search result, allowing you to specify all of the individual bits of data and where in the result they appear:

So, in this post we'll create a custom search vertical and a custom result type for my ServiceNow scenario. Configuration for both of these can be done at the tenant level in the Microsoft 365 admin portal or at the site collection level in Site Settings. I'm using the former option here, requiring tenant admin permissions. Before we dive in, note that:


Creating a custom search vertical for external search results

If you have extended SharePoint search in the past, you'll probably be familiar with the concept of a search vertical - effectively a custom tab of search results appearing in the search engine. This model continues to be used in modern day Microsoft Search, and the process only takes a few minutes. Essentially we're providing a place for the results to show in a way that's clear where they are from - results do not get interleaved in the main search results. 

To start, find the Search & intelligence section within the Settings menu in the admin portal. From the last post we already have a data source defined (ServiceNow in my case), so we go into the Customizations area and select Verticals and begin the process of adding one:


In the next step, select the definition of the remote content source you are using (i.e. ServiceNow):


You now have a couple of options for pre-filtering the results returned - using KQL or property matching. For example, you could ensure only KB articles created in the last 12 months are used. I'm choosing not to do any pre-filtering:



You can now review the settings used before finishing up:


Now it's just a question of adding and enabling the vertical you just created:




So that's step one. Now that we have a search vertical defined to show results from the data being integrated, it's time to move on to how the results are presented.

Creating a custom search result type

Microsoft Search needs to understand how to present a result from the system you are integrating. Within the admin portal we need to be in the same areas as above (Search & intelligence > Settings > Customizations. This time select Result types and begin the process of adding one:


In the next step we name the result type. Then area on the left in the image below shows the steps we'll walk through:

Now we assign this result type to our previously-created content source:

In the next step we can define criteria for the result type to apply. This gives the control to use multiple result types for a given data source, for example in my case I could have a different layout depending on the category of the ServiceNow Knowledge Base article being returned: 

At this point we can jump off into the layout designer mentioned earlier:

The designer is an external tool currently hosted at https://searchlayoutdesigner.azurewebsites.net - once opened, the first step in the tool is to select one of the provided base templates to use as a starting point:

Once you've chosen a good base, click the "Get Started" button at the bottom of the page. That will take you into this interface where you can map values in the search result to tokens in the layout template:

At this point things can be confusing initially because it may not be clear what to enter into each of the "Property" boxes to do the mapping for things like the title, URL, description etc. - they're just text boxes after all, no pickers. However, that might be because, like me, you didn't pay enough attention to what was on the previous page in the admin center:

If you scroll down on the page we jumped off from, there's a table of "Available properties" which lists the name of every piece of data which can be used in your search result:

Armed with this, the process involves copy/pasting keys into the slots provided in the layout designer.


These are "property labels" you assigned when setting up the data source itself - we did this in the last article in this step:

For my ServiceNow result, I use mappings such as:
  • title = ShortDescription
  • titleUrl = AccessUrl
  • modifiedBy = SysUpdatedBy
..where the item on the left is the "slot" in the SharePoint search result, and the item on the right is the ServiceNow attribute. Once you've filled all the slots, the 'Submit' button the bottom of the page will become enabled and clicking it copies the JSON template which is generated:

You then paste this into the textbox provided in the admin center page:


From there you can review your previous selections and then click the 'Add result type' button. On doing so you should see a successful result:


Your custom search vertical and result type are both now created, complete with all the formatting rules you chose. 

The result should be something like this:

(In Microsoft 365/SharePoint):



(In Microsoft Search in Bing):


Summary 

Integrating other platforms with Microsoft 365 provides some compelling ways to simplify the user experience. The approach described here with Graph Connectors can provide a unified search experience and single place to go to, but there are other benefits too. As described at the beginning of this article, Microsoft are increasingly looking for ways to drive value from external data - including expanding the content Viva Topics can use for knowledge mining as well as proactively guiding the user to new or modified data and recommended content from the other platform. This is likely to be a technique we'll use heavily in the future.

Monday, 2 August 2021

Bring external data into Microsoft 365 using Graph Connectors - a ServiceNow example

Microsoft 365 has become the centre of the digital universe for many organisations, and it makes sense to explore the integration of other platforms and data sources so that the employee experience is simpler and less fragmented. A great example is search - perhaps most of the organisation's documents are now in Microsoft 365, but when technical knowledge base articles are stored in ServiceNow, client data in Salesforce and there's still a file share of archived (but still useful) content, the net result can be a lot of context switching and time lost to searching. No wonder those McKinsey and IDC research papers suggest an average knowledge worker spends 20-30% of their time simply looking for information. 

The benefits of providing a consolidated search experience often increase as each additional location is integrated - great things can happen when data in a certain system is made more accessible or put in the line of sight of new audiences. The sales and marketing teams might spend all day in CRM, but when client data is put in front of other groups in the company that can help others make better decisions too. In Microsoft 365, the Graph Connectors framework makes this possible - so that's what we're looking at here. 

This article comes in two parts:

For us here at Content+Cloud, a good example of a valuable content source is ServiceNow - it's the platform that powers the Managed Services Provider side of our business, providing core ITSM capabilities around problem/incident/change management as well as various forms of automation, AI and analytics which help us maintain a great service. Something that ServiceNow does quite well is knowledge base tooling - which isn't the easiest thing for me to say as a Microsoft person immersed in Viva Topics and SharePoint Syntex. But it's true - ServiceNow has all sorts of concepts like the Article Quality Index scoring mechanism, the ability to create knowledge from tasks easily and identify possible duplicates - capabilities that suit it's role in providing curated knowledge to support engineers where misinformation can be disastrous. We follow Microsoft and ServiceNow integration closely here at C+C, and there have been LOTS of recent developments - one example is a Microsoft Graph Connector for ServiceNow, and when this became available I knew it would be something useful for us. 

Integrating external data with Microsoft Graph Connectors

At the time of writing Microsoft provide nine native connectors:

In addition, the Microsoft Graph connectors gallery provides a showcase of 3rd party connectors created by other vendors - usually these are paid products, but allow you to go beyond what's possible with Microsoft's connectors. Finally, it's possible to create your own Graph connector as illustrated by the Graph connector GitHub sample

A single framework and approach for all sources - not just ServiceNow
In this article I use ServiceNow as the external data to bring into Microsoft 365, but with Graph connectors the process is 90% the same regardless of data source. So if you want to connect to Azure SQL, Azure Data Lake, a file share, Salesforce or any of the other above sources, the process is much the same. 

The work you do on the non-Microsoft 365 side is generally around creating an app registration or account for the connection to use. You might need to take care of additional things around authorisation and permissions, but there's some flexibility in this in the Graph connector side too. 

Improving search and discoverability through integration 

Being able to index content in other systems allows you to provide a consolidated experience, with the additional location appearing as a search vertical (tab) in the results. You can control how results are displayed, including changing the pieces of data shown and the formatting. Clicking the tab runs your search across this content source (i.e. ServiceNow in my case): 

Viva Topics and Graph connectors
Being able to search and discover across other sources is powerful, but in the future Viva Topics will also be able to use external sources for knowledge gathering. This has the potential to make a huge impact in organisations where authoritative content is split across multiple repositories. Viva Topics will not only do the hard work of identifying, organising and surfacing knowledge across platforms - but will also "bring the knowledge to where the user is" through the topic cards which appear in Teams, Outlook and SharePoint. That could be very compelling indeed as a way to unify platforms and ensure data is brought into the core digital workplace experience.

Configuring the link between Microsoft 365 and ServiceNow

Configuring an OAuth app registration in ServiceNow

In the case of ServiceNow, the first step is to create an OAuth endpoint in ServiceNow for your Graph connector to use. This is documented at ServiceNow Graph connector for Microsoft Search. In my case I'm using a ServiceNow PDI (Personal Developer Instance) and the authentication type I used is ServiceNow OAuth. Here's what my ServiceNow endpoint looks like:



In ServiceNow authZ/authN, a ServiceNow account is also required for the connection - this needs to have access to the knowledge role in the platform. The app registration and the identity are used together in authentication.

Once you have ServiceNow side in place, it's time to create the Graph connector in Microsoft 365.

Creating a Graph connector in Microsoft 365

To start, head into the Admin Center and into Settings > Search & Intelligence.

Look for the 'Data sources' tab and click 'Add':



Select ServiceNow as the data source:

On the next screen you supply a name, ID and description for the connection - these can be any values you like but the ID can only contain alphanumeric characters:

The next screen is where the actual ServiceNow instance details are specified:


When the 'Sign-in' button is clicked a pop-up window will appear for you to login and provide in ServiceNow - the credentials to use at this point are those for the identity which has the knowledge role in ServiceNow:

You are then taken through a consent flow for that user:

Once the consent is granted the connection is tested by Microsoft 365 and the result shown:

The next few screens allow you to specify exactly how the ServiceNow data should be indexed. This process will be different depending on your data source, but for ServiceNow I can first pick the properties/fields to bring in and any additional filter I want to supply: 


The connector does a great job of specifying good defaults on your behalf. For example, in the "Filter data" section above you can see a default query string being used to filter out ServiceNow KB articles which aren't active or at a state of 'published' - this will be what you want in the vast majority of cases. 

The Graph connector framework has a nice preview capability to help you see the results ahead of full configuration. Hitting the 'Preview results' button gives me a few records from the external source:
 

Security trimming is the next section - depending on the connector used and how you configured authentication, you can specify that permissions in the underlying data source are respected so that the viewing user doesn't see anything different to within the source system:


I allow 'Everyone' to be used in my case, since I'm effectively using a form of app authentication (ServiceNow OAuth + ServiceNow named user) rather than delegated auth with the user's identity which would support this.

In the next step we map properties in the external source to properties in Microsoft 365 search - effectively the same as SharePoint managed properties for those familiar with those. This allows a common set of properties to be used across different content types within search - so that there's always a title, URL, last modified timestamp etc:


Related to this, you can set which properties are Queryable, Searchable, Refinable and Retrievable within Microsoft search. This allows you to control which you might want to use as refiners/filters in search and which can be queried on - for example, you might want to query on a person name and have it return ServiceNow articles where he/she is the author.

Again Microsoft's ServiceNow connector does a great job of providing defaults so you can probably accept them and continue:

The final config setting is how often the indexing process from Microsoft 365 to the source should run - with settings for an incremental and full crawl:


The config is now complete, so let's review settings before confirming:


It's now for Microsoft 365 to publish the connector and start indexing the external source


The result


Once the indexing has happened Microsoft Search is able to show results from the external data source, as shown earlier:


Courtesy of what is now known as 'Microsoft Search in Bing', another surfacing point that will be interesting to some is Bing itself - if it suits me, I can go direct to Bing in my browser and if the integration with my workplace is enabled I get the same results there too in the 'Work' tab:


By extension it should be possible to enable Windows search to cover this too - meaning you could hit the Windows key, type a search term and it search all configured sources including your external data source brought into Microsoft 365 through your Graph connector:


Wrap-up

So that's the process and it's not too difficult - most of the effort is on the side of the external system since that's where you'll need to configure authentication. In the next post we'll look at controlling the appearance of search results with:

  • Custom search verticals
  • Custom search result types