Loading...

Follow Hubfly on Feedspot

Continue with Google
Continue with Facebook
or

Valid

In this article, you’ll see the steps to enable the diagnostic logs with an IoT Hub. if a problem occurs in your IoT Hub solution which running in the production you want to enable the diagnostic logs. It will help you to diagnose the problem and fix it immediately.

Please read the previous parts of the article before continuing with this one

1. How To Create Azure IoT Hub Using PowerShell

2. How to Register IoT Device in Azure IoT Hub Using PowerShell

3. How To Send Telemetry From An IoT Device To The Azure IoT Hub Using C#

Enable the diagnostic logs

When creating a new IoT Hub the diagnostic logs are disabled by default. Lets see how to enable it.

→ Open your Azure portal and login to your Azure account.

→ Select your IoT Hub from the resource groups.

 Click Diagnostic settings in the Monitoring section . You can see the diagnostic status is disabled by default.

 Now double click the resource, you can see the Turn on diagnostics like below image.

 Enter the name for your diagnostic setting. Here I name as diags-hub.

→ Check Archive to a storage account.

 Click configure to select the storage account screen.

 Choose your storage account and click ok to return to the diagnostic settings pane.

→ Under LOG , Check Connections and Device Telemetry and set the Retention (days) 7 Days for each. You Diagnostic setting should looks like below image

 Click Save to save the settings. Close the Diagnostic settings pane.

 You can see new setting that we created in the below image.

IoT Hub connections and device telemetry logs are sent to the specified destination as soon as  new event data is generated.

To See the diagnostic logs

 Go to your resource group and select your storage account Hubflyiotstoragedev . 

→ Select the Blobs from the Blob service, you can see the insight-logs-connections 

 Select the insight-logs-connections container . Drill down until you get the current date and choose the recent file.

 Click Download to download and open it. You can see the logs of device connections and device telemetry to IoT Hub. see the below image sample

That’s it, I hope you have learned how to setup diagnostic logs with an IoT hub. Feel free to fill up the comment box below if you need any further assistance.

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

In this article, we are going to see how to configure message routing with Azure IoT Hub. Here we will route the message to a storage account. Message routing enables us to send telemetry data from IoT Hub to custom endpoints or Event-Hub endpoints. Once the setup is done, the telemetry from IoT device to IoT Hub will automatically route to the endpoints. Please read the previous parts of the article before continuing with this one. 

How To Create Azure IoT Hub Using PowerShell 

How to Register IoT Device in Azure IoT Hub Using PowerShell 

How To Send Telemetry From An IoT Device To The Azure IoT Hub Using C# 

Routing message to a storage account: 

→ Open your Azure portal and log in to your Azure account and choose your IoT Hub. 

→ Click Message Routing In Message Routing Pane. You can see the list of routes and custom endpoints.  

→ Click +Add  button on the Routes pane. Click +Add button next to Endpoint field like below picture. 

→ Choose Blob storage from the options; add a storage endpoint which will be displayed like the image below: 

→ Enter the name for your endpoint: here we use IoTStorageEndpoint 
→ Click Pick a container, it will take to the list of storage container that we have created in the Azure portal like below image 

→ Choose any one of the storage account. Here i choose hfazureiotjstextx  then it will display the Containers like below image 

→ Click +Containers button and enter the new name and access level for the container. 
Then click Ok button . 

→ Select the newly created container it will return to the Add a storage endpoint pane. 

→ Use default for the rest of the fields. You can create the blob name using Blob file name format.  
→ The default is {iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}. And this format must contain in any order. The blob name → will look like this HubflyIoTHubConnect/0/2019/02/12/18/05.  The blobs are written in Avro format 
→ Click Create button to create the storage endpoint. It will return to the Add a route pane. 
→ Now enter the route name, Here we use IoTRoute 
→ Choose Data source as Device Telemetry Messages from the drop down list 
→ Enable Route:  Be sure this is enabled. 
→ Route Query:   Enter the route query string as “level=”storage” .  

→ Click Save. It will return to the Message routing pane like below image 

That about does it. You must have learned how to configure message routing to a storage account with an IoT Hub. Should you need further assistance, kindly fill up the comment field. 

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

In this article, we are going to see how to get SharePoint current user details from the Ionic 3 mobile app.  

Before you begin applying what is said in this article, we need to integrate SharePoint & Office 365 authentication process and get the access token process in your Ionic 3 app. Here is an article for both the integration parts:

 How to Authenticate SharePoint & Office 365 from Ionic 3 Mobile App

→ How to Get Access Token and Refresh Token for SharePoint from Ionic 3 Mobile App

The above-mentioned article will help you with the  integration part. So, kindly visit the above mentioned article and download the source code.  

 Once download is completed, open your project directory using terminal.

 Now, type following command: npm install.

This command will install all dependencies for project. The project is now ready.

 Now, run the project using the following command:

ionic serve (For Browser)

ionic cordova run android (For Device)

Here we have used ionic cordova run android command to run device. Make sure that you have connected device and the settings have been set. Once running successfully, we will be able to see following output in your mobile:

From output screen we can see the login page being displayed. Now need to enter username and password to login. After validation success, we will be able to see the home page:

 

The initial basic setup for SharePoint is now ready in our Ionic app.

Now, let’s start.

 Call the API to get current users details. So, we need to add HttpModule Open app.module.ts file and includes the following code:

import { HttpModule } from '@angular/http';

@NgModule({

            imports: [

    HttpModule

  ]})

export class AppModule { }

 Then, open app.component.ts file and include the following code:

First, we need to declare variable for store a current users value.

public CurrentUser: any;

Next, we need to inject the http object to our constructor part for calling the API method.

      constructor (private _http: Http) { }

URL Structure         

            The following URL format we need to pass to our API call URL field.

https://<your_sharepoint_site_collection_url>/

            _api/web/ currentUser

Here below mentioned method is used to get current users details, Once the method is called successfully we will be able to get response as CurrentUser variable. So, we can use these values to further displaying part.

getCurrentUserDetails() {     

        if (localStorage.getItem("token")) {

            let headers = new Headers();

            headers.append('Authorization', 'Bearer ' + localStorage.getItem("token"));

            headers.append('Content-Type', 'application/json;odata=verbose');

            let options = new RequestOptions({ headers: headers });

            let siteUrl=“https://example.sharepoint.com/”;

            let getUsersUrl=“_api/web/ currentUser”;

 

this._apiGet(siteUrl + getUsersUrl, options)

                .subscribe(

                    (result: any) => {

                        console.log("Result ",result);

                        if (result) {

                            this.CurrentUser = result.value;

                        }

                    }, (error) => {

                        console.log("Error", error);

                    }

                );

        }else{

            console.log("Need to Get Access Token");

        }

    }

In the siteUrl variable we need to give actual SharePoint site collection url. In the getUsersUrl variable, we need to give above mentioned SharePoint siteusers url.

Here the below mentioned method is used to get a list value and convert response as JSON format.

    _apiGet(apiURI: any, options: any) {

        return this._http.get(apiURI, options)

            .map((response: Response) => response.json())  

            .catch(this.errorHandler)

    }

 Here the below mentioned method is used to handle an error.

errorHandler(error: Response) {

        return Observable.throw(error);

    }

 Finally, let’s Call the getCurrentUserDetails method following like this.

            this.getCurrentUserDetails();

In that CurrentUser variable values contains following fields, Id, Email, Login Name, Title, Is Site Admin etc, for more reference I have added response as screenshots.

For more reference, I have added the full source code as attachments. Download and do npm install. This command will install all dependencies for project.  

We hope you learned how to get the SharePoint current user details from Ionic 3 mobile app.

If you have any questions/issues about this article, please let us know in the comments.

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

In this article we are going to provide steps to fix the issue for the Angular SPFx WebPart to run in the Internet Explorer 11(IE11).

While the Angular SPFx webpart runs in the Internet Explorer 11, it will throw an error which is shown below:

A proper solution to this issue for the SPFx, import the core-js polyfills in your WebPart.

To Resolve the above issue, follow the below steps and add the stuffs in your WebPart.

Create Angular SPFx WebPart

Create an SPFX WebPart and integrate Angular in your SPFx WebPart.

 Add core-js package in your WebPart

Go to the Node.js command prompt and make sure you are pointing to the Project directory and run the below command to include “core-js” package in your WebPart.

         npm install core-js 

 Add Polyfills.ts file in your WebPart

Create Polyfills.ts file in your WebPart and import the code below in the Polyfills.ts file

 import 'core-js/es6/symbol';

import 'core-js/es6/object';

import 'core-js/es6/function';

import 'core-js/es6/parse-int';

import 'core-js/es6/parse-float';

import 'core-js/es6/number';

import 'core-js/es6/math';

import 'core-js/es6/string';

import 'core-js/es6/date';

import 'core-js/es6/array';

import 'core-js/es6/regexp';

 if (WeakMap.toString().indexOf('function WeakMap()') === -1) {

    WeakMap = undefined;

}

import 'core-js/es6/weak-map';

 // Check for native support of Map vs Polyfill

if (Map.toString().indexOf('function Map()') === -1) {

    Map = undefined;

}

import 'core-js/es6/map';

// Check for native support of Map vs Polyfill

if (Set.toString().indexOf('function Set()') === -1) {

    Set = undefined;

}

import 'core-js/es6/set';

 export class Polyfills {

 }

 Import code in WebPart.ts file

→ Import the Polyfills file in your WebPart.ts file.

       import { Polyfills } from './Polyfills';

→ Import es6 reflect in the WebPart.ts file to provide intercepting Javascript operations.

        import 'core-js/es6/reflect';

→ Paste the below code in the top of the render() method in the WebPart.ts file

        window['polyfills'] = Polyfills; 

 Now the Angular SPFx WebPart run in the Internet Explorer 11.

Attached is a sample Angular SPFx WebPart Solution ↓ for the reference which have the solution for the IE11 issue.

We hope you learnt how to solve the “Error: Out of stack space” in IE11. 

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

In this article, we are going to see how to send telemetry from an IoT device to the Azure IoT Hub using C#. IoT Hub is a cloud platform to securely connect billions of IoT devices to create IoT applications. Please read the previous parts of the article before continuing with this one.

1. How To Create Azure IoT Hub Using PowerShell

2. How to Register IoT Device in Azure IoT Hub Using PowerShell

Creating a C# Console Application

 Open Visual Studio, go to File -> New -> and select Project.

 In Templates, select Visual C#, select Console App (.NET Framework) and give an appropriate name in the ‘Name’ textbox and then click the OK button. 

Installing Microsoft Azure IoT Device Client SDK  

 Go to Project ->  Manage NuGet Packages.  
 Click Browse tab and search for Microsoft.Azure.Devices.Client. You will see the Microsoft.Azure.Devices.Client device SDK will have listed in the search result and click Install button 
 Now, click the I Accept button to accept the license agreement.  
 It will take a few minutes to install the SDK in our project 

Get IoT device connect string from Azure IoT Hub 

 Open your Azure portal and choose your IoT Hub. 
 Click IoT devices In Explorers. You can see the list of devices that are connected to the IoT Hub. 

 Double click the device, you can see the device detailed information like device id, Primary Key, Secondary Key, Connection String(primary key) and Connection String(secondary key).  

 Using Microsoft.Azure.Devices.Client library we can create device client. The device client has CreateFromConnectionString method which requires device connection string as parameter. Create a read only static string s_connectionString01 and assign the connection string that we copy from Azure Portal. 
 Here you can create a random temperature and humidity values using Random(method. 
 Now open the program.cs  file and type the below code 

using System; 

using Microsoft.Azure.Devices.Client; 

using System.Text; 

using Newtonsoft.Json; 

using System.Threading.Tasks; 

namespace SimulationDeviceToCloud 

    class Program 

    { 

        private static DeviceClient s_deviceClient; 

        private readonly static string s_connectionString01 = "HostName=HubflyIoTHubConnect.azure-devices.net;DeviceId=RaspberryPi;SharedAccessKey=b9g+mmjAV8SqBlv8o/TChP0WBFCL5wi8/pDccXzBoys="; 

        static void Main(string[] args) 

        { 

            s_deviceClient = DeviceClient.CreateFromConnectionString(s_connectionString01, TransportType.Mqtt); 

            SendDeviceToCloudMessagesAsync(s_deviceClient); 

            Console.ReadLine(); 

        } 

        private static async void SendDeviceToCloudMessagesAsync(DeviceClient s_deviceClient) 

        { 

            try 

            { 

                double minTemperature = 20; 

                double minHumidity = 60; 

                Random rand = new Random(); 

                while (true) 

                { 

                    double currentTemperature = minTemperature + rand.NextDouble() * 15; 

                    double currentHumidity = minHumidity + rand.NextDouble() * 20; 

                   // Create JSON message 

                    var telemetryDataPoint = new 

                    {

                        temperature = currentTemperature, 

                        humidity = currentHumidity 

                    }; 

                    string messageString = ""; 

                    messageString = JsonConvert.SerializeObject(telemetryDataPoint); 

                    var message = new Message(Encoding.ASCII.GetBytes(messageString)); 

                    // Add a custom application property to the message. 

                    // An IoT hub can filter on these properties without access to the message body. 

                    //message.Properties.Add("temperatureAlert", (currentTemperature > 30) ? "true" : "false"); 

                    // Send the telemetry message 

                    await s_deviceClient.SendEventAsync(message); 

                    Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString); 

                    await Task.Delay(1000 * 10); 

                } 

            } 

            catch (Exception ex) 

            {

                throw ex; 

            } 

        } 

    } 

}  

 That's it. Now, run the web application, go to Debug menu, and click on "Start without Debugging" or press F5. This will display the below result 

We hope you have learned how to send telemetry from an IoT device to an Azure IoT Hub using C#. Feel free to fill up the comment box below if you need any further assistance from us. 

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

Since Meetings is quite a huge topic to cover in a single stretch, in the previous blog, there were details in scheduling meetings: the essentials so to speak. In this blog, you will be able to find ample information about joining meetings through Teams.

Join a Meeting

Joining meetings can be done by clicking Meetings on the left side of the app. You will see a list of all your meetings for the week. Find the meeting you want, and then click Join.

Share Screen 

During virtual meetings, there will be a need to share some data from your end or your peer’s end. Desktop sharing lets you present your screen or the app you're using during a meeting. Clicking Share  will allow you to share your screen effortlessly. You can choose to present your entire desktop, a specific app, or a file.

Meeting Notes 

Click on the Meeting Notes in the upper right corner of the meeting window. Click on Take Notes to take down what is happening during the meeting. Important information, action points can be easily jotted down into points by making use of Meeting Notes without having to reach for your Diary.

Invite Members 

Once the meeting starts, you feel like you have not invited a few members, click on Add people  icon to invite left out members. Type the name of new participants and select the required person’s name. 

Chat during Meetings 

If there is any need for you to converse with a particular person in the meeting, you can always make use of the Conversation icon. 

Audio Call 

Any call will initially have its Audio muted. For the people in the meeting to hear you, you must unmute the audio. You can mute and unmute the audio by clicking on the icon 

Video Call 

Any meetings can be either Audio only or Audio and Video meetings. By default, the camera will be turned on. If you just want to have an Audio meeting, you can click on the Turn camera off .

Background Blur 

During a video call, if you are not pleased with the unwanted movements in the background, that can be erased by clicking More options  > Blur my background. 

Record Meeting 

If one of the persons whom you expected to join the meeting could not join the meeting due to an unavoidable situation, the meetings can be recorded and sent to the desired person. Even if you want to save a copy of the discussion that happened during the meeting, meeting can be recorded. Do to so, click More options > Start recording. 

With this we come to the end of another blog which spoke about some features which make life easier at the office. We will return with a piece on file sharing. 

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

At any given time, the reason behind running any successful business is productive meetings, where ideas are born. The possibility of meeting in person is very less if the team members are spread out globally. That is when virtual meetings play a crucial role. These virtual meetings are made so easy that they can be scheduled by the click of a button.

Schedule meeting Meet now - Private

Inside every personal/private chat, there is a facility to meet at that very moment. This is made possible by clicking on the video icon at the top right corner.

Meet Now – Team

Inside every Team chat, there is a facility to meet at that very moment. This is made possible by clicking on the video icon at the bottom below the conversation text editor. This will allow everyone in the Team to take part in the meeting.

Even individual members of a Team can be invited for a meeting. That can be done by clicking Reply below any individual team member’s comment, and then clicking on  icon below the text editor.

Schedule Meeting - Specific time slot

Scheduling meetings is easy as pie with Teams – Meetings. All that needs to be done is click on the Schedule a meeting button at the bottom of the Meetings .

The below page is open on the previous action. Enter a title and location for the meeting. Also, the start and end date along with the meeting agenda/description. You can choose the channel or specific users whom you want to join the meeting and click Schedule.

Meetings is the heart of O365 Teams. It has many features which cannot be covered in one blog. Hence it has been split into two. The next blog will predominantly focus on Joining Meetings.

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

In this article, I am going to provide steps to get all the site columns and content types from your SharePoint Site and delete the site columns and content types using C# in Visual Studio 2017.

Step 1: Create Project for implementation.

1. Create a new project in the “Microsoft Visual Studio”.

2. Choose Console App (.NET Framework) in the popup and then click ok to create the project.

Step 2: Install Packages for the Project

1. Go to the “Tools”, click “NuGet Package Manager” from the Tools and choose “Manage NuGet Packages for solution” in the “NuGet Package Manager”.

If you want to get from SharePoint 2013 then install “SharePointPnPCore2013” else if you would like to get from SharePoint Online then install “SharePointPnPCoreOnline” from “NuGet Package Manager”.

Step 3: Code Implementation

 If you want to get Content Types and Site Columns from SharePoint Online, follow the below sample code.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Microsoft.SharePoint.Client;

using System.Security;

namespace ConsoleApp

{

    class Program

    {

        static void Main(string[] args)

        {

      GetSiteColumns_SharePoint("enter your username", " enter your password");

      GetSiteContentTypes_SharePoint("enter your username", " enter your password");

        }

  public static void GetSiteContentTypes_SharePoint (string username, string password)
        {

using (ClientContext clientcontext = new ClientContext("https://SiteUrl"))
{

SecureString passWord = new SecureString();

foreach (char c in pwd.ToCharArray()) passWord.AppendChar(c);

clientcontext.Credentials = new SharePointOnlineCredentials(username, password);

ContentTypeCollection displayContentTypes = clientcontext.Web.ContentTypes;

clientcontext.Load(displayContentTypes);

clientcontext.ExecuteQuery();

foreach (ContentType ContentTypes in displayContentTypes)

{

Console.WriteLine(ContentTypes.Name);

}

Console.ReadLine();

}

}

 public static void GetSiteColumns_SharePoint (string username, string password)
        {
            using (ClientContext clientcontext = new ClientContext("https://SiteUrl"))
{

SecureString passWord = new SecureString();

foreach (char c in pwd.ToCharArray()) passWord.AppendChar(c);

clientcontext.Credentials = new SharePointOnlineCredentials(username, password);

FieldCollection displayFields = clientcontext.Web.Fields;

clientcontext.Load(displayFields);

clientcontext.ExecuteQuery();

foreach (Field fields in displayFields)

{

Console.WriteLine(fields.Name);

}

Console.ReadLine();

}

}}

If you want to delete content types, replace the following snippet from the above code

                foreach (ContentType ContentTypes in displayContentTypes

{

Console.WriteLine(ContentTypes.Name);

ContentTypes.DeleteObject();

clientcontext.ExecuteQuery();

}

If you want to delete site columns, replace the following snippet from the above code

foreach (Field fields in displayFields)

{

Console.WriteLine(fields.Name);

fields.DeleteObject();

clientcontext.ExecuteQuery();

}

Step:4 Run the Project

Click “Start” to run the project. The console window pops up which displays the Content Types and Site Columns of the site.

With this we come to the end of this instructional blog. We hope you learnt how to get and delete Site Columns and Content Types in SharePoint using C#. 

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

Why all the fuss about Employee Engagement? Don’t business folks have enough on their hands already? These questions are very valid especially if you are running Small to Medium businesses. The employee factor is often overlooked because of a wrong notion passed on from generation to generation, that no employee is indispensable. Businesses can hardly afford to take employees for granted any longer. That is why Employee Engagement becomes an absolute necessity. Though there are many tools helping you achieve Employee Engagement, the Intranet is the best of them all:  

Before we address features vs benefits in an Intranet, here is a myth vs reality table that everyone thinking of improving Employee Engagement should have a look at. 

Employee Engagement: Myth vs Reality 

S No 

Myth 

Reality 

Employee Engagement is expensive  

There are effective inexpensive options costing as low as $200-$300 per month (for an employ force of 50 or lower) 

Employee feedbacks are useless 

Employee feedbacks are extremely important and help tailor an Intranet to suit the needs of the firm provided enough thought goes into designing the feedback form  

Employee’s emotional needs does not figure in Employee Engagement 

This is by far the most important need to be addressed. In fact, every feature of an Intranet is intended to tend to an emotional need of employees 

Money is the best motivator 

There is enough attrition now to prove that this is the worst presumption to have 

There are no tools sufficient to address all the employee engagement needs 

There is enough proof in all the case studies of Intranet companies to prove that Employee Engagement tools are not only sufficient but also efficient in motivating employees to collaborate 

Employees don’t ‘deserve’ to be treated like luxury 

Repeat after us: Employees are the most important part of your (any) company... 

Intranet Features vs Employee Engagement Benefits 

Multiple features of Intranets are meant to address multiple needs the employees might have to collaborate better. These features (and the benefits they provide) are explained one by one below: 

1. Gamification for Better Collaboration

This is a snapshot of an employee profile on Hubfly’s Intranet. The entire digital activities intended for collaboration are broken down: Stories, Ideas, Questions, Replies, Answers. The validations are also divided into measurable elements: Helpful Answers, Praise (Received/Given), Profile Views, and finally the sum of everything gives you the Engagement Score.  

2. Ideation and Communities features: to hear out every employee 

The Ideation feature focuses on people sharing any ideas they might have had but were not able to express in a board meeting. The best practices in dealing with ideas prefer the ideas being articulated well on a portal. The decision makers would then look into them, evaluate one against another and finally decide whether or not to go ahead with it after assessing the feasibility. This helps employees come up with bigger and better ideas because they know that their ideas are going to be evaluated for their worth by merit and not merely by reputation.

Communities is a feature that helps you have a discussion instantaneously with all your peers in your department and enables quick decision making. This makes the process transparent without you going he decided to go with idea X because John/Jane Doe was closest to him.  

3. Forms for seamless automation of annoying tasks 

Ask any salesman to chart out 3 most annoying moments in a quarter and you can wager that filling up the reimbursement form and producing all hard copies of bills figures in that list. He is okay waiting 3 hours for a transit flight because that adds value for his business but this form filling annoys him out of his wits. That is why Hubfly has the feature Forms which helps Salesmen, Marketers, Other employees alike in having their forms uploaded in quick time. From there, all that one needs to do is merely wait for approval.

This means no carrying a bundle of good-for-nothing bills around: all that he needs to do is take a photograph and upload it. This means that he can travel hassle free without panicking that he misplaced that really expensive hotel/restaurant bill. This makes life easier for those folks who add a lot of value to your firm. This is a way of expressing gratitude and showing your employees you care.  

Intranets are no longer nice to have options. That is another myth that has been busted by many firms which are having happier and more productive workplaces thanks to Intranets. Companies ranging from Large Enterprises to NGOs are all seeing Intranets for what they really are: the best Employee Engagement options there is right now.  

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

Separate tags by commas
To access this feature, please upgrade your account.
Start your free month
Free Preview