- ID de l'analyse :
- 652c7948-a238-4bbd-b827-8318ebe57b29Terminée
- URL soumise :
- https://devblogs.microsoft.com/visualstudio/
- Fin du rapport :
Liens : 81 trouvé(s)
Liens sortants identifiés à partir de la page
Lien | texte |
---|---|
https://go.microsoft.com/fwlink/?LinkId=521839 | Privacy Statement |
https://aka.ms/3rdpartycookies | Third-Party Cookies |
https://www.microsoft.com | MicrosoftMicrosoft |
https://blogs.windows.com/windowsdeveloper/ | Windows Developer |
https://blogs.bing.com/Developers-Blog/ | Bing Dev Center |
http://blogs.windows.com/msedgedev/ | Microsoft Edge Dev |
http://azure.microsoft.com/blog/ | Microsoft Azure |
https://cloudblogs.microsoft.com/sqlserver/?product=azure-data-studio | Azure Data Studio |
http://blog.revolutionanalytics.com/ | Revolutions R |
https://visualstudio.microsoft.com/downloads/ | Download Visual Studio |
Variables JavaScript : 55 trouvée(s)
Les variables JavaScript globales chargées dans l'objet fenêtre d'une page sont des variables déclarées en dehors des fonctions et accessibles depuis n'importe quel endroit du code au sein du champ d'application actuel
Nom | Type |
---|---|
0 | object |
1 | object |
onbeforetoggle | object |
documentPictureInPicture | object |
onscrollend | object |
isDarkTheme | boolean |
_wpemojiSettings | object |
_nslDOMReady | function |
$ | undefined |
jQuery | function |
Messages de journal de console : 0 trouvé(s)
Messages consignés dans la console web
HTML
Le corps HTML de la page en données brutes
<!DOCTYPE html><html lang="en-US" theme="light" class="js"><head>
<meta charset="UTF-8">
<script async="" src="https://www.clarity.ms/s/0.7.59/clarity.js"></script><script async="" src="https://www.clarity.ms/tag/jmy8eheejj?ref=wordpress"></script><script>
// Initialize theme from localStorage or system preference
let theme = localStorage.getItem('theme') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
document.documentElement.setAttribute('theme', theme);
const metaTag = document.createElement('meta');
metaTag.setAttribute('name', 'awa-ver');
metaTag.content = theme;
document.head.appendChild(metaTag);
isDarkTheme = theme === 'dark';
</script><meta name="awa-ver" content="light">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="awa-pageType" content="blog-front-page">
<meta name="awa-product" content="Visual Studio Blog">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Visual Studio Blog</title>
<meta name="mobile-web-app-capable" content="yes">
<meta name="color-scheme" content="dark light">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-title" content="Visual Studio Blog - The official source of product insight from the Visual Studio Engineering Team">
<link rel="profile" href="http://gmpg.org/xfn/11">
<link rel="pingback" href="https://devblogs.microsoft.com/visualstudio/xmlrpc.php">
<!-- [Begin] JSLL SHIM (1DS) domain prefetch -->
<link rel="preconnect" href="//js.monitor.azure.com" crossorigin="">
<link rel="preconnect" href="//browser.events.data.microsoft.com" crossorigin="">
<!-- [END] JSLL SHIM (1DS) domain prefetch -->
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
<!-- This site is optimized with the Yoast SEO Premium plugin v23.9 (Yoast SEO v23.9) - https://yoast.com/wordpress/plugins/seo/ -->
<meta name="description" content="The official source of product insight from the Visual Studio Engineering Team">
<link rel="canonical" href="https://devblogs.microsoft.com/visualstudio/">
<link rel="next" href="https://devblogs.microsoft.com/visualstudio/page/2/">
<meta property="og:locale" content="en_US">
<meta property="og:type" content="website">
<meta property="og:title" content="The Visual Studio Blog">
<meta property="og:description" content="The official source of product insight from the Visual Studio Engineering Team">
<meta property="og:url" content="https://devblogs.microsoft.com/visualstudio/">
<meta property="og:site_name" content="Visual Studio Blog">
<meta property="og:image" content="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/08/vsfeaturemed.png">
<meta property="og:image:width" content="559">
<meta property="og:image:height" content="350">
<meta property="og:image:type" content="image/png">
<meta name="twitter:card" content="summary_large_image">
<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"CollectionPage","@id":"https://devblogs.microsoft.com/visualstudio/","url":"https://devblogs.microsoft.com/visualstudio/","name":"Visual Studio Blog","isPartOf":{"@id":"https://devblogs.microsoft.com/visualstudio/#website"},"description":"The official source of product insight from the Visual Studio Engineering Team","inLanguage":"en-US"},{"@type":"WebSite","@id":"https://devblogs.microsoft.com/visualstudio/#website","url":"https://devblogs.microsoft.com/visualstudio/","name":"Visual Studio Blog","description":"The official source of product insight from the Visual Studio Engineering Team","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://devblogs.microsoft.com/visualstudio/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}</script>
<!-- / Yoast SEO Premium plugin. -->
<script type="text/javascript">
/* <![CDATA[ */
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-includes\/js\/wp-emoji-release.min.js"}};
/*! This file is auto-generated */
!function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings);
/* ]]> */
</script>
<style id="wp-emoji-styles-inline-css" type="text/css">
img.wp-smiley, img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 0.07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel="stylesheet" id="wp-block-library-css" href="https://devblogs.microsoft.com/visualstudio/wp-includes/css/dist/block-library/style.min.css" type="text/css" media="all">
<style id="safe-svg-svg-icon-style-inline-css" type="text/css">
.safe-svg-cover{text-align:center}.safe-svg-cover .safe-svg-inside{display:inline-block;max-width:100%}.safe-svg-cover svg{height:100%;max-height:100%;max-width:100%;width:100%}
</style>
<link rel="stylesheet" id="mpp_gutenberg-css" href="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/metronet-profile-picture/dist/blocks.style.build.css?ver=2.6.3" type="text/css" media="all">
<link rel="stylesheet" id="devblogs-evo-styles-css" href="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/css/theme.min.css?ver=1.2.0.1733860699" type="text/css" media="all">
<link rel="stylesheet" id="newsletter-css" href="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/newsletter/style.css?ver=8.6.4" type="text/css" media="all">
<link rel="stylesheet" id="fabric-icons-css" href="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/fabric-icon-manager/assets/css/fabric-icons.css?ver=1699358813" type="text/css" media="all">
<link rel="stylesheet" id="wp-featherlight-css" href="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/wp-featherlight/css/wp-featherlight.min.css?ver=1.3.4" type="text/css" media="all">
<link rel="stylesheet" id="block-custom-css" href="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/devblogs-blocks/assets/block-custom.css" type="text/css" media="all">
<link rel="stylesheet" id="highlight-css-css" href="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/devblogs-blocks/assets/highlight.css" type="text/css" media="all">
<script type="text/javascript">
window._nslDOMReady = function (callback) {
if ( document.readyState === "complete" || document.readyState === "interactive" ) {
callback();
} else {
document.addEventListener( "DOMContentLoaded", callback );
}
};
</script><script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/back-to-top.min.js?ver=1725380830" id="back-to-top-script-js"></script>
<link rel="https://api.w.org/" href="https://devblogs.microsoft.com/visualstudio/wp-json/"><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://devblogs.microsoft.com/visualstudio/xmlrpc.php?rsd">
<script type="text/javascript">
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};t=l.createElement(r);t.async=1;
t.src="https://www.clarity.ms/tag/"+i+"?ref=wordpress";y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, "clarity", "script", "jmy8eheejj");
</script>
<style>#respond h3#reply-title{display:none;}</style><link rel="icon" href="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/10/Microsoft-Favicon.png" sizes="32x32">
<link rel="icon" href="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/10/Microsoft-Favicon.png" sizes="192x192">
<link rel="apple-touch-icon" href="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/10/Microsoft-Favicon.png">
<meta name="msapplication-TileImage" content="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/10/Microsoft-Favicon.png">
<style type="text/css">div.nsl-container[data-align="left"] {
text-align: left;
}
div.nsl-container[data-align="center"] {
text-align: center;
}
div.nsl-container[data-align="right"] {
text-align: right;
}
div.nsl-container div.nsl-container-buttons a[data-plugin="nsl"] {
text-decoration: none;
box-shadow: none;
border: 0;
}
div.nsl-container .nsl-container-buttons {
display: flex;
padding: 5px 0;
}
div.nsl-container.nsl-container-block .nsl-container-buttons {
display: inline-grid;
grid-template-columns: minmax(145px, auto);
}
div.nsl-container-block-fullwidth .nsl-container-buttons {
flex-flow: column;
align-items: center;
}
div.nsl-container-block-fullwidth .nsl-container-buttons a,
div.nsl-container-block .nsl-container-buttons a {
flex: 1 1 auto;
display: block;
margin: 5px 0;
width: 100%;
}
div.nsl-container-inline {
margin: -5px;
text-align: left;
}
div.nsl-container-inline .nsl-container-buttons {
justify-content: center;
flex-wrap: wrap;
}
div.nsl-container-inline .nsl-container-buttons a {
margin: 5px;
display: inline-block;
}
div.nsl-container-grid .nsl-container-buttons {
flex-flow: row;
align-items: center;
flex-wrap: wrap;
}
div.nsl-container-grid .nsl-container-buttons a {
flex: 1 1 auto;
display: block;
margin: 5px;
max-width: 280px;
width: 100%;
}
@media only screen and (min-width: 650px) {
div.nsl-container-grid .nsl-container-buttons a {
width: auto;
}
}
div.nsl-container .nsl-button {
cursor: pointer;
vertical-align: top;
border-radius: 4px;
}
div.nsl-container .nsl-button-default {
color: #fff;
display: flex;
}
div.nsl-container .nsl-button-icon {
display: inline-block;
}
div.nsl-container .nsl-button-svg-container {
flex: 0 0 auto;
padding: 8px;
display: flex;
align-items: center;
}
div.nsl-container svg {
height: 24px;
width: 24px;
vertical-align: top;
}
div.nsl-container .nsl-button-default div.nsl-button-label-container {
margin: 0 24px 0 12px;
padding: 10px 0;
font-family: Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 20px;
letter-spacing: .25px;
overflow: hidden;
text-align: center;
text-overflow: clip;
white-space: nowrap;
flex: 1 1 auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-transform: none;
display: inline-block;
}
div.nsl-container .nsl-button-google[data-skin="dark"] .nsl-button-svg-container {
margin: 1px;
padding: 7px;
border-radius: 3px;
background: #fff;
}
div.nsl-container .nsl-button-google[data-skin="light"] {
border-radius: 1px;
box-shadow: 0 1px 5px 0 rgba(0, 0, 0, .25);
color: RGBA(0, 0, 0, 0.54);
}
div.nsl-container .nsl-button-apple .nsl-button-svg-container {
padding: 0 6px;
}
div.nsl-container .nsl-button-apple .nsl-button-svg-container svg {
height: 40px;
width: auto;
}
div.nsl-container .nsl-button-apple[data-skin="light"] {
color: #000;
box-shadow: 0 0 0 1px #000;
}
div.nsl-container .nsl-button-facebook[data-skin="white"] {
color: #000;
box-shadow: inset 0 0 0 1px #000;
}
div.nsl-container .nsl-button-facebook[data-skin="light"] {
color: #1877F2;
box-shadow: inset 0 0 0 1px #1877F2;
}
div.nsl-container .nsl-button-spotify[data-skin="white"] {
color: #191414;
box-shadow: inset 0 0 0 1px #191414;
}
div.nsl-container .nsl-button-apple div.nsl-button-label-container {
font-size: 17px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
div.nsl-container .nsl-button-slack div.nsl-button-label-container {
font-size: 17px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
div.nsl-container .nsl-button-slack[data-skin="light"] {
color: #000000;
box-shadow: inset 0 0 0 1px #DDDDDD;
}
div.nsl-container .nsl-button-tiktok[data-skin="light"] {
color: #161823;
box-shadow: 0 0 0 1px rgba(22, 24, 35, 0.12);
}
div.nsl-container .nsl-button-kakao {
color: rgba(0, 0, 0, 0.85);
}
.nsl-clear {
clear: both;
}
.nsl-container {
clear: both;
}
.nsl-disabled-provider .nsl-button {
filter: grayscale(1);
opacity: 0.8;
}
/*Button align start*/
div.nsl-container-inline[data-align="left"] .nsl-container-buttons {
justify-content: flex-start;
}
div.nsl-container-inline[data-align="center"] .nsl-container-buttons {
justify-content: center;
}
div.nsl-container-inline[data-align="right"] .nsl-container-buttons {
justify-content: flex-end;
}
div.nsl-container-grid[data-align="left"] .nsl-container-buttons {
justify-content: flex-start;
}
div.nsl-container-grid[data-align="center"] .nsl-container-buttons {
justify-content: center;
}
div.nsl-container-grid[data-align="right"] .nsl-container-buttons {
justify-content: flex-end;
}
div.nsl-container-grid[data-align="space-around"] .nsl-container-buttons {
justify-content: space-around;
}
div.nsl-container-grid[data-align="space-between"] .nsl-container-buttons {
justify-content: space-between;
}
/* Button align end*/
/* Redirect */
#nsl-redirect-overlay {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: fixed;
z-index: 1000000;
left: 0;
top: 0;
width: 100%;
height: 100%;
backdrop-filter: blur(1px);
background-color: RGBA(0, 0, 0, .32);;
}
#nsl-redirect-overlay-container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: white;
padding: 30px;
border-radius: 10px;
}
#nsl-redirect-overlay-spinner {
content: '';
display: block;
margin: 20px;
border: 9px solid RGBA(0, 0, 0, .6);
border-top: 9px solid #fff;
border-radius: 50%;
box-shadow: inset 0 0 0 1px RGBA(0, 0, 0, .6), 0 0 0 1px RGBA(0, 0, 0, .6);
width: 40px;
height: 40px;
animation: nsl-loader-spin 2s linear infinite;
}
@keyframes nsl-loader-spin {
0% {
transform: rotate(0deg)
}
to {
transform: rotate(360deg)
}
}
#nsl-redirect-overlay-title {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
font-size: 18px;
font-weight: bold;
color: #3C434A;
}
#nsl-redirect-overlay-text {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
text-align: center;
font-size: 14px;
color: #3C434A;
}
/* Redirect END*/</style><style type="text/css">/* Notice fallback */
#nsl-notices-fallback {
position: fixed;
right: 10px;
top: 10px;
z-index: 10000;
}
.admin-bar #nsl-notices-fallback {
top: 42px;
}
#nsl-notices-fallback > div {
position: relative;
background: #fff;
border-left: 4px solid #fff;
box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
margin: 5px 15px 2px;
padding: 1px 20px;
}
#nsl-notices-fallback > div.error {
display: block;
border-left-color: #dc3232;
}
#nsl-notices-fallback > div.updated {
display: block;
border-left-color: #46b450;
}
#nsl-notices-fallback p {
margin: .5em 0;
padding: 2px;
}
#nsl-notices-fallback > div:after {
position: absolute;
right: 5px;
top: 5px;
content: '\00d7';
display: block;
height: 16px;
width: 16px;
line-height: 16px;
text-align: center;
font-size: 20px;
cursor: pointer;
}</style> <!-- Start JSLL SHIM(1DS) Tags -->
<script src="https://js.monitor.azure.com/scripts/c/ms.jsll-3.min.js" type="text/javascript"></script>
<script type="text/javascript">
var config = {
useDefaultContentName: true,
useShortNameForContentBlob: false,
autoCapture: {
pageView: true,
onLoad: true,
onUnload: true,
lineage: true,
click: true,
scroll: true,
resize: false,
lineage: true,
jsError: true,
addin: true,
perf: true
},
urlCollectHash: true,
urlCollectQuery: true,
instrumentationKey: "31b03416b80d4fec81330cf396b8bf63-2db31b2d-ee29-4371-af87-871cba555f5a-7031",
coreData: {
appId: "MSDevBlogs",
},
// Initially set the GPC_DataSharingOptIn flag property in 1DS (One Data Source) to false
advancedConfig: {
propertyConfiguration: {
gpcDataSharingOptIn: false
}
},
callback: {
pageName: function () { return document.title },
contentUpdatePageTags: function () {
return {
metaTags: {
'ver': theme
},
}
},
pageActionContentTags: function () {
return {
metaTags: {
'ver': theme
},
}
},
pageActionPageTags: function () {
return {
"pageType": "blog-front-page",
metaTags: {
'ver': theme
},
}
},
pageViewPageTags: function () {
return {
"pageType": "blog-front-page",
}
},
}
};
awa.init(config);
</script>
<!-- END JSLL SHIM(1DS) Integration -->
<script>
/*! lazysizes - v4.1.3 | For lazy loading images */
!function (a, b) { var c = b(a, a.document); a.lazySizes = c, "object" == typeof module && module.exports && (module.exports = c) }(window, function (a, b) { "use strict"; if (b.getElementsByClassName) { var c, d, e = b.documentElement, f = a.Date, g = a.HTMLPictureElement, h = "addEventListener", i = "getAttribute", j = a[h], k = a.setTimeout, l = a.requestAnimationFrame || k, m = a.requestIdleCallback, n = /^picture$/i, o = ["load", "error", "lazyincluded", "_lazyloaded"], p = {}, q = Array.prototype.forEach, r = function (a, b) { return p[b] || (p[b] = new RegExp("(\\s|^)" + b + "(\\s|$)")), p[b].test(a[i]("class") || "") && p[b] }, s = function (a, b) { r(a, b) || a.setAttribute("class", (a[i]("class") || "").trim() + " " + b) }, t = function (a, b) { var c; (c = r(a, b)) && a.setAttribute("class", (a[i]("class") || "").replace(c, " ")) }, u = function (a, b, c) { var d = c ? h : "removeEventListener"; c && u(a, b), o.forEach(function (c) { a[d](c, b) }) }, v = function (a, d, e, f, g) { var h = b.createEvent("Event"); return e || (e = {}), e.instance = c, h.initEvent(d, !f, !g), h.detail = e, a.dispatchEvent(h), h }, w = function (b, c) { var e; !g && (e = a.picturefill || d.pf) ? (c && c.src && !b[i]("srcset") && b.setAttribute("srcset", c.src), e({ reevaluate: !0, elements: [b] })) : c && c.src && (b.src = c.src) }, x = function (a, b) { return (getComputedStyle(a, null) || {})[b] }, y = function (a, b, c) { for (c = c || a.offsetWidth; c < d.minSize && b && !a._lazysizesWidth;)c = b.offsetWidth, b = b.parentNode; return c }, z = function () { var a, c, d = [], e = [], f = d, g = function () { var b = f; for (f = d.length ? e : d, a = !0, c = !1; b.length;)b.shift()(); a = !1 }, h = function (d, e) { a && !e ? d.apply(this, arguments) : (f.push(d), c || (c = !0, (b.hidden ? k : l)(g))) }; return h._lsFlush = g, h }(), A = function (a, b) { return b ? function () { z(a) } : function () { var b = this, c = arguments; z(function () { a.apply(b, c) }) } }, B = function (a) { var b, c = 0, e = d.throttleDelay, g = d.ricTimeout, h = function () { b = !1, c = f.now(), a() }, i = m && g > 49 ? function () { m(h, { timeout: g }), g !== d.ricTimeout && (g = d.ricTimeout) } : A(function () { k(h) }, !0); return function (a) { var d; (a = a === !0) && (g = 33), b || (b = !0, d = e - (f.now() - c), 0 > d && (d = 0), a || 9 > d ? i() : k(i, d)) } }, C = function (a) { var b, c, d = 99, e = function () { b = null, a() }, g = function () { var a = f.now() - c; d > a ? k(g, d - a) : (m || e)(e) }; return function () { c = f.now(), b || (b = k(g, d)) } }; !function () { var b, c = { lazyClass: "lazyload", loadedClass: "lazyloaded", loadingClass: "lazyloading", preloadClass: "lazypreload", errorClass: "lazyerror", autosizesClass: "lazyautosizes", srcAttr: "data-src", srcsetAttr: "data-srcset", sizesAttr: "data-sizes", minSize: 40, customMedia: {}, init: !0, expFactor: 1.5, hFac: .8, loadMode: 2, loadHidden: !0, ricTimeout: 0, throttleDelay: 125 }; d = a.lazySizesConfig || a.lazysizesConfig || {}; for (b in c) b in d || (d[b] = c[b]); a.lazySizesConfig = d, k(function () { d.init && F() }) }(); var D = function () { var g, l, m, o, p, y, D, F, G, H, I, J, K, L, M = /^img$/i, N = /^iframe$/i, O = "onscroll" in a && !/(gle|ing)bot/.test(navigator.userAgent), P = 0, Q = 0, R = 0, S = -1, T = function (a) { R--, a && a.target && u(a.target, T), (!a || 0 > R || !a.target) && (R = 0) }, U = function (a, c) { var d, f = a, g = "hidden" == x(b.body, "visibility") || "hidden" != x(a.parentNode, "visibility") && "hidden" != x(a, "visibility"); for (F -= c, I += c, G -= c, H += c; g && (f = f.offsetParent) && f != b.body && f != e;)g = (x(f, "opacity") || 1) > 0, g && "visible" != x(f, "overflow") && (d = f.getBoundingClientRect(), g = H > d.left && G < d.right && I > d.top - 1 && F < d.bottom + 1); return g }, V = function () { var a, f, h, j, k, m, n, p, q, r = c.elements; if ((o = d.loadMode) && 8 > R && (a = r.length)) { f = 0, S++, null == K && ("expand" in d || (d.expand = e.clientHeight > 500 && e.clientWidth > 500 ? 500 : 370), J = d.expand, K = J * d.expFactor), K > Q && 1 > R && S > 2 && o > 2 && !b.hidden ? (Q = K, S = 0) : Q = o > 1 && S > 1 && 6 > R ? J : P; for (; a > f; f++)if (r[f] && !r[f]._lazyRace) if (O) if ((p = r[f][i]("data-expand")) && (m = 1 * p) || (m = Q), q !== m && (y = innerWidth + m * L, D = innerHeight + m, n = -1 * m, q = m), h = r[f].getBoundingClientRect(), (I = h.bottom) >= n && (F = h.top) <= D && (H = h.right) >= n * L && (G = h.left) <= y && (I || H || G || F) && (d.loadHidden || "hidden" != x(r[f], "visibility")) && (l && 3 > R && !p && (3 > o || 4 > S) || U(r[f], m))) { if (ba(r[f]), k = !0, R > 9) break } else !k && l && !j && 4 > R && 4 > S && o > 2 && (g[0] || d.preloadAfterLoad) && (g[0] || !p && (I || H || G || F || "auto" != r[f][i](d.sizesAttr))) && (j = g[0] || r[f]); else ba(r[f]); j && !k && ba(j) } }, W = B(V), X = function (a) { s(a.target, d.loadedClass), t(a.target, d.loadingClass), u(a.target, Z), v(a.target, "lazyloaded") }, Y = A(X), Z = function (a) { Y({ target: a.target }) }, $ = function (a, b) { try { a.contentWindow.location.replace(b) } catch (c) { a.src = b } }, _ = function (a) { var b, c = a[i](d.srcsetAttr); (b = d.customMedia[a[i]("data-media") || a[i]("media")]) && a.setAttribute("media", b), c && a.setAttribute("srcset", c) }, aa = A(function (a, b, c, e, f) { var g, h, j, l, o, p; (o = v(a, "lazybeforeunveil", b)).defaultPrevented || (e && (c ? s(a, d.autosizesClass) : a.setAttribute("sizes", e)), h = a[i](d.srcsetAttr), g = a[i](d.srcAttr), f && (j = a.parentNode, l = j && n.test(j.nodeName || "")), p = b.firesLoad || "src" in a && (h || g || l), o = { target: a }, p && (u(a, T, !0), clearTimeout(m), m = k(T, 2500), s(a, d.loadingClass), u(a, Z, !0)), l && q.call(j.getElementsByTagName("source"), _), h ? a.setAttribute("srcset", h) : g && !l && (N.test(a.nodeName) ? $(a, g) : a.src = g), f && (h || l) && w(a, { src: g })), a._lazyRace && delete a._lazyRace, t(a, d.lazyClass), z(function () { (!p || a.complete && a.naturalWidth > 1) && (p ? T(o) : R--, X(o)) }, !0) }), ba = function (a) { var b, c = M.test(a.nodeName), e = c && (a[i](d.sizesAttr) || a[i]("sizes")), f = "auto" == e; (!f && l || !c || !a[i]("src") && !a.srcset || a.complete || r(a, d.errorClass) || !r(a, d.lazyClass)) && (b = v(a, "lazyunveilread").detail, f && E.updateElem(a, !0, a.offsetWidth), a._lazyRace = !0, R++, aa(a, b, f, e, c)) }, ca = function () { if (!l) { if (f.now() - p < 999) return void k(ca, 999); var a = C(function () { d.loadMode = 3, W() }); l = !0, d.loadMode = 3, W(), j("scroll", function () { 3 == d.loadMode && (d.loadMode = 2), a() }, !0) } }; return { _: function () { p = f.now(), c.elements = b.getElementsByClassName(d.lazyClass), g = b.getElementsByClassName(d.lazyClass + " " + d.preloadClass), L = d.hFac, j("scroll", W, !0), j("resize", W, !0), a.MutationObserver ? new MutationObserver(W).observe(e, { childList: !0, subtree: !0, attributes: !0 }) : (e[h]("DOMNodeInserted", W, !0), e[h]("DOMAttrModified", W, !0), setInterval(W, 999)), j("hashchange", W, !0), ["focus", "mouseover", "click", "load", "transitionend", "animationend", "webkitAnimationEnd"].forEach(function (a) { b[h](a, W, !0) }), /d$|^c/.test(b.readyState) ? ca() : (j("load", ca), b[h]("DOMContentLoaded", W), k(ca, 2e4)), c.elements.length ? (V(), z._lsFlush()) : W() }, checkElems: W, unveil: ba } }(), E = function () { var a, c = A(function (a, b, c, d) { var e, f, g; if (a._lazysizesWidth = d, d += "px", a.setAttribute("sizes", d), n.test(b.nodeName || "")) for (e = b.getElementsByTagName("source"), f = 0, g = e.length; g > f; f++)e[f].setAttribute("sizes", d); c.detail.dataAttr || w(a, c.detail) }), e = function (a, b, d) { var e, f = a.parentNode; f && (d = y(a, f, d), e = v(a, "lazybeforesizes", { width: d, dataAttr: !!b }), e.defaultPrevented || (d = e.detail.width, d && d !== a._lazysizesWidth && c(a, f, e, d))) }, f = function () { var b, c = a.length; if (c) for (b = 0; c > b; b++)e(a[b]) }, g = C(f); return { _: function () { a = b.getElementsByClassName(d.autosizesClass), j("resize", g) }, checkElems: g, updateElem: e } }(), F = function () { F.i || (F.i = !0, E._(), D._()) }; return c = { cfg: d, autoSizer: E, loader: D, init: F, uP: w, aC: s, rC: t, hC: r, fire: v, gW: y, rAF: z } } });
</script>
<style id="ms-consent-banner-main-styles">.w8hcgFksdo30C8w-bygqu{color:#000}.ydkKdaztSS0AeHWIeIHsQ a{color:#0067B8}.erL690_8JwUW-R4bJRcfl{background-color:#EBEBEB;border:none;color:#000}.erL690_8JwUW-R4bJRcfl:enabled:hover{color:#000;background-color:#DBDBDB;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:none}.erL690_8JwUW-R4bJRcfl:enabled:focus{background-color:#DBDBDB;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:2px solid #000}.erL690_8JwUW-R4bJRcfl:disabled{opacity:1;color:rgba(0,0,0,0.2);background-color:rgba(0,0,0,0.2);border:none}._1zNQOqxpBFSokeCLGi_hGr{border:none;background-color:#0067B8;color:#fff}._1zNQOqxpBFSokeCLGi_hGr:enabled:hover{color:#fff;background-color:#0067B8;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:none}._1zNQOqxpBFSokeCLGi_hGr:enabled:focus{background-color:#0067B8;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:2px solid #000}._1zNQOqxpBFSokeCLGi_hGr:disabled{opacity:1;color:rgba(0,0,0,0.2);background-color:rgba(0,120,215,0.2);border:none}._23tra1HsiiP6cT-Cka-ycB{position:relative;display:flex;z-index:9999;width:100%;background-color:#F2F2F2;justify-content:space-between;text-align:left}div[dir="rtl"]._23tra1HsiiP6cT-Cka-ycB{text-align:right}._1Upc2NjY8AlDn177YoVj0y{margin:0;padding-left:5%;padding-top:8px;padding-bottom:8px}div[dir="rtl"] ._1Upc2NjY8AlDn177YoVj0y{margin:0;padding:8px 5% 8px 0;float:none}._23tra1HsiiP6cT-Cka-ycB svg{fill:none;max-width:none;max-height:none}._1V_hlU-7jdtPiooHMu89BB{display:table-cell;padding:12px;width:24px;height:24px;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:24px;line-height:0}.f6QKJD7fhSbnJLarTL-W-{display:table-cell;vertical-align:middle;padding:0;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:13px;line-height:16px}.f6QKJD7fhSbnJLarTL-W- a{text-decoration:underline}._2j0fmugLb1FgYz6KPuB91w{display:inline-block;margin-left:5%;margin-right:5%;min-width:40%;min-width:calc((150px + 3 * 4px) * 2 + 150px);min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;align-self:center;position:relative}._1XuCi2WhiqeWRUVp3pnFG3{margin:4px;padding:5px;min-width:150px;min-height:36px;vertical-align:top;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-align:center}._1XuCi2WhiqeWRUVp3pnFG3:focus{box-sizing:border-box}._1XuCi2WhiqeWRUVp3pnFG3:disabled{cursor:not-allowed}._2bvsb3ubApyZ0UGoQA9O9T{display:block;position:fixed;z-index:10000;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.6);overflow:auto;text-align:left}div[dir="rtl"]._2bvsb3ubApyZ0UGoQA9O9T{text-align:right}div[dir="rtl"] ._2bvsb3ubApyZ0UGoQA9O9T{left:auto;right:0}.AFsJE948muYyzCMktdzuk{position:relative;top:8%;margin-bottom:40px;margin-left:auto;margin-right:auto;box-sizing:border-box;width:640px;background-color:#fff;border:1px solid #0067B8}._3kWyBRbW_dgnMiEyx06Fu4{float:right;z-index:1;margin:2px;padding:12px;border:none;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:13px;line-height:13px;display:flex;align-items:center;text-align:center;color:#666;background-color:#fff}div[dir="rtl"] ._3kWyBRbW_dgnMiEyx06Fu4{margin:2px;padding:12px;float:left}.uCYvKvHXrhjNgflv1VqdD{position:static;margin-top:36px;margin-left:36px;margin-right:36px}._17pX1m9O_W--iZbDt3Ta5r{margin-top:0;margin-bottom:12px;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:600;font-size:20px;line-height:24px;text-transform:none}._1kBkHQ1V1wu3kl-YcLgUr6{height:446px;overflow:auto}._20_nXDf6uFs9Q6wxRXG-I-{margin-top:0;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px}._20_nXDf6uFs9Q6wxRXG-I- a{text-decoration:underline}dl._2a0NH_GDQEQe5Ynfo7suVH{margin-top:36px;margin-bottom:0;padding:0;list-style:none;text-transform:none}dt._3j_LCPv7fyXv3A8FIXVwZ4{margin-top:20px;float:none;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:600;font-size:18px;line-height:24px;list-style:none}.k-vxTGFbdq1aOZB2HHpjh{margin:0;padding:0;border:none}._2Bucyy75c_ogoU1g-liB5R{margin:0;padding:0;border-bottom:none;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:600;font-size:18px;line-height:24px;text-transform:none}._63gwfzV8dclrsl2cfd90r{display:inline-block;margin-top:0;margin-bottom:13px;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px}._1l8wM_4mRYGz3Iu7l3BZR7{display:block}._2UE03QS02aZGkslegN_F-i{display:inline-block;position:relative;left:5px;margin-bottom:13px;margin-right:34px;padding:3px}div[dir="rtl"] ._2UE03QS02aZGkslegN_F-i{margin:0 0 13px 34px;padding:3px;float:none}div[dir="rtl"] ._2UE03QS02aZGkslegN_F-i{left:auto;right:5px}._23tra1HsiiP6cT-Cka-ycB *::before,._2bvsb3ubApyZ0UGoQA9O9T *::before,._23tra1HsiiP6cT-Cka-ycB *::after,._2bvsb3ubApyZ0UGoQA9O9T *::after{box-sizing:inherit}._1HSFn0HzGo6w4ADApV8-c4{outline:2px solid rgba(0,0,0,0.8)}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2{display:inline-block;position:relative;margin-top:0;margin-left:0;margin-right:0;height:0;width:0;border-radius:0;cursor:pointer;outline:none;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2+label::before{display:block;position:absolute;top:5px;left:3px;height:19px;width:19px;content:"";border-radius:50%;border:1px solid #000;background-color:#fff}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2+label::before{left:auto;right:3px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:hover::before{border:1px solid #0067B8}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:hover::after{display:block;position:absolute;top:10px;left:8px;height:9px;width:9px;content:"";border-radius:50%;background-color:rgba(0,0,0,0.8)}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:hover::after{left:auto;right:8px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:focus::before{border:1px solid #0067B8}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:focus::after{display:block;position:absolute;top:10px;left:8px;height:9px;width:9px;content:"";border-radius:50%;background-color:#000}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:focus::after{left:auto;right:8px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:checked+label::after{display:block;position:absolute;top:10px;left:8px;height:9px;width:9px;content:"";border-radius:50%;background-color:#000}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:checked+label::after{left:auto;right:8px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:disabled+label{cursor:not-allowed}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:disabled+label::before{border:1px solid rgba(0,0,0,0.2);background-color:rgba(0,0,0,0.2)}._3RJzeL3l9Rl_lAQEm6VwdX{display:block;position:static;float:right;margin-top:0;margin-bottom:0;margin-left:19px;margin-right:0;padding-top:0;padding-bottom:0;padding-left:8px;padding-right:0;width:80%;width:calc(100% - 19px);font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-transform:none;cursor:pointer;box-sizing:border-box}div[dir="rtl"] ._3RJzeL3l9Rl_lAQEm6VwdX{margin:0 19px 0 0;padding:0 8px 0 0;float:left}.nohp3sIG12ZBhzcMnPala{margin-top:20px;margin-bottom:48px}._2uhaEsmeotZ3P-M0AXo2kF{padding:0;width:278px;height:36px;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-align:center}._2uhaEsmeotZ3P-M0AXo2kF:focus{box-sizing:border-box}._2uhaEsmeotZ3P-M0AXo2kF:disabled{cursor:not-allowed}._3tOu1FJ59c_xz_PmI1lKV5{float:right;padding:0;width:278px;height:36px;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-align:center}._3tOu1FJ59c_xz_PmI1lKV5:focus{box-sizing:border-box}._3tOu1FJ59c_xz_PmI1lKV5:disabled{cursor:not-allowed}div[dir="rtl"] ._3tOu1FJ59c_xz_PmI1lKV5{margin:0;padding:0;float:left}@media only screen and (max-width: 768px){._2j0fmugLb1FgYz6KPuB91w,._1Upc2NjY8AlDn177YoVj0y{padding-top:8px;padding-bottom:12px;padding-left:3.75%;padding-right:3.75%;margin:0;width:92.5%}._23tra1HsiiP6cT-Cka-ycB{display:block}._1XuCi2WhiqeWRUVp3pnFG3{margin-bottom:8px;margin-left:0;margin-right:0;width:100%}._2bvsb3ubApyZ0UGoQA9O9T{overflow:hidden}.AFsJE948muYyzCMktdzuk{top:1.8%;width:93.33%;height:96.4%;overflow:hidden}.uCYvKvHXrhjNgflv1VqdD{margin-top:24px;margin-left:24px;margin-right:24px;height:100%}._1kBkHQ1V1wu3kl-YcLgUr6{height:62%;height:calc(100% - 188px);min-height:50%}._2uhaEsmeotZ3P-M0AXo2kF{width:100%}._3tOu1FJ59c_xz_PmI1lKV5{margin-bottom:12px;margin-left:0;width:100%}div[dir="rtl"] ._3tOu1FJ59c_xz_PmI1lKV5{margin:0 0 12px 0;padding:0;float:none}}@media only screen and (max-width: 768px) and (orientation: landscape), only screen and (max-height: 260px), only screen and (max-width: 340px){.AFsJE948muYyzCMktdzuk{overflow:auto}}@media only screen and (max-height: 260px), only screen and (max-width: 340px){._1XuCi2WhiqeWRUVp3pnFG3{min-width:0}._3kWyBRbW_dgnMiEyx06Fu4{padding:3%}.uCYvKvHXrhjNgflv1VqdD{margin-top:3%;margin-left:3%;margin-right:3%}._17pX1m9O_W--iZbDt3Ta5r{margin-bottom:3%}._1kBkHQ1V1wu3kl-YcLgUr6{height:calc(79% - 64px)}.nohp3sIG12ZBhzcMnPala{margin-top:5%;margin-bottom:10%}._3tOu1FJ59c_xz_PmI1lKV5{margin-bottom:3%}div[dir="rtl"] ._3tOu1FJ59c_xz_PmI1lKV5{margin:0 0 3% 0;padding:0;float:none}}
</style><style type="text/css" id="ms-consent-banner-theme-styles">._23tra1HsiiP6cT-Cka-ycB {
background-color: #F2F2F2 !important;
}.w8hcgFksdo30C8w-bygqu {
color: #000000 !important;
}.ydkKdaztSS0AeHWIeIHsQ a {
color: #0067B8 !important;
}._2bvsb3ubApyZ0UGoQA9O9T {
background-color: rgba(255, 255, 255, 0.6) !important;
}.AFsJE948muYyzCMktdzuk {
background-color: #FFFFFF !important;
border: 1px solid #0067B8 !important;
}._3kWyBRbW_dgnMiEyx06Fu4 {
color: #666666 !important;
background-color: #FFFFFF !important;
}._1zNQOqxpBFSokeCLGi_hGr {
border: none !important;
background-color: #0067B8 !important;
color: #FFFFFF !important;
}._1zNQOqxpBFSokeCLGi_hGr:enabled:hover {
color: #FFFFFF !important;
background-color: #0067B8 !important;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25) !important;
border: none !important;
}._1zNQOqxpBFSokeCLGi_hGr:enabled:focus {
background-color: #0067B8 !important;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25) !important;
border: 2px solid #000000 !important;
}._1zNQOqxpBFSokeCLGi_hGr:disabled {
opacity: 1 !important;
color: rgba(0, 0, 0, 0.2) !important;
background-color: rgba(0, 120, 215, 0.2) !important;
border: none !important;
}.erL690_8JwUW-R4bJRcfl {
border: none !important;
background-color: #EBEBEB !important;
color: #000000 !important;
}.erL690_8JwUW-R4bJRcfl:enabled:hover {
color: #000000 !important;
background-color: #DBDBDB !important;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25) !important;
border: none !important;
}.erL690_8JwUW-R4bJRcfl:enabled:focus {
background-color: #DBDBDB !important;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25) !important;
border: 2px solid #000000 !important;
}.erL690_8JwUW-R4bJRcfl:disabled {
opacity: 1 !important;
color: rgba(0, 0, 0, 0.2) !important;
background-color: rgba(0, 0, 0, 0.2) !important;
border: none !important;
}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2 + label::before {
border: 1px solid #000000 !important;
background-color: #FFFFFF !important;
}._1HSFn0HzGo6w4ADApV8-c4 {
outline: 2px solid rgba(0, 0, 0, 0.8) !important;
}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:checked + label::after {
background-color: #000000 !important;
}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2 + label:hover::before {
border: 1px solid #0067B8 !important;
}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2 + label:hover::after {
background-color: rgba(0, 0, 0, 0.8) !important;
}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2 + label:focus::before {
border: 1px solid #0067B8 !important;
}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2 + label:focus::after {
background-color: #000000 !important;
}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:disabled + label::before {
border: 1px solid rgba(0, 0, 0, 0.2) !important;
background-color: rgba(0, 0, 0, 0.2) !important;
}</style><script src="https://devblogs.microsoft.com/visualstudio/wp-includes/js/wp-emoji-release.min.js" defer=""></script><script type="application/ld+json">{"@context":"https://schema.org/","@type":"BreadcrumbList","itemListElement":[{"position":1,"name":"Dev Blogs","item":"https://devblogs.microsoft.com/","@type":"ListItem"},{"position":2,"name":"Visual Studio Blog","item":"https://devblogs.microsoft.com/visualstudio/","@type":"ListItem"}]}</script><style id="ms-consent-banner-main-styles">.w8hcgFksdo30C8w-bygqu{color:#000}.ydkKdaztSS0AeHWIeIHsQ a{color:#0067B8}.erL690_8JwUW-R4bJRcfl{background-color:#EBEBEB;border:none;color:#000}.erL690_8JwUW-R4bJRcfl:enabled:hover{color:#000;background-color:#DBDBDB;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:none}.erL690_8JwUW-R4bJRcfl:enabled:focus{background-color:#DBDBDB;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:2px solid #000}.erL690_8JwUW-R4bJRcfl:disabled{opacity:1;color:rgba(0,0,0,0.2);background-color:rgba(0,0,0,0.2);border:none}._1zNQOqxpBFSokeCLGi_hGr{border:none;background-color:#0067B8;color:#fff}._1zNQOqxpBFSokeCLGi_hGr:enabled:hover{color:#fff;background-color:#0067B8;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:none}._1zNQOqxpBFSokeCLGi_hGr:enabled:focus{background-color:#0067B8;box-shadow:0px 4px 10px rgba(0,0,0,0.25);border:2px solid #000}._1zNQOqxpBFSokeCLGi_hGr:disabled{opacity:1;color:rgba(0,0,0,0.2);background-color:rgba(0,120,215,0.2);border:none}._23tra1HsiiP6cT-Cka-ycB{position:relative;display:flex;z-index:9999;width:100%;background-color:#F2F2F2;justify-content:space-between;text-align:left}div[dir="rtl"]._23tra1HsiiP6cT-Cka-ycB{text-align:right}._1Upc2NjY8AlDn177YoVj0y{margin:0;padding-left:5%;padding-top:8px;padding-bottom:8px}div[dir="rtl"] ._1Upc2NjY8AlDn177YoVj0y{margin:0;padding:8px 5% 8px 0;float:none}._23tra1HsiiP6cT-Cka-ycB svg{fill:none;max-width:none;max-height:none}._1V_hlU-7jdtPiooHMu89BB{display:table-cell;padding:12px;width:24px;height:24px;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:24px;line-height:0}.f6QKJD7fhSbnJLarTL-W-{display:table-cell;vertical-align:middle;padding:0;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:13px;line-height:16px}.f6QKJD7fhSbnJLarTL-W- a{text-decoration:underline}._2j0fmugLb1FgYz6KPuB91w{display:inline-block;margin-left:5%;margin-right:5%;min-width:40%;min-width:calc((150px + 3 * 4px) * 2 + 150px);min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;align-self:center;position:relative}._1XuCi2WhiqeWRUVp3pnFG3{margin:4px;padding:5px;min-width:150px;min-height:36px;vertical-align:top;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-align:center}._1XuCi2WhiqeWRUVp3pnFG3:focus{box-sizing:border-box}._1XuCi2WhiqeWRUVp3pnFG3:disabled{cursor:not-allowed}._2bvsb3ubApyZ0UGoQA9O9T{display:block;position:fixed;z-index:10000;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.6);overflow:auto;text-align:left}div[dir="rtl"]._2bvsb3ubApyZ0UGoQA9O9T{text-align:right}div[dir="rtl"] ._2bvsb3ubApyZ0UGoQA9O9T{left:auto;right:0}.AFsJE948muYyzCMktdzuk{position:relative;top:8%;margin-bottom:40px;margin-left:auto;margin-right:auto;box-sizing:border-box;width:640px;background-color:#fff;border:1px solid #0067B8}._3kWyBRbW_dgnMiEyx06Fu4{float:right;z-index:1;margin:2px;padding:12px;border:none;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:13px;line-height:13px;display:flex;align-items:center;text-align:center;color:#666;background-color:#fff}div[dir="rtl"] ._3kWyBRbW_dgnMiEyx06Fu4{margin:2px;padding:12px;float:left}.uCYvKvHXrhjNgflv1VqdD{position:static;margin-top:36px;margin-left:36px;margin-right:36px}._17pX1m9O_W--iZbDt3Ta5r{margin-top:0;margin-bottom:12px;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:600;font-size:20px;line-height:24px;text-transform:none}._1kBkHQ1V1wu3kl-YcLgUr6{height:446px;overflow:auto}._20_nXDf6uFs9Q6wxRXG-I-{margin-top:0;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px}._20_nXDf6uFs9Q6wxRXG-I- a{text-decoration:underline}dl._2a0NH_GDQEQe5Ynfo7suVH{margin-top:36px;margin-bottom:0;padding:0;list-style:none;text-transform:none}dt._3j_LCPv7fyXv3A8FIXVwZ4{margin-top:20px;float:none;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:600;font-size:18px;line-height:24px;list-style:none}.k-vxTGFbdq1aOZB2HHpjh{margin:0;padding:0;border:none}._2Bucyy75c_ogoU1g-liB5R{margin:0;padding:0;border-bottom:none;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:600;font-size:18px;line-height:24px;text-transform:none}._63gwfzV8dclrsl2cfd90r{display:inline-block;margin-top:0;margin-bottom:13px;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px}._1l8wM_4mRYGz3Iu7l3BZR7{display:block}._2UE03QS02aZGkslegN_F-i{display:inline-block;position:relative;left:5px;margin-bottom:13px;margin-right:34px;padding:3px}div[dir="rtl"] ._2UE03QS02aZGkslegN_F-i{margin:0 0 13px 34px;padding:3px;float:none}div[dir="rtl"] ._2UE03QS02aZGkslegN_F-i{left:auto;right:5px}._23tra1HsiiP6cT-Cka-ycB *::before,._2bvsb3ubApyZ0UGoQA9O9T *::before,._23tra1HsiiP6cT-Cka-ycB *::after,._2bvsb3ubApyZ0UGoQA9O9T *::after{box-sizing:inherit}._1HSFn0HzGo6w4ADApV8-c4{outline:2px solid rgba(0,0,0,0.8)}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2{display:inline-block;position:relative;margin-top:0;margin-left:0;margin-right:0;height:0;width:0;border-radius:0;cursor:pointer;outline:none;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2+label::before{display:block;position:absolute;top:5px;left:3px;height:19px;width:19px;content:"";border-radius:50%;border:1px solid #000;background-color:#fff}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2+label::before{left:auto;right:3px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:hover::before{border:1px solid #0067B8}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:hover::after{display:block;position:absolute;top:10px;left:8px;height:9px;width:9px;content:"";border-radius:50%;background-color:rgba(0,0,0,0.8)}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:hover::after{left:auto;right:8px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:focus::before{border:1px solid #0067B8}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:focus::after{display:block;position:absolute;top:10px;left:8px;height:9px;width:9px;content:"";border-radius:50%;background-color:#000}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:not(:disabled)+label:focus::after{left:auto;right:8px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:checked+label::after{display:block;position:absolute;top:10px;left:8px;height:9px;width:9px;content:"";border-radius:50%;background-color:#000}div[dir="rtl"] input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:checked+label::after{left:auto;right:8px}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:disabled+label{cursor:not-allowed}input[type="radio"]._1dp8Vp5m3HwAqGx8qBmFV2:disabled+label::before{border:1px solid rgba(0,0,0,0.2);background-color:rgba(0,0,0,0.2)}._3RJzeL3l9Rl_lAQEm6VwdX{display:block;position:static;float:right;margin-top:0;margin-bottom:0;margin-left:19px;margin-right:0;padding-top:0;padding-bottom:0;padding-left:8px;padding-right:0;width:80%;width:calc(100% - 19px);font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-transform:none;cursor:pointer;box-sizing:border-box}div[dir="rtl"] ._3RJzeL3l9Rl_lAQEm6VwdX{margin:0 19px 0 0;padding:0 8px 0 0;float:left}.nohp3sIG12ZBhzcMnPala{margin-top:20px;margin-bottom:48px}._2uhaEsmeotZ3P-M0AXo2kF{padding:0;width:278px;height:36px;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-align:center}._2uhaEsmeotZ3P-M0AXo2kF:focus{box-sizing:border-box}._2uhaEsmeotZ3P-M0AXo2kF:disabled{cursor:not-allowed}._3tOu1FJ59c_xz_PmI1lKV5{float:right;padding:0;width:278px;height:36px;cursor:pointer;font-family:Segoe UI, SegoeUI, Arial, sans-serif;font-style:normal;font-weight:normal;font-size:15px;line-height:20px;text-align:center}._3tOu1FJ59c_xz_PmI1lKV5:focus{box-sizing:border-box}._3tOu1FJ59c_xz_PmI1lKV5:disabled{cursor:not-allowed}div[dir="rtl"] ._3tOu1FJ59c_xz_PmI1lKV5{margin:0;padding:0;float:left}@media only screen and (max-width: 768px){._2j0fmugLb1FgYz6KPuB91w,._1Upc2NjY8AlDn177YoVj0y{padding-top:8px;padding-bottom:12px;padding-left:3.75%;padding-right:3.75%;margin:0;width:92.5%}._23tra1HsiiP6cT-Cka-ycB{display:block}._1XuCi2WhiqeWRUVp3pnFG3{margin-bottom:8px;margin-left:0;margin-right:0;width:100%}._2bvsb3ubApyZ0UGoQA9O9T{overflow:hidden}.AFsJE948muYyzCMktdzuk{top:1.8%;width:93.33%;height:96.4%;overflow:hidden}.uCYvKvHXrhjNgflv1VqdD{margin-top:24px;margin-left:24px;margin-right:24px;height:100%}._1kBkHQ1V1wu3kl-YcLgUr6{height:62%;height:calc(100% - 188px);min-height:50%}._2uhaEsmeotZ3P-M0AXo2kF{width:100%}._3tOu1FJ59c_xz_PmI1lKV5{margin-bottom:12px;margin-left:0;width:100%}div[dir="rtl"] ._3tOu1FJ59c_xz_PmI1lKV5{margin:0 0 12px 0;padding:0;float:none}}@media only screen and (max-width: 768px) and (orientation: landscape), only screen and (max-height: 260px), only screen and (max-width: 340px){.AFsJE948muYyzCMktdzuk{overflow:auto}}@media only screen and (max-height: 260px), only screen and (max-width: 340px){._1XuCi2WhiqeWRUVp3pnFG3{min-width:0}._3kWyBRbW_dgnMiEyx06Fu4{padding:3%}.uCYvKvHXrhjNgflv1VqdD{margin-top:3%;margin-left:3%;margin-right:3%}._17pX1m9O_W--iZbDt3Ta5r{margin-bottom:3%}._1kBkHQ1V1wu3kl-YcLgUr6{height:calc(79% - 64px)}.nohp3sIG12ZBhzcMnPala{margin-top:5%;margin-bottom:10%}._3tOu1FJ59c_xz_PmI1lKV5{margin-bottom:3%}div[dir="rtl"] ._3tOu1FJ59c_xz_PmI1lKV5{margin:0 0 3% 0;padding:0;float:none}}
</style><style type="text/css" id="ms-consent-banner-theme-styles"></style><style type="text/css" id="ms-consent-banner-theme-styles"></style><style type="text/css" nonce="" media="print">.usabilla_live_button_container { display: none; }</style><style type="text/css" nonce="">iframe.usabilla-live-button#usabilla_live_button_container_iframe602277652{width:40px;height:130px;margin: 0;padding: 0;border: 0;overflow: hidden;z-index: 9998;position: absolute;left: 0;top: 0;box-shadow: 0 0 0;background-color: transparent;}</style></head>
<body class="home blog wp-featherlight-captions" style="visibility: visible; opacity: 1;"><div style="display: none;" id="lightningjs-usabilla_live"><div><iframe frameborder="0" id="lightningjs-frame-usabilla_live"></iframe></div></div>
<!-- Star cookies banner -->
<script src="https://wcpstatic.microsoft.com/mscc/lib/v2/wcp-consent.js"></script>
<div id="cookie-banner"><div id="wcpConsentBannerCtrl" class="_23tra1HsiiP6cT-Cka-ycB" dir="ltr" role="alert">
<div class="_1Upc2NjY8AlDn177YoVj0y">
<span class="_1V_hlU-7jdtPiooHMu89BB w8hcgFksdo30C8w-bygqu">
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 44 44" width="24px" height="24px" fill="none" stroke="currentColor">
<circle cx="22" cy="22" r="20" stroke-width="2"></circle>
<line x1="22" x2="22" y1="18" y2="33" stroke-width="3"></line>
<line x1="22" x2="22" y1="12" y2="15" stroke-width="3"></line>
</svg>
</span> <!-- used for icon -->
<p class="f6QKJD7fhSbnJLarTL-W- ydkKdaztSS0AeHWIeIHsQ w8hcgFksdo30C8w-bygqu">
We use optional cookies to improve your experience on our websites, such as through social media connections, and to display personalized advertising based on your online activity. If you reject optional cookies, only cookies necessary to provide you the services will be used. You may change your selection by clicking “Manage Cookies” at the bottom of the page. <a target="_blank" href="https://go.microsoft.com/fwlink/?LinkId=521839">Privacy Statement</a> <a target="_blank" href="https://aka.ms/3rdpartycookies">Third-Party Cookies</a>
</p>
</div>
<div class="_2j0fmugLb1FgYz6KPuB91w">
<button type="button" class="_1XuCi2WhiqeWRUVp3pnFG3 erL690_8JwUW-R4bJRcfl">Accept</button>
<button type="button" class="_1XuCi2WhiqeWRUVp3pnFG3 erL690_8JwUW-R4bJRcfl">Reject</button>
<button type="button" class="_1XuCi2WhiqeWRUVp3pnFG3 erL690_8JwUW-R4bJRcfl">Manage cookies</button>
</div>
</div></div>
<script>
let userConsentDetailsCallback = function () {
return siteConsent ? siteConsent.getConsent() : null
};
awa.sku.config.extensionConfig.SystemPropertiesCollector.callback.userConsentDetails = userConsentDetailsCallback
awa.sku.config.extensionConfig.SystemPropertiesCollector.userConsented = false;
var is_post = '';
function changeAnalyticsCookies() {
//have Analytics consent
if (siteConsent.getConsentFor(WcpConsent.consentCategories.Analytics)) {
//set consent
var date = new Date();
date.setTime(date.getTime() + (180 * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
if (window.clarity) {
window.clarity('consent');
}
} else if (siteConsent.isConsentRequired === false) {
// Consent is not required
if (window.clarity) {
window.clarity('consent');
}
} else {
document.cookie = name + '=_gat; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
document.cookie = name + '=_gid; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
document.cookie = name + '=_ga; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
document.cookie = name + '=simaCookie; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
}
window.WcpConsent && WcpConsent.init("en-US", "cookie-banner", function (err, _siteConsent) {
if (!err) {
siteConsent = _siteConsent; //siteConsent is used to get the current consent
} else {
//console.log("Error initializing WcpConsent: "+ err);
}
}, onConsentChanged, WcpConsent.themes.light);
changeAnalyticsCookies();
function onConsentChanged(categoryPreferences) {
changeAnalyticsCookies();
}
</script>
<!-- end cookies banner -->
<!-- UHF header -->
<div id="headerArea" class="uhf" data-m="{"cN":"headerArea","cT":"Area_coreuiArea","id":"a1Body","sN":1,"aN":"Body"}">
<div id="headerRegion" data-region-key="headerregion" data-m="{"cN":"headerRegion","cT":"Region_coreui-region","id":"r1a1","sN":1,"aN":"a1"}">
<div id="headerUniversalHeader" data-m="{"cN":"headerUniversalHeader","cT":"Module_coreui-universalheader","id":"m1r1a1","sN":1,"aN":"r1a1"}" data-module-id="Category|headerRegion|coreui-region|headerUniversalHeader|coreui-universalheader">
<div data-m="{"cN":"cookiebanner_cont","cT":"Container","id":"c1m1r1a1","sN":1,"aN":"m1r1a1"}">
<div id="uhfCookieAlert" data-locale="en-us">
<div id="msccBannerV2"></div>
</div>
</div>
<a id="uhfSkipToMain" class="m-skip-to-main" href="javascript:void(0)" data-href="#mainContent" tabindex="0" data-m="{"cN":"Skip to content_nonnav","id":"nn2m1r1a1","sN":2,"aN":"m1r1a1"}">Skip to main content</a>
<header class="c-uhfh context-uhf no-js c-sgl-stck c-category-header " itemscope="itemscope" data-header-footprint="/DEV_Blogs/DEV_header-landing, fromService: True" data-magict="true" itemtype="http://schema.org/Organization">
<div class="theme-light js-global-head f-closed global-head-cont" data-m="{"cN":"Universal Header_cont","cT":"Container","id":"c3m1r1a1","sN":3,"aN":"m1r1a1"}">
<div class="c-uhfh-gcontainer-st">
<button type="button" class="c-action-trigger c-glyph glyph-global-nav-button" aria-label="All Microsoft expand to see list of Microsoft products and services" initialstate-label="All Microsoft expand to see list of Microsoft products and services" togglestate-label="Close All Microsoft list" aria-expanded="false" data-m="{"cN":"Mobile menu button_nonnav","id":"nn1c3m1r1a1","sN":1,"aN":"c3m1r1a1"}"></button>
<button type="button" class="c-action-trigger c-glyph glyph-arrow-htmllegacy c-close-search" aria-label="Close search" aria-expanded="false" data-m="{"cN":"Close Search_nonnav","id":"nn2c3m1r1a1","sN":2,"aN":"c3m1r1a1"}"></button>
<a id="uhfLogo" class="c-logo c-sgl-stk-uhfLogo" itemprop="url" href="https://www.microsoft.com" aria-label="Microsoft" data-m="{"cN":"GlobalNav_Logo_cont","cT":"Container","id":"c3c3m1r1a1","sN":3,"aN":"c3m1r1a1"}" target="_blank">
<img alt="" itemprop="logo" class="c-image" src="https://cdn-dynmedia-1.microsoft.com/is/image/microsoftcorp/UHFbanner-MSlogo?fmt=png-alpha&bfc=off&qlt=100,1" role="presentation" aria-hidden="true">
<span itemprop="name" role="presentation" aria-hidden="true">Microsoft</span>
</a>
<div class="f-mobile-title">
<button type="button" class="c-action-trigger c-glyph glyph-chevron-left" aria-label="See more menu options" data-m="{"cN":"Mobile back button_nonnav","id":"nn4c3m1r1a1","sN":4,"aN":"c3m1r1a1"}"></button>
<span data-global-title="Microsoft home" class="js-mobile-title">Dev Blogs</span>
<button type="button" class="c-action-trigger c-glyph glyph-chevron-right" aria-label="See more menu options" data-m="{"cN":"Mobile forward button_nonnav","id":"nn5c3m1r1a1","sN":5,"aN":"c3m1r1a1"}"></button>
</div>
<div class="c-show-pipe x-hidden-vp-mobile-st">
<a id="uhfCatLogo" class="c-logo c-cat-logo" href="/" aria-label="Dev Blogs" itemprop="url" data-m="{"cN":"CatNav_Dev Blogs_nav","id":"n6c3m1r1a1","sN":6,"aN":"c3m1r1a1"}">
<span>Dev Blogs</span>
</a>
</div>
<div class="cat-logo-button-cont x-hidden">
<button type="button" id="uhfCatLogoButton" class="c-cat-logo-button x-hidden" aria-expanded="false" aria-label="Dev Blogs" data-m="{"cN":"Dev Blogs_nonnav","id":"nn7c3m1r1a1","sN":7,"aN":"c3m1r1a1"}">
Dev Blogs
</button>
</div>
<nav id="uhf-g-nav" aria-label="Contextual menu" class="c-uhfh-gnav" data-m="{"cN":"Category nav_cont","cT":"Container","id":"c8c3m1r1a1","sN":8,"aN":"c3m1r1a1"}">
<ul class="js-paddle-items">
<li class="single-link js-nav-menu x-hidden-none-mobile-vp uhf-menu-item">
<a class="c-uhf-nav-link" href="/" data-m="{"cN":"CatNav_Home_nav","id":"n1c8c3m1r1a1","sN":1,"aN":"c8c3m1r1a1"}"> Home </a>
</li>
<li class="nested-menu uhf-menu-item">
<div class="c-uhf-menu js-nav-menu">
<button type="button" id="Developer" aria-expanded="false" data-m="{"cN":"CatNav_Developer_nonnav","id":"nn2c8c3m1r1a1","sN":2,"aN":"c8c3m1r1a1"}">Developer</button>
<ul class="" data-class-idn="" aria-hidden="true" data-m="{"cN":"Developer_cont","cT":"Container","id":"c3c8c3m1r1a1","sN":3,"aN":"c8c3m1r1a1"}">
<li class="js-nav-menu single-link" data-m="{"cN":"Microsoft for Developers_cont","cT":"Container","id":"c1c3c8c3m1r1a1","sN":1,"aN":"c3c8c3m1r1a1"}">
<a id="microsoft-for-developers" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/blog" data-m="{"cN":"CatNav_Microsoft for Developers_nav","id":"n1c1c3c8c3m1r1a1","sN":1,"aN":"c1c3c8c3m1r1a1"}">Microsoft for Developers</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Visual Studio_cont","cT":"Container","id":"c2c3c8c3m1r1a1","sN":2,"aN":"c3c8c3m1r1a1"}">
<a id="visual-studio" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/visualstudio/" data-m="{"cN":"CatNav_Visual Studio_nav","id":"n1c2c3c8c3m1r1a1","sN":1,"aN":"c2c3c8c3m1r1a1"}">Visual Studio</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Visual Studio Code_cont","cT":"Container","id":"c3c3c8c3m1r1a1","sN":3,"aN":"c3c8c3m1r1a1"}">
<a id="visual-studio-code" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/vscode-blog" data-m="{"cN":"CatNav_Visual Studio Code_nav","id":"n1c3c3c8c3m1r1a1","sN":1,"aN":"c3c3c8c3m1r1a1"}">Visual Studio Code</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Develop from the cloud_cont","cT":"Container","id":"c4c3c8c3m1r1a1","sN":4,"aN":"c3c8c3m1r1a1"}">
<a id="c-shellmenu_5" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/develop-from-the-cloud/" data-m="{"cN":"CatNav_Develop from the cloud_nav","id":"n1c4c3c8c3m1r1a1","sN":1,"aN":"c4c3c8c3m1r1a1"}">Develop from the cloud</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Visual Studio for Mac_cont","cT":"Container","id":"c5c3c8c3m1r1a1","sN":5,"aN":"c3c8c3m1r1a1"}">
<a id="visual-studio-for-mac" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/visualstudio/tag/visual-studio-for-mac/" data-m="{"cN":"CatNav_Visual Studio for Mac_nav","id":"n1c5c3c8c3m1r1a1","sN":1,"aN":"c5c3c8c3m1r1a1"}">Visual Studio for Mac</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"All things Azure_cont","cT":"Container","id":"c6c3c8c3m1r1a1","sN":6,"aN":"c3c8c3m1r1a1"}">
<a id="all-things-azure-1" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/all-things-azure/" data-m="{"cN":"CatNav_All things Azure_nav","id":"n1c6c3c8c3m1r1a1","sN":1,"aN":"c6c3c8c3m1r1a1"}">All things Azure</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"DevOps_cont","cT":"Container","id":"c7c3c8c3m1r1a1","sN":7,"aN":"c3c8c3m1r1a1"}">
<a id="devops" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/devops/" data-m="{"cN":"CatNav_DevOps_nav","id":"n1c7c3c8c3m1r1a1","sN":1,"aN":"c7c3c8c3m1r1a1"}">DevOps</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Windows Developer_cont","cT":"Container","id":"c8c3c8c3m1r1a1","sN":8,"aN":"c3c8c3m1r1a1"}">
<a id="windows-developer" class="js-subm-uhf-nav-link" href="https://blogs.windows.com/windowsdeveloper/" data-m="{"cN":"CatNav_Windows Developer_nav","id":"n1c8c3c8c3m1r1a1","sN":1,"aN":"c8c3c8c3m1r1a1"}" target="_blank">Windows Developer</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Developer support_cont","cT":"Container","id":"c9c3c8c3m1r1a1","sN":9,"aN":"c3c8c3m1r1a1"}">
<a id="developer-support" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/premier-developer/" data-m="{"cN":"CatNav_Developer support_nav","id":"n1c9c3c8c3m1r1a1","sN":1,"aN":"c9c3c8c3m1r1a1"}">Developer support</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"ISE Developer_cont","cT":"Container","id":"c10c3c8c3m1r1a1","sN":10,"aN":"c3c8c3m1r1a1"}">
<a id="ise-developer" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/ise/" data-m="{"cN":"CatNav_ISE Developer_nav","id":"n1c10c3c8c3m1r1a1","sN":1,"aN":"c10c3c8c3m1r1a1"}">ISE Developer</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Engineering@Microsoft_cont","cT":"Container","id":"c11c3c8c3m1r1a1","sN":11,"aN":"c3c8c3m1r1a1"}">
<a id="engineering-microsoft" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/engineering-at-microsoft/" data-m="{"cN":"CatNav_Engineering@Microsoft_nav","id":"n1c11c3c8c3m1r1a1","sN":1,"aN":"c11c3c8c3m1r1a1"}">Engineering@Microsoft</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Azure SDK_cont","cT":"Container","id":"c12c3c8c3m1r1a1","sN":12,"aN":"c3c8c3m1r1a1"}">
<a id="Azure-sdk" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/azure-sdk/" data-m="{"cN":"CatNav_Azure SDK_nav","id":"n1c12c3c8c3m1r1a1","sN":1,"aN":"c12c3c8c3m1r1a1"}">Azure SDK</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Command Line_cont","cT":"Container","id":"c13c3c8c3m1r1a1","sN":13,"aN":"c3c8c3m1r1a1"}">
<a id="command-line" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/commandline/" data-m="{"cN":"CatNav_Command Line_nav","id":"n1c13c3c8c3m1r1a1","sN":1,"aN":"c13c3c8c3m1r1a1"}">Command Line</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Perf and Diagnostics_cont","cT":"Container","id":"c14c3c8c3m1r1a1","sN":14,"aN":"c3c8c3m1r1a1"}">
<a id="perf-and-diagnostics" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/performance-diagnostics/" data-m="{"cN":"CatNav_Perf and Diagnostics_nav","id":"n1c14c3c8c3m1r1a1","sN":1,"aN":"c14c3c8c3m1r1a1"}">Perf and Diagnostics</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"React Native_cont","cT":"Container","id":"c15c3c8c3m1r1a1","sN":15,"aN":"c3c8c3m1r1a1"}">
<a id="react-native" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/react-native/" data-m="{"cN":"CatNav_React Native_nav","id":"n1c15c3c8c3m1r1a1","sN":1,"aN":"c15c3c8c3m1r1a1"}">React Native</a>
</li>
</ul>
</div>
</li> <li class="nested-menu uhf-menu-item">
<div class="c-uhf-menu js-nav-menu">
<button type="button" id="Technology-main" aria-expanded="false" data-m="{"cN":"CatNav_Technology_nonnav","id":"nn4c8c3m1r1a1","sN":4,"aN":"c8c3m1r1a1"}">Technology</button>
<ul class="" data-class-idn="" aria-hidden="true" data-m="{"cN":"Technology_cont","cT":"Container","id":"c5c8c3m1r1a1","sN":5,"aN":"c8c3m1r1a1"}">
<li class="js-nav-menu single-link" data-m="{"cN":"AutoGen_cont","cT":"Container","id":"c1c5c8c3m1r1a1","sN":1,"aN":"c5c8c3m1r1a1"}">
<a id="AutoGen" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/autogen/" data-m="{"cN":"CatNav_AutoGen_nav","id":"n1c1c5c8c3m1r1a1","sN":1,"aN":"c1c5c8c3m1r1a1"}">AutoGen</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"DirectX_cont","cT":"Container","id":"c2c5c8c3m1r1a1","sN":2,"aN":"c5c8c3m1r1a1"}">
<a id="DirectX" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/directx/" data-m="{"cN":"CatNav_DirectX_nav","id":"n1c2c5c8c3m1r1a1","sN":1,"aN":"c2c5c8c3m1r1a1"}">DirectX</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"OpenAPI_cont","cT":"Container","id":"c3c5c8c3m1r1a1","sN":3,"aN":"c5c8c3m1r1a1"}">
<a id="Openapi" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/openapi/" data-m="{"cN":"CatNav_OpenAPI_nav","id":"n1c3c5c8c3m1r1a1","sN":1,"aN":"c3c5c8c3m1r1a1"}">OpenAPI</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Semantic Kernel_cont","cT":"Container","id":"c4c5c8c3m1r1a1","sN":4,"aN":"c5c8c3m1r1a1"}">
<a id="semantic-kernel" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/semantic-kernel/" data-m="{"cN":"CatNav_Semantic Kernel_nav","id":"n1c4c5c8c3m1r1a1","sN":1,"aN":"c4c5c8c3m1r1a1"}">Semantic Kernel</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"SurfaceDuo_cont","cT":"Container","id":"c5c5c8c3m1r1a1","sN":5,"aN":"c5c8c3m1r1a1"}">
<a id="SurfaceDuo" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/surface-duo/" data-m="{"cN":"CatNav_SurfaceDuo_nav","id":"n1c5c5c8c3m1r1a1","sN":1,"aN":"c5c5c8c3m1r1a1"}">SurfaceDuo</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Windows AI Platform_cont","cT":"Container","id":"c6c5c8c3m1r1a1","sN":6,"aN":"c5c8c3m1r1a1"}">
<a id="windows-ai-platform" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/windowsai/" data-m="{"cN":"CatNav_Windows AI Platform_nav","id":"n1c6c5c8c3m1r1a1","sN":1,"aN":"c6c5c8c3m1r1a1"}">Windows AI Platform</a>
</li>
</ul>
</div>
</li> <li class="nested-menu uhf-menu-item">
<div class="c-uhf-menu js-nav-menu">
<button type="button" id="Languages" aria-expanded="false" data-m="{"cN":"CatNav_Languages_nonnav","id":"nn6c8c3m1r1a1","sN":6,"aN":"c8c3m1r1a1"}">Languages</button>
<ul class="" data-class-idn="" aria-hidden="true" data-m="{"cN":"Languages_cont","cT":"Container","id":"c7c8c3m1r1a1","sN":7,"aN":"c8c3m1r1a1"}">
<li class="js-nav-menu single-link" data-m="{"cN":"C++_cont","cT":"Container","id":"c1c7c8c3m1r1a1","sN":1,"aN":"c7c8c3m1r1a1"}">
<a id="c++" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/cppblog/" data-m="{"cN":"CatNav_C++_nav","id":"n1c1c7c8c3m1r1a1","sN":1,"aN":"c1c7c8c3m1r1a1"}">C++</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"C#_cont","cT":"Container","id":"c2c7c8c3m1r1a1","sN":2,"aN":"c7c8c3m1r1a1"}">
<a id="c#" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/csharp/" data-m="{"cN":"CatNav_C#_nav","id":"n1c2c7c8c3m1r1a1","sN":1,"aN":"c2c7c8c3m1r1a1"}">C#</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"F#_cont","cT":"Container","id":"c3c7c8c3m1r1a1","sN":3,"aN":"c7c8c3m1r1a1"}">
<a id="F#" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/fsharp/" data-m="{"cN":"CatNav_F#_nav","id":"n1c3c7c8c3m1r1a1","sN":1,"aN":"c3c7c8c3m1r1a1"}">F#</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"TypeScript_cont","cT":"Container","id":"c4c7c8c3m1r1a1","sN":4,"aN":"c7c8c3m1r1a1"}">
<a id="TypeScript" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/typescript/" data-m="{"cN":"CatNav_TypeScript_nav","id":"n1c4c7c8c3m1r1a1","sN":1,"aN":"c4c7c8c3m1r1a1"}">TypeScript</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"PowerShell Community_cont","cT":"Container","id":"c5c7c8c3m1r1a1","sN":5,"aN":"c7c8c3m1r1a1"}">
<a id="powershell-community" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/powershell-community/" data-m="{"cN":"CatNav_PowerShell Community_nav","id":"n1c5c7c8c3m1r1a1","sN":1,"aN":"c5c7c8c3m1r1a1"}">PowerShell Community</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"PowerShell Team_cont","cT":"Container","id":"c6c7c8c3m1r1a1","sN":6,"aN":"c7c8c3m1r1a1"}">
<a id="powershell-team" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/powershell/" data-m="{"cN":"CatNav_PowerShell Team_nav","id":"n1c6c7c8c3m1r1a1","sN":1,"aN":"c6c7c8c3m1r1a1"}">PowerShell Team</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Python_cont","cT":"Container","id":"c7c7c8c3m1r1a1","sN":7,"aN":"c7c8c3m1r1a1"}">
<a id="Python" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/python/" data-m="{"cN":"CatNav_Python_nav","id":"n1c7c7c8c3m1r1a1","sN":1,"aN":"c7c7c8c3m1r1a1"}">Python</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"JavaScript_cont","cT":"Container","id":"c8c7c8c3m1r1a1","sN":8,"aN":"c7c8c3m1r1a1"}">
<a id="JavaScript" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/visualstudio/tag/javascript/" data-m="{"cN":"CatNav_JavaScript_nav","id":"n1c8c7c8c3m1r1a1","sN":1,"aN":"c8c7c8c3m1r1a1"}">JavaScript</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Java_cont","cT":"Container","id":"c9c7c8c3m1r1a1","sN":9,"aN":"c7c8c3m1r1a1"}">
<a id="Java" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/java/" data-m="{"cN":"CatNav_Java_nav","id":"n1c9c7c8c3m1r1a1","sN":1,"aN":"c9c7c8c3m1r1a1"}">Java</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Java Blog in Chinese_cont","cT":"Container","id":"c10c7c8c3m1r1a1","sN":10,"aN":"c7c8c3m1r1a1"}">
<a id="java-blog-in-chinese" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/java-ch/" data-m="{"cN":"CatNav_Java Blog in Chinese_nav","id":"n1c10c7c8c3m1r1a1","sN":1,"aN":"c10c7c8c3m1r1a1"}">Java Blog in Chinese</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Go_cont","cT":"Container","id":"c11c7c8c3m1r1a1","sN":11,"aN":"c7c8c3m1r1a1"}">
<a id="go" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/go/" data-m="{"cN":"CatNav_Go_nav","id":"n1c11c7c8c3m1r1a1","sN":1,"aN":"c11c7c8c3m1r1a1"}">Go</a>
</li>
</ul>
</div>
</li> <li class="nested-menu uhf-menu-item">
<div class="c-uhf-menu js-nav-menu">
<button type="button" id="c-shellmenu_36" aria-expanded="false" data-m="{"cN":"CatNav_.Net_nonnav","id":"nn8c8c3m1r1a1","sN":8,"aN":"c8c3m1r1a1"}">.NET</button>
<ul class="" data-class-idn="" aria-hidden="true" data-m="{"cN":".Net_cont","cT":"Container","id":"c9c8c3m1r1a1","sN":9,"aN":"c8c3m1r1a1"}">
<li class="js-nav-menu single-link" data-m="{"cN":"All .NET posts_cont","cT":"Container","id":"c1c9c8c3m1r1a1","sN":1,"aN":"c9c8c3m1r1a1"}">
<a id="all-dotnet-posts" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/ " data-m="{"cN":"CatNav_All .NET posts_nav","id":"n1c1c9c8c3m1r1a1","sN":1,"aN":"c1c9c8c3m1r1a1"}">All .NET posts</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":".NET Aspire_cont","cT":"Container","id":"c2c9c8c3m1r1a1","sN":2,"aN":"c9c8c3m1r1a1"}">
<a id="c-shellmenu_38" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/dotnet-aspire/" data-m="{"cN":"CatNav_.NET Aspire_nav","id":"n1c2c9c8c3m1r1a1","sN":1,"aN":"c2c9c8c3m1r1a1"}">.NET Aspire</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":".NET MAUI_cont","cT":"Container","id":"c3c9c8c3m1r1a1","sN":3,"aN":"c9c8c3m1r1a1"}">
<a id="dotnet-MAUI" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/maui/" data-m="{"cN":"CatNav_.NET MAUI_nav","id":"n1c3c9c8c3m1r1a1","sN":1,"aN":"c3c9c8c3m1r1a1"}">.NET MAUI</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"AI_cont","cT":"Container","id":"c4c9c8c3m1r1a1","sN":4,"aN":"c9c8c3m1r1a1"}">
<a id="AI" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/ai/" data-m="{"cN":"CatNav_AI_nav","id":"n1c4c9c8c3m1r1a1","sN":1,"aN":"c4c9c8c3m1r1a1"}">AI</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"ASP.NET Core_cont","cT":"Container","id":"c5c9c8c3m1r1a1","sN":5,"aN":"c9c8c3m1r1a1"}">
<a id="aspnet-core" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/aspnetcore/" data-m="{"cN":"CatNav_ASP.NET Core_nav","id":"n1c5c9c8c3m1r1a1","sN":1,"aN":"c5c9c8c3m1r1a1"}">ASP.NET Core</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Blazor_cont","cT":"Container","id":"c6c9c8c3m1r1a1","sN":6,"aN":"c9c8c3m1r1a1"}">
<a id="blazor" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/blazor/" data-m="{"cN":"CatNav_Blazor_nav","id":"n1c6c9c8c3m1r1a1","sN":1,"aN":"c6c9c8c3m1r1a1"}">Blazor</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Entity Framework_cont","cT":"Container","id":"c7c9c8c3m1r1a1","sN":7,"aN":"c9c8c3m1r1a1"}">
<a id="entity-framework" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/entity-framework/" data-m="{"cN":"CatNav_Entity Framework_nav","id":"n1c7c9c8c3m1r1a1","sN":1,"aN":"c7c9c8c3m1r1a1"}">Entity Framework</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Servicing_cont","cT":"Container","id":"c8c9c8c3m1r1a1","sN":8,"aN":"c9c8c3m1r1a1"}">
<a id="servicing" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet/category/maintenance-and-updates/" data-m="{"cN":"CatNav_Servicing_nav","id":"n1c8c9c8c3m1r1a1","sN":1,"aN":"c8c9c8c3m1r1a1"}">Servicing</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":".NET Blog in Chinese_cont","cT":"Container","id":"c9c9c8c3m1r1a1","sN":9,"aN":"c9c8c3m1r1a1"}">
<a id="dotnet-blog-in-chinese" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/dotnet-ch/" data-m="{"cN":"CatNav_.NET Blog in Chinese_nav","id":"n1c9c9c8c3m1r1a1","sN":1,"aN":"c9c9c8c3m1r1a1"}">.NET Blog in Chinese</a>
</li>
</ul>
</div>
</li> <li class="nested-menu uhf-menu-item">
<div class="c-uhf-menu js-nav-menu">
<button type="button" id="platform-development" aria-expanded="false" data-m="{"cN":"CatNav_Platform Development_nonnav","id":"nn10c8c3m1r1a1","sN":10,"aN":"c8c3m1r1a1"}">Platform Development</button>
<ul class="" data-class-idn="" aria-hidden="true" data-m="{"cN":"Platform Development_cont","cT":"Container","id":"c11c8c3m1r1a1","sN":11,"aN":"c8c3m1r1a1"}">
<li class="js-nav-menu single-link" data-m="{"cN":"#ifdef Windows_cont","cT":"Container","id":"c1c11c8c3m1r1a1","sN":1,"aN":"c11c8c3m1r1a1"}">
<a id="pax-windows" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/ifdef-windows/" data-m="{"cN":"CatNav_#ifdef Windows_nav","id":"n1c1c11c8c3m1r1a1","sN":1,"aN":"c1c11c8c3m1r1a1"}">#ifdef Windows</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Azure Government_cont","cT":"Container","id":"c2c11c8c3m1r1a1","sN":2,"aN":"c11c8c3m1r1a1"}">
<a id="azure-government" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/azuregov/" data-m="{"cN":"CatNav_Azure Government_nav","id":"n1c2c11c8c3m1r1a1","sN":1,"aN":"c2c11c8c3m1r1a1"}">Azure Government</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Azure VM Runtime Team_cont","cT":"Container","id":"c3c11c8c3m1r1a1","sN":3,"aN":"c11c8c3m1r1a1"}">
<a id="azure-vm-runtime" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/azure-vm-runtime/" data-m="{"cN":"CatNav_Azure VM Runtime Team_nav","id":"n1c3c11c8c3m1r1a1","sN":1,"aN":"c3c11c8c3m1r1a1"}">Azure VM Runtime Team</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Bing Dev Center_cont","cT":"Container","id":"c4c11c8c3m1r1a1","sN":4,"aN":"c11c8c3m1r1a1"}">
<a id="bing-dev-center" class="js-subm-uhf-nav-link" href="https://blogs.bing.com/Developers-Blog/" data-m="{"cN":"CatNav_Bing Dev Center_nav","id":"n1c4c11c8c3m1r1a1","sN":1,"aN":"c4c11c8c3m1r1a1"}" target="_blank">Bing Dev Center</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Microsoft Edge Dev_cont","cT":"Container","id":"c5c11c8c3m1r1a1","sN":5,"aN":"c11c8c3m1r1a1"}">
<a id="microsoft-edge-dev" class="js-subm-uhf-nav-link" href="http://blogs.windows.com/msedgedev/" data-m="{"cN":"CatNav_Microsoft Edge Dev_nav","id":"n1c5c11c8c3m1r1a1","sN":1,"aN":"c5c11c8c3m1r1a1"}" target="_blank">Microsoft Edge Dev</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Microsoft Azure_cont","cT":"Container","id":"c6c11c8c3m1r1a1","sN":6,"aN":"c11c8c3m1r1a1"}">
<a id="microsoft-azure" class="js-subm-uhf-nav-link" href="http://azure.microsoft.com/blog/" data-m="{"cN":"CatNav_Microsoft Azure_nav","id":"n1c6c11c8c3m1r1a1","sN":1,"aN":"c6c11c8c3m1r1a1"}" target="_blank">Microsoft Azure</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Microsoft 365 Developer_cont","cT":"Container","id":"c7c11c8c3m1r1a1","sN":7,"aN":"c11c8c3m1r1a1"}">
<a id="microsoft-365-developer" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/microsoft365dev/" data-m="{"cN":"CatNav_Microsoft 365 Developer_nav","id":"n1c7c11c8c3m1r1a1","sN":1,"aN":"c7c11c8c3m1r1a1"}">Microsoft 365 Developer</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Microsoft Entra Identity Developer Blog_cont","cT":"Container","id":"c8c11c8c3m1r1a1","sN":8,"aN":"c11c8c3m1r1a1"}">
<a id="microsoft-entra-identity-developer-blog" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/identity/" data-m="{"cN":"CatNav_Microsoft Entra Identity Developer Blog_nav","id":"n1c8c11c8c3m1r1a1","sN":1,"aN":"c8c11c8c3m1r1a1"}">Microsoft Entra Identity Developer Blog</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Old New Thing_cont","cT":"Container","id":"c9c11c8c3m1r1a1","sN":9,"aN":"c11c8c3m1r1a1"}">
<a id="old-new-thing" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/oldnewthing/" data-m="{"cN":"CatNav_Old New Thing_nav","id":"n1c9c11c8c3m1r1a1","sN":1,"aN":"c9c11c8c3m1r1a1"}">Old New Thing</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Power Platform_cont","cT":"Container","id":"c10c11c8c3m1r1a1","sN":10,"aN":"c11c8c3m1r1a1"}">
<a id="power-platform" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/powerplatform/" data-m="{"cN":"CatNav_Power Platform_nav","id":"n1c10c11c8c3m1r1a1","sN":1,"aN":"c10c11c8c3m1r1a1"}">Power Platform</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Windows MIDI and Music dev_cont","cT":"Container","id":"c11c11c8c3m1r1a1","sN":11,"aN":"c11c8c3m1r1a1"}">
<a id="windows-music-dev" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/windows-music-dev/" data-m="{"cN":"CatNav_Windows MIDI and Music dev_nav","id":"n1c11c11c8c3m1r1a1","sN":1,"aN":"c11c11c8c3m1r1a1"}">Windows MIDI and Music dev</a>
</li>
</ul>
</div>
</li> <li class="nested-menu uhf-menu-item">
<div class="c-uhf-menu js-nav-menu">
<button type="button" id="data-development" aria-expanded="false" data-m="{"cN":"CatNav_Date Development_nonnav","id":"nn12c8c3m1r1a1","sN":12,"aN":"c8c3m1r1a1"}">Data Development</button>
<ul class="" data-class-idn="" aria-hidden="true" data-m="{"cN":"Date Development_cont","cT":"Container","id":"c13c8c3m1r1a1","sN":13,"aN":"c8c3m1r1a1"}">
<li class="js-nav-menu single-link" data-m="{"cN":"Azure Cosmos DB_cont","cT":"Container","id":"c1c13c8c3m1r1a1","sN":1,"aN":"c13c8c3m1r1a1"}">
<a id="azure-cosmos-db" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/cosmosdb/" data-m="{"cN":"CatNav_Azure Cosmos DB_nav","id":"n1c1c13c8c3m1r1a1","sN":1,"aN":"c1c13c8c3m1r1a1"}"> Azure Cosmos DB</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Azure Data Studio_cont","cT":"Container","id":"c2c13c8c3m1r1a1","sN":2,"aN":"c13c8c3m1r1a1"}">
<a id="azure-data-studio" class="js-subm-uhf-nav-link" href="https://cloudblogs.microsoft.com/sqlserver/?product=azure-data-studio" data-m="{"cN":"CatNav_Azure Data Studio_nav","id":"n1c2c13c8c3m1r1a1","sN":1,"aN":"c2c13c8c3m1r1a1"}" target="_blank">Azure Data Studio</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Azure SQL_cont","cT":"Container","id":"c3c13c8c3m1r1a1","sN":3,"aN":"c13c8c3m1r1a1"}">
<a id="azure-SQL" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/azure-sql/" data-m="{"cN":"CatNav_Azure SQL_nav","id":"n1c3c13c8c3m1r1a1","sN":1,"aN":"c3c13c8c3m1r1a1"}">Azure SQL</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"OData_cont","cT":"Container","id":"c4c13c8c3m1r1a1","sN":4,"aN":"c13c8c3m1r1a1"}">
<a id="OData" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/odata/" data-m="{"cN":"CatNav_OData_nav","id":"n1c4c13c8c3m1r1a1","sN":1,"aN":"c4c13c8c3m1r1a1"}">OData</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Revolutions R_cont","cT":"Container","id":"c5c13c8c3m1r1a1","sN":5,"aN":"c13c8c3m1r1a1"}">
<a id="revolutions-r" class="js-subm-uhf-nav-link" href="http://blog.revolutionanalytics.com/" data-m="{"cN":"CatNav_Revolutions R_nav","id":"n1c5c13c8c3m1r1a1","sN":1,"aN":"c5c13c8c3m1r1a1"}" target="_blank">Revolutions R</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"SQL Server Data Tools_cont","cT":"Container","id":"c6c13c8c3m1r1a1","sN":6,"aN":"c13c8c3m1r1a1"}">
<a id="SQL-server-data-tools" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/ssdt/" data-m="{"cN":"CatNav_SQL Server Data Tools_nav","id":"n1c6c13c8c3m1r1a1","sN":1,"aN":"c6c13c8c3m1r1a1"}">SQL Server Data Tools</a>
</li>
<li class="js-nav-menu single-link" data-m="{"cN":"Unified Data Model (IDEAs)_cont","cT":"Container","id":"c7c13c8c3m1r1a1","sN":7,"aN":"c13c8c3m1r1a1"}">
<a id="udm" class="js-subm-uhf-nav-link" href="https://devblogs.microsoft.com/udm/" data-m="{"cN":"CatNav_Unified Data Model (IDEAs)_nav","id":"n1c7c13c8c3m1r1a1","sN":1,"aN":"c7c13c8c3m1r1a1"}">Unified Data Model (IDEAs)</a>
</li>
</ul>
</div>
</li>
<li id="overflow-menu" class="overflow-menu x-hidden uhf-menu-item">
<div class="c-uhf-menu js-nav-menu">
<button data-m="{"pid":"More","id":"nn14c8c3m1r1a1","sN":14,"aN":"c8c3m1r1a1"}" type="button" aria-label="More" aria-expanded="false">More</button>
<ul id="overflow-menu-list" aria-hidden="true" class="overflow-menu-list">
</ul>
</div>
</li>
</ul>
</nav>
<div id="theme-picker" data-bi-name="Switch to dark theme" class="c-me theme-picker d-flex align-items-center">
<button id="theme-picker-button" style="height: 25px; margin-right: 24px;" class="d-flex btn border-r-12" aria-pressed="false" aria-label="Dark theme switch">
<span class="theme-text fs-12 d-flex align-items-center" style="overflow-x: visible;padding: 0px 8px; gap: 8px;">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.3592 13.9967C14.1552 17.8141 9.27399 19.122 5.45663 16.918C4.41706 16.3178 3.54192 15.5059 2.87537 14.538C2.65251 14.2143 2.79667 13.7674 3.16661 13.635C6.17301 12.559 7.78322 11.312 8.71759 9.52844C9.70125 7.65076 9.95545 5.59395 9.26732 2.77462C9.17217 2.38477 9.4801 2.01357 9.88082 2.03507C11.1233 2.10173 12.3371 2.45863 13.4378 3.09415C17.2552 5.2981 18.5631 10.1793 16.3592 13.9967Z" fill="#242424"></path>
</svg>
Theme</span>
</button>
</div><div class="login-section c-me d-flex align-items-center">
<a class="login-but d-flex align-items-center" href="https://devblogs.microsoft.com/visualstudio/wp-login.php?redirect_to=https%3A%2F%2Fdevblogs.microsoft.com%2Fvisualstudio%2F">Sign in</a>
</div><div class="c-uhfh-actions" data-m="{"cN":"Header actions_cont","cT":"Container","id":"c9c3m1r1a1","sN":9,"aN":"c3m1r1a1"}">
<div class="wf-menu"></div>
<form class="c-search" autocomplete="off" id="searchForm" name="searchForm" role="search" action="/search" method="GET" data-seautosuggest="" data-seautosuggestapi="https://www.microsoft.com/msstoreapiprod/api/autosuggest" data-m="{"cN":"GlobalNav_Search_cont","cT":"Container","id":"c1c9c3m1r1a1","sN":1,"aN":"c9c3m1r1a1"}" aria-expanded="false">
<input id="cli_shellHeaderSearchInput" aria-label="Search" aria-expanded="false" aria-controls="universal-header-search-auto-suggest-transparent" aria-owns="universal-header-search-auto-suggest-ul" type="search" name="query" placeholder="Search" data-m="{"cN":"SearchBox_nav","id":"n1c1c9c3m1r1a1","sN":1,"aN":"c1c9c3m1r1a1"}" data-toggle="tooltip" data-placement="right" title="Search">
<button id="search" aria-label="Search" class="c-glyph" data-m="{"cN":"Search_nav","id":"n2c1c9c3m1r1a1","sN":2,"aN":"c1c9c3m1r1a1"}" data-bi-mto="true" aria-expanded="false" disabled="disabled">
<span role="presentation">Search</span>
<span role="tooltip" class="c-uhf-tooltip c-uhf-search-tooltip">Search</span>
</button>
<div class="m-auto-suggest" id="universal-header-search-auto-suggest-transparent" role="group">
<ul class="c-menu" id="universal-header-search-auto-suggest-ul" aria-label="Search Suggestions" aria-hidden="true" data-bi-dnt="true" data-bi-mto="true" data-js-auto-suggest-position="default" role="listbox" data-tel="jsll" data-m="{"cN":"search suggestions_cont","cT":"Container","id":"c3c1c9c3m1r1a1","sN":3,"aN":"c1c9c3m1r1a1"}"></ul>
<ul class="c-menu f-auto-suggest-no-results" aria-hidden="true" data-js-auto-suggest-postion="default" data-js-auto-suggest-position="default" role="listbox">
<li class="c-menu-item"> <span tabindex="-1">No results</span></li>
</ul>
</div>
<input type="hidden" name="blog" value="/visualstudio/" data-m="{"cN":"HiddenInput_nav","id":"n2c1c9c3m1r1a1","sN":2,"aN":"c1c9c3m1r1a1"}" style="overflow-x: visible;" aria-label="Search"></form>
<button data-m="{"cN":"cancel-search","pid":"Cancel Search","id":"nn2c9c3m1r1a1","sN":2,"aN":"c9c3m1r1a1"}" id="cancel-search" class="cancel-search" aria-label="Cancel Search">
<span>Cancel</span>
</button>
</div>
</div>
</div>
</header>
</div>
</div>
</div><link rel="stylesheet" href="https://www.microsoft.com/onerfstatics/marketingsites-wcus-prod/west-european/shell/_scrf/css/themes=default.device=uplevel_web_pc/1b-9d8ed9/c9-be0100/a6-e969ef/43-9f2e7c/82-8b5456/a0-5d3913/52-918540/ca-ae3ce4?ver=2.0&_cf=02242021_3231" type="text/css" media="all"><script src="https://wcpstatic.microsoft.com/mscc/lib/v2/wcp-consent.js"></script><script src="https://www.microsoft.com/onerfstatics/marketingsites-wcus-prod/shell/_scrf/js/themes=default/54-af9f9f/d4-fb1f57/e1-a50eee/e7-954872/d8-97d509/f0-251fe2/46-be1318/77-04a268/11-240c7b/63-077520/a4-34de62/f9-a5b2ce/db-bc0148/dc-7e9864/6d-c07ea1/6f-dafe8c/f6-aa5278/73-a24d00/6d-1e7ed0/b7-cadaa7/c4-898cf2/ca-40b7b0/4e-ee3a55/3e-f5c39b/c3-6454d7/f9-7592d3/d0-e64f3e/92-10345d/79-499886/7e-cda2d3/58-ab4971/74-d51c79/e0-3c9860/de-884374/1f-100dea/33-abe4df/2b-8e0ae6?ver=2.0&_cf=02242021_3231&iife=1"></script> <!--/ UHF header -->
<main class="devblogs-main" id="main" role="main">
<div class="wrapper">
<div class="container-evo pt-24">
<div class="breadcrumbs-wrapper" data-bi-area="breadcrumb" data-bi-id="breadcrumb">
<nav aria-label="breadcrumb"><ul class="breadcrumb d-flex flex-wrap p-0 m-0" style="list-style-type: none;"><li class="d-flex align-items-center"><a href="https://devblogs.microsoft.com/"><span>Dev Blogs</span></a><span class="breadcrumb-icon px-6"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" style="vertical-align: middle;"><path fill="none" stroke="currentColor" stroke-width="1" d="m9 5l7 7l-7 7"></path></svg></span></li><li class="d-flex align-items-center"><a class="deb-current-page"><span>Visual Studio Blog</span></a></li></ul></nav><!-- .breadcrumbs --> </div>
<!-- alert-banner-starts -->
<div class="alert-banner pt-16 ">
<div class="email-banner d-flex justify-content-between rounded gap-40 border-r-8 py-8 px-16" data-bi-area="banner_alert">
<div class="banner-container d-flex flex-column flex-md-row gap-16">
<div class="banner-header d-flex align-items-center fs-14 fw-600">
<span>Building the future of software development together</span>
</div>
<div class="banner-body d-flex flex-column gap-16 flex-md-row fs-14">
<p>Ready to shape the next generation of technology? Discover how the Visual Studio family, Azure, GitHub, and GitHub Copilot empower you to innovate and lead.</p>
<div class="cta-wrapper d-flex flex-column gap-16 flex-sm-row">
<a class="banner-button d-flex" href="https://devblogs.microsoft.com/blog/building-the-future-of-software-development-together/?icid=vsblog-banner-amanda-azure-github" target="_blank" aria-label="" data-bi-id="banner_alert_cta" data-bi-hn="Building the future of software development together" data-bi-name="Learn more">
<div class="d-flex align-items-center fw-600">
<span class="white-space-nowrap">Learn more</span>
</div>
</a>
</div>
</div>
</div>
<div class="banner-cta d-flex gap-16 align-items-center">
<a class="banner-close d-flex align-items-center" aria-label="Banner close" href="javascript:" data-bi-id="banner_alert_close" data-bi-hn="Building the future of software development together" data-bi-name="close">
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.08859 4.71569L4.14645 4.64645C4.32001 4.47288 4.58944 4.4536 4.78431 4.58859L4.85355 4.64645L10 9.793L15.1464 4.64645C15.32 4.47288 15.5894 4.4536 15.7843 4.58859L15.8536 4.64645C16.0271 4.82001 16.0464 5.08944 15.9114 5.28431L15.8536 5.35355L10.707 10.5L15.8536 15.6464C16.0271 15.82 16.0464 16.0894 15.9114 16.2843L15.8536 16.3536C15.68 16.5271 15.4106 16.5464 15.2157 16.4114L15.1464 16.3536L10 11.207L4.85355 16.3536C4.67999 16.5271 4.41056 16.5464 4.21569 16.4114L4.14645 16.3536C3.97288 16.18 3.9536 15.9106 4.08859 15.7157L4.14645 15.6464L9.293 10.5L4.14645 5.35355C3.97288 5.17999 3.9536 4.91056 4.08859 4.71569L4.14645 4.64645L4.08859 4.71569Z" fill="currentColor"></path>
</svg>
</a>
</div>
</div>
</div>
<!-- alert-banner-ends -->
</div>
<style>
/* The image itself */
.thumbnail-container img {
height: auto;
max-height: 100%;
width: auto;
max-height: 301px;
}
@media (min-width: 900px) {
.pinned-wrap {
display: grid;
grid-template-columns: 1fr 1fr;
align-items: stretch;
}
}
</style>
<div class="container-evo mt-80">
<div class="mb-80" style="max-width: 976px;"><h1 class="mb-6">Visual Studio Blog</h1><p class="fs-16 mb-0">The official source of product insight from the Visual Studio Engineering Team</p></div> <div class="container-sidebar-home mb-80">
<div>
<section class="mb-32" data-bi-area="latest_posts">
<div class="d-flex justify-content-between border-bottom mb-40">
<h2 class="fs-20 mb-16 pt-6" id="load-posts">Latest posts</h2>
<style>
/* Storing grid globle styles here for now*/
.masonry-card {
box-sizing: border-box;
}
.archive-posts.grid-view {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
}
/* Masonry thumbnail */
.masonry-thumbnail {
display: flex;
justify-content: center;
}
.grid-view .masonry-thumbnail {
align-items: center;
width: 100%;
min-height: 188px;
}
.grid-view .masonry-thumbnail img {
max-height: 164px;
width: auto;
}
.masonry-thumbnail {
background: var(--clr-card-image-bg);
border-radius: 8px;
padding: 12px;
}
/* Grid View */
.home.blog .archive-posts.grid-view .masonry-card {
display: block;
}
/* Single Column View */
.archive-posts.single-column {
display: block;
}
.archive-posts.single-column .masonry-card {
min-height: 311px;
margin-bottom: 24px;
}
@media (min-width: 1084px) {
.masonry-container {
gap: 40px;
}
.masonry-card {
padding: 24px;
}
.archive-posts.single-column .masonry-card {
margin-bottom: 40px;
}
}
@media (min-width: 900px) {
.card-body {
display: flex;
flex-direction: column;
justify-content: space-between;
flex-grow: 1;
}
.archive-posts.single-column .card-body {
width: 60%;
}
}
@media (max-width: 760px) {
.masonry-container {
grid-template-columns: 1fr;
}
.single-column .masonry-card {
display: block;
}
.single-column .masonry-thumbnail {
margin-bottom: 16px;
}
}
.single-column .masonry-card {
flex-direction: row;
gap: 32px;
}
@media (min-width: 761px) {
.single-column .masonry-card .masonry-thumbnail {
flex-grow: 1;
align-items: center;
min-width: 240px;
max-width: 449px;
width: 40%;
}
}
.single-column .card-body .card-top>div {
margin-top: 0px;
}
/* Style the button */
.layout-toggle {
display: none;
}
@media (min-width: 760px) {
.layout-toggle {
display: flex;
gap: 12px;
height: 32px;
}
}
.layout-toggle button {
background-color: transparent;
border: none;
cursor: pointer;
padding: 0px;
}
.layout-toggle button svg path {
fill: var(--clr-landing-navbar);
}
.layout-toggle button.active svg rect {
fill: var(--clr-btn-toggle);
stroke: none;
}
.layout-toggle button:not(.active) svg rect {
fill: var(--clr-card-bg);
stroke: var(--clr-btn-greyscale-border);
}
.layout-toggle button.active svg path {
fill: white;
}
.layout-toggle button:not(.active):hover svg rect {
fill: var(--clr-btn-greyscale-hover-bg);
}
.layout-toggle button:focus {
border-radius: 4px;
}
.excerpt-title {
display: -webkit-box;
-webkit-line-clamp: 3;
/* Number of full lines */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.excerpt-body {
display: -webkit-box;
-webkit-line-clamp: 3;
/* Number of full lines */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
<div class="layout-toggle">
<!-- Grid View Button -->
<button id="grid-view-btn" class="active" aria-label="Grid View" data-bi-area="latest posts" data-bi-id="blog_home_page_latest_posts_grid_toggle">
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="31" height="31" rx="3.5"></rect>
<path d="M12.75 17C13.9926 17 15 18.0074 15 19.25V22.75C15 23.9926 13.9926 25 12.75 25H9.25C8.00736 25 7 23.9926 7 22.75V19.25C7 18.0074 8.00736 17 9.25 17H12.75ZM22.75 17C23.9926 17 25 18.0074 25 19.25V22.75C25 23.9926 23.9926 25 22.75 25H19.25C18.0074 25 17 23.9926 17 22.75V19.25C17 18.0074 18.0074 17 19.25 17H22.75ZM12.75 18.5H9.25C8.83579 18.5 8.5 18.8358 8.5 19.25V22.75C8.5 23.1642 8.83579 23.5 9.25 23.5H12.75C13.1642 23.5 13.5 23.1642 13.5 22.75V19.25C13.5 18.8358 13.1642 18.5 12.75 18.5ZM22.75 18.5H19.25C18.8358 18.5 18.5 18.8358 18.5 19.25V22.75C18.5 23.1642 18.8358 23.5 19.25 23.5H22.75C23.1642 23.5 23.5 23.1642 23.5 22.75V19.25C23.5 18.8358 23.1642 18.5 22.75 18.5ZM12.75 7C13.9926 7 15 8.00736 15 9.25V12.75C15 13.9926 13.9926 15 12.75 15H9.25C8.00736 15 7 13.9926 7 12.75V9.25C7 8.00736 8.00736 7 9.25 7H12.75ZM22.75 7C23.9926 7 25 8.00736 25 9.25V12.75C25 13.9926 23.9926 15 22.75 15H19.25C18.0074 15 17 13.9926 17 12.75V9.25C17 8.00736 18.0074 7 19.25 7H22.75ZM12.75 8.5H9.25C8.83579 8.5 8.5 8.83579 8.5 9.25V12.75C8.5 13.1642 8.83579 13.5 9.25 13.5H12.75C13.1642 13.5 13.5 13.1642 13.5 12.75V9.25C13.5 8.83579 13.1642 8.5 12.75 8.5ZM22.75 8.5H19.25C18.8358 8.5 18.5 8.83579 18.5 9.25V12.75C18.5 13.1642 18.8358 13.5 19.25 13.5H22.75C23.1642 13.5 23.5 13.1642 23.5 12.75V9.25C23.5 8.83579 23.1642 8.5 22.75 8.5Z" fill="#3A96DD"></path>
</svg>
</button>
<!-- Column View Button -->
<button id="column-view-btn" aria-label="Column View" data-bi-area="latest posts" data-bi-id="blog_home_page_latest_posts_column_toggle">
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="31" height="31" rx="3.5"></rect>
<path d="M8.25 8C7.00736 8 6 9.00736 6 10.25V12.75C6 13.9926 7.00736 15 8.25 15H10.75C11.9926 15 13 13.9926 13 12.75V10.25C13 9.00736 11.9926 8 10.75 8H8.25ZM7.5 10.25C7.5 9.83579 7.83579 9.5 8.25 9.5H10.75C11.1642 9.5 11.5 9.83579 11.5 10.25V12.75C11.5 13.1642 11.1642 13.5 10.75 13.5H8.25C7.83579 13.5 7.5 13.1642 7.5 12.75V10.25ZM15.25 9C14.8358 9 14.5 9.33579 14.5 9.75C14.5 10.1642 14.8358 10.5 15.25 10.5H25.25C25.6642 10.5 26 10.1642 26 9.75C26 9.33579 25.6642 9 25.25 9H15.25ZM15.25 12C14.8358 12 14.5 12.3358 14.5 12.75C14.5 13.1642 14.8358 13.5 15.25 13.5H22.25C22.6642 13.5 23 13.1642 23 12.75C23 12.3358 22.6642 12 22.25 12H15.25ZM8.25 17C7.00736 17 6 18.0074 6 19.25V21.75C6 22.9926 7.00736 24 8.25 24H10.75C11.9926 24 13 22.9926 13 21.75V19.25C13 18.0074 11.9926 17 10.75 17H8.25ZM7.5 19.25C7.5 18.8358 7.83579 18.5 8.25 18.5H10.75C11.1642 18.5 11.5 18.8358 11.5 19.25V21.75C11.5 22.1642 11.1642 22.5 10.75 22.5H8.25C7.83579 22.5 7.5 22.1642 7.5 21.75V19.25ZM15.25 18C14.8358 18 14.5 18.3358 14.5 18.75C14.5 19.1642 14.8358 19.5 15.25 19.5H25.25C25.6642 19.5 26 19.1642 26 18.75C26 18.3358 25.6642 18 25.25 18H15.25ZM15.25 21C14.8358 21 14.5 21.3358 14.5 21.75C14.5 22.1642 14.8358 22.5 15.25 22.5H22.25C22.6642 22.5 23 22.1642 23 21.75C23 21.3358 22.6642 21 22.25 21H15.25Z" fill="white"></path>
</svg>
</button>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
// detect if we are on the landing page or a blog home page in PHP, but otherwise keep the logic in JS for clarity
const isMainSite = false;
// Single column layout view toggle
const wrappers = document.querySelectorAll('.archive-posts');
const paginateSelector = (isMainSite ? '.netsposts-paginate .next' : '#pload-more' );
const paginate = document.querySelector(paginateSelector);
const gridButton = document.getElementById('grid-view-btn');
const columnButton = document.getElementById('column-view-btn');
// observer to apply the updated layout attribute to newly added cards automatically after load more is clicked
const cardObserver = new MutationObserver((mutations, observer) => {
let newCards = false;
// check that at least one new card has been added
mutations.forEach(function(mutation) {
if (mutation.type === 'childList') { newCards = true; }
});
// run once if new cards have been added rather than once for each mutation
if (newCards) {
let chosenLayout = (gridButton.classList.contains('active') ? 'grid-view' : 'single-column');
updateLatestPostsTracking(chosenLayout);
}
});
cardObserver.observe(wrappers[0], {childList: true});
// Check for stored layout in localStorage
let storedLayout = localStorage.getItem('layout') || 'grid-view'; // Default is grid-view
// Apply the stored layout
wrappers.forEach(wrapper => {
wrapper.classList.add(storedLayout);
});
updateLatestPostsTracking(storedLayout);
// Function to update the layout state in localStorage
function updateLayoutState(layout) {
localStorage.setItem('layout', layout); // Store layout in localStorage
}
// function to update data bi attributes to reflect the current layout
function updateLatestPostsTracking(layout) {
let layoutString = '';
let cardLinkSelector = ( isMainSite ? 'netsposts-posttitle-link' : 'single-click' );
// make layout string compliant with tracking requirements
switch (layout) {
case 'grid-view':
layoutString = 'grid';
break;
case 'single-column':
layoutString = 'column';
break;
}
// update data attributes on all cards
wrappers.forEach(wrapper => {
// get current collection of cards in case new cards have been added
let cards = wrapper.getElementsByClassName(cardLinkSelector);
Array.from(cards).forEach(card => {
if (isMainSite) {
card.setAttribute('data-bi-id', 'landing_page_latest_posts_'+layoutString+'_card');
} else {
card.setAttribute('data-bi-id', 'blog_home_page_latest_posts_'+layoutString+'_card_singleclick');
}
})
});
if (paginate) {
// update data attributes on pagination
if (isMainSite) {
paginate.setAttribute('data-bi-id', 'landing_page_latest_posts_'+layoutString+'_load_more');
} else {
paginate.setAttribute('data-bi-id', 'blog_home_page_latest_posts_'+layoutString+'_load_more');
}
}
}
// Function to check screen size and apply the correct layout (but without removing single-column)
function checkScreenSize() {
// No need to remove single-column for smaller screens
storedLayout = localStorage.getItem('layout');
wrappers.forEach(wrapper => {
if (storedLayout === 'single-column') {
wrapper.classList.remove('grid-view');
wrapper.classList.add('single-column');
} else {
wrapper.classList.remove('single-column');
wrapper.classList.add('grid-view');
}
});
// Update button active state based on stored layout
if (storedLayout === 'single-column') {
columnButton.classList.add('active');
gridButton.classList.remove('active');
} else {
gridButton.classList.add('active');
columnButton.classList.remove('active');
}
}
// Run check on load and window resize
checkScreenSize();
window.addEventListener('resize', checkScreenSize);
// Set event listener for Grid View button
gridButton.addEventListener('click', function () {
wrappers.forEach(wrapper => {
wrapper.classList.remove('single-column');
wrapper.classList.add('grid-view');
});
// Update active button state
gridButton.classList.add('active');
columnButton.classList.remove('active');
updateLayoutState('grid-view'); // Save grid-view in localStorage
updateLatestPostsTracking('grid-view'); // update data bi attr
});
// Set event listener for Column View button
columnButton.addEventListener('click', function () {
wrappers.forEach(wrapper => {
wrapper.classList.remove('grid-view');
wrapper.classList.add('single-column');
});
// Update active button state
columnButton.classList.add('active');
gridButton.classList.remove('active');
updateLayoutState('single-column'); // Save single-column in localStorage
updateLatestPostsTracking('single-column'); // update data bi attr
});
});
</script> </div>
<div class="archive-posts masonry-container gap-24 grid-view">
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251788 lazyloaded" width="500" height="170" src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/refresh-search-results-icon-highlighted-e1734111940468.png" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/refresh-search-results-icon-highlighted-e1734111940468.png" alt="Refresh your Find results">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 17, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">2 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/refresh-your-find-results/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Refresh your Find results">
Refresh your Find results </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2022/12/profile-pic-96x96.jpg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Leah Tran">
</div>
<span class="fs-14">Leah Tran</span>
</div> <p class="excerpt-body mt-16 mb-24">
Are you tired of having to repeatedly launch the Find window in Visual Studio to update your search results? Whether you've just refactored some code or pulled recent changes, having to redo a search to get updated results is no longer necessary. With the new refresh option, you can now update your Find results without the hassle of starting over.
The Refresh search results button in Visual Studio 2022 will save you time and effort when searching through your code.
Refresh your previous Find
No more friction when updating your earlier Find results! After completing a Find, you can click the clockwise arr... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251784 lazyloaded" width="854" height="616" src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/word-image-251783-1.png" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/word-image-251783-1.png" alt="Create internal GitHub repos for your team">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 16, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">1 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/create-internal-github-repos-for-your-team/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Create internal GitHub repos for your team">
Create internal GitHub repos for your team </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2022/08/headshot-96x96.jpg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Jessie Houghton">
</div>
<span class="fs-14">Jessie Houghton</span>
</div> <p class="excerpt-body mt-16 mb-24">
Visual Studio 2022 now includes support for creating internal repositories for GitHub organizations. This feature allows developers to work within their GitHub organization's guidelines within the Visual Studio environment more effectively.
Managing repositories involves configuring varying levels of visibility and permissions. Visual Studio 2022’s new feature aims to smooth this process by providing support for internal repositories, ensuring that developers can be aligned with their organization's polices when they create new repositories.
How it works
In the Create a Git repository dialog, the visibil... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251756 lazyload" width="900" height="505" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4QAAAH5AQMAAADjo2JOAAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAT0lEQVR4nO3BgQAAAADDoPlTH+ECVQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3wDg4gABN0yQ7wAAAABJRU5ErkJggg==" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/word-image-251755-1.png" alt="Boost your Git confidence with the new file rename notification">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 12, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">2 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/boost-your-git-confidence-with-the-new-file-rename-notification/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Boost your Git confidence with the new file rename notification">
Boost your Git confidence with the new file rename notification </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2022/08/headshot-96x96.jpg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Jessie Houghton">
</div>
<span class="fs-14">Jessie Houghton</span>
</div> <p class="excerpt-body mt-16 mb-24">
Have you ever renamed a file in Solution Explorer and wondered if Git is tracking your changes correctly? You're not alone. Many developers have found this process confusing and worry whether their changes are being properly staged in Git. But worry no more - there's a solution!
When you rename files in Solution Explorer, Visual Studio 2022 will now remind you to stage your changes to see the renamed files in Git. This small but mighty notification ensures that Git is recognizing your file change.
Why This Matters
There is often confusion on how Git works when you rename files, especially since there’s a... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251751 lazyload" width="441" height="342" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbkAAAFWAQMAAADOiHE8AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAKklEQVR4nO3BMQEAAADCoPVPbQ0PoAAAAAAAAAAAAAAAAAAAAAAAAIAvA0wmAAH/BwXkAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/word-image-251750-1-e1733851878995.png" alt="Effortless publishing with Azure Functions Flex Consumption">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 11, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">0 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/effortless-publishing-with-azure-functions-flex-consumption/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Effortless publishing with Azure Functions Flex Consumption">
Effortless publishing with Azure Functions Flex Consumption </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/letter-avatar/cb206c8083990cd51767d303f22987e1.svg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Brady Gaster">
</div>
<span class="fs-14">Brady Gaster</span>
</div> <p class="excerpt-body mt-16 mb-24">
Struggling with complex deployment processes for your serverless applications? Visual Studio 2022 introduces a seamless solution with the new Azure Functions Flex Consumption hosting plan, now generally available.
Imagine a world where deploying your serverless applications to a hosting plan that supports fast scaling and VNet is as simple as a right-click. With the Azure Functions Flex Consumption hosting plan, this is now a reality. This feature allows you to right-click publish to Flex directly from Visual Studio 2022, streamlining your workflow and saving valuable time.
One of the standout features ... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251740 lazyload" width="804" height="564" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyQAAAI0AQMAAADWZX9oAAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAATklEQVR4nO3BAQEAAACCIP+vbkhAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCvAeC4AAEgUO27AAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/word-image-251739-1.png" alt="Effortless publishing to Azure WebJobs on Linux">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 10, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">1 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/effortless-publishing-to-azure-webjobs-on-linux/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Effortless publishing to Azure WebJobs on Linux">
Effortless publishing to Azure WebJobs on Linux </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/letter-avatar/cb206c8083990cd51767d303f22987e1.svg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Brady Gaster">
</div>
<span class="fs-14">Brady Gaster</span>
</div> <p class="excerpt-body mt-16 mb-24">
Are you tired of the cumbersome process involved in publishing your .NET console applications to Azure WebJobs on Linux? For developers yearning for a seamless and efficient method to deploy their applications, Visual Studio 2022 introduces a much-anticipated solution.
Visual Studio 2022 now supports right-click publishing to Azure WebJobs on Linux, making the deployment process faster and more intuitive than ever before. This new feature brings much-needed convenience to developers working with cross-platform .NET 5.0+ Console Apps, allowing them to effortlessly publish their code with just a few clicks.
... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251730 lazyload" width="762" height="467" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvoAAAHTAQMAAABsmi71AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAQ0lEQVR4nO3BMQEAAADCoPVPbQ0PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQwOw8wABZG46yAAAAABJRU5ErkJggg==" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/second-item-in-options-window-shows-checkbox-for-r.png" alt="Keep working with non-blocking Code Cleanup">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 9, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">3 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/keep-working-with-non-blocking-code-cleanup/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Keep working with non-blocking Code Cleanup">
Keep working with non-blocking Code Cleanup </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2022/12/profile-pic-96x96.jpg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Leah Tran">
</div>
<span class="fs-14">Leah Tran</span>
</div> <p class="excerpt-body mt-16 mb-24">
Are you tired of waiting for Code Cleanup to finish every time you save your work? Visual Studio 2022 will no longer lock up and get in the way of your tasks as it’s cleaning up the code under the covers.
Every developer knows the importance of maintaining clean code. However, the traditional Code Cleanup process in Visual Studio could take a while to run and lock up the entire IDE, which made it inappropriate to run on save for all scenarios. These interruptions could break your flow and slow down your development progress.
Now, when you save your work, Code Cleanup can run seamlessly in the background... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251642 lazyload" width="376" height="167" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXgAAACnAQMAAAAhTNWrAAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHklEQVRYhe3BMQEAAADCoPVP7W8GoAAAAAAAAACANx9QAAGyfMccAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/word-image-251641-1.png" alt="Introducing Code Referencing for GitHub Copilot Chat in Visual Studio">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 5, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">8 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/introducing-code-referencing-for-github-copilot-chat-in-visual-studio/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Introducing Code Referencing for GitHub Copilot Chat in Visual Studio">
Introducing Code Referencing for GitHub Copilot Chat in Visual Studio </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/01/dp-1-96x96.jpg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Rhea Patel">
</div>
<span class="fs-14">Rhea Patel</span>
</div> <p class="excerpt-body mt-16 mb-24">
Are you tired of the uncertainty that comes with using code suggestions from AI tools? We've got exciting news for you! Visual Studio 2022 now includes code referencing in GitHub Copilot, ensuring greater transparency and control for developers.
We are thrilled to announce that code referencing is now available in GitHub Copilot Chat within Visual Studio. This new feature introduces a filter that detects when code suggestions match public code on GitHub, providing you with valuable context to make more informed decisions about the code you incorporate into your projects.
Make Informed Decisions with Code Sugg... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251705 lazyload" width="428" height="145" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAawAAACRAQMAAACllR4oAAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHklEQVRYhe3BAQEAAACCIP+vbkhAAQAAAAAAAMCNAR8nAAELy2GsAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/09/Screenshot-2024-12-04-134233-e1733348809166.png" alt="How Inline Return Values Simplify Debugging in Visual Studio 2022">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 4, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">7 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/how-inline-return-values-simplify-debugging-in-visual-studio-2022/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="How Inline Return Values Simplify Debugging in Visual Studio 2022">
How Inline Return Values Simplify Debugging in Visual Studio 2022 </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2021/07/Capture-1-150x150.png" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Harshada Hole">
</div>
<span class="fs-14">Harshada Hole</span>
</div> <p class="excerpt-body mt-16 mb-24">
Have you ever found yourself creating temporary variables just to inspect return values from functions? It’s a small task that can quickly become tedious, breaking your rhythm and cluttering up your code. Visual Studio 2022 introduces a smarter way to handle this with "Inline Return Values," allowing you to stay focused on coding without the extra steps.
This new feature allows you to view return values directly in your code, right where you need them. With Copilot integration, you can go a step further by analyzing the return values in real time. It simplifies understanding and verifying your code’s behav... </p>
</div>
</div>
</div><div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1">
<div class="masonry-thumbnail">
<img class="post-thumbnail wp-image-251632 lazyload" width="900" height="506" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4QAAAH6AQMAAABlNxDgAAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAT0lEQVR4nO3BMQEAAADCoPVPbQ0PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACARwPhVAABNta6CQAAAABJRU5ErkJggg==" data-src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/12/word-image-251631-1.png" alt="Introducing the Copy Git Permalink Feature in Visual Studio 17.12">
</div>
<div class="card-body">
<div class="card-top">
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
<div>
Dec 3, 2024 </div>
<div class="d-flex gap-12">
<div class="d-flex gap-4">
<div class="d-flex align-items-center clr-grey-61">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z" fill="#242424"></path>
</svg>
</div>
<div class="d-flex align-items-center clr-grey-61">1 </div>
</div>
</div>
</div>
<h3 class="fs-24 fw-600 mb-16">
<a href="https://devblogs.microsoft.com/visualstudio/introducing-the-copy-git-permalink-feature-in-visual-studio-17-12/" class="single-click excerpt-title" data-bi-id="blog_home_page_latest_posts_grid_card_singleclick" data-bi-name="Introducing the Copy Git Permalink Feature in Visual Studio 17.12">
Introducing the Copy Git Permalink Feature in Visual Studio 17.12 </a>
</h3>
<div class="d-flex gap-6 align-items-center">
<div class="avatar-parent">
<img src="https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2024/11/avatar_me-96x96.jpg" style="width: 20px; height: 20px;" class="avatar-20 rounded-pill a" alt="Jullyana Ramos">
</div>
<span class="fs-14">Jullyana Ramos</span>
</div> <p class="excerpt-body mt-16 mb-24">
We are excited to announce the release of the Copy Git Permalink feature in Visual Studio 17.12. This new functionality streamlines the process of sharing code references, enhancing collaboration and ensuring that critical context is preserved.
Effortless Code Sharing
If you’ve found yourself needing to share code snippets with colleagues, you know the challenges of preserving context. With the new Copy Git Permalink feature, you can now generate a permalink directly from Visual Studio to the remote repository. Simply select the desired code, right-click, and choose the “Copy Permalink” option under the Git s... </p>
</div>
</div>
</div> </div>
</section>
<div class="fs-16 d-flex justify-content-center mt-40">
<a href="javascript:" class="read-more btn-secondary" id="pload-more" data-bi-area="latest_posts" data-bi-id="blog_home_page_latest_posts_grid_load_more" data-bi-name="Load more posts" data-siteid="4">Load more posts</a>
</div>
<div id="loader-overlay" class="lp-loader" style="display:none;">
<div class="cv-spinner">
<span class="spinner"></span>
</div>
</div>
</div>
<aside class="p-12 bh-sidebar" data-bi-area="sidebar">
<!-- Sidebar CTA -->
<style>
.toggleWrapper:last-child {
border: none;
}
.toggleButton {
cursor: pointer;
border-radius: 4px;
}
</style>
<div class="border-bottom mb-40" data-bi-compnm="banner_sidebar" data-bi-id="blog_home_page_banner_sidebar" data-bi-hn="Code faster. Work smarter. Visual Studio 2022."><h2 class="fs-20 mb-8">Code faster. Work smarter. Visual Studio 2022.</h2><p class="mb-16">Visual Studio is the fastest IDE for productivity. Target any platform, any device.</p><a class="btn-primary d-inline-flex mb-40" href="https://visualstudio.microsoft.com/downloads/" target="_blank">Download Visual Studio</a></div>
<!-- trending topics -->
<div class="border-bottom mb-40">
<h2 class="fs-20 mb-16">Popular topics</h2>
<div class="d-flex flex-wrap gap-8 post-topics-list mb-40" data-bi-id="blog_home_page_sidebar_popular_topics">
<a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/net/">.NET</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/visual-studio/">Visual Studio</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/debug/">Debugging and Diagnostics</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/java/">Java</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/csharp/">C#</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/javascript/">JavaScript</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/html/">HTML</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/azure/">Azure</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/asp-net/">ASP.NET</a><a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/visualstudio/tag/visual-studio-2017/">Visual Studio 2017</a> </div>
</div>
<!-- Links -->
<div class="mb-40 pb-24 border-bottom">
<!-- First section -->
<div class="border-bottom mb-16 toggleWrapper" data-bi-id="blog_home_page_sidebar_relevant_links"><button class="btn-no-styles w-100 d-flex justify-content-between px-8 mb-16 toggleButton" aria-expanded="false" aria-controls="leftContentOther" data-bi-id="blog_home_page_sidebar_relevant_links_expand"><h2 class="fs-20">Relevant Links</h2><div class="toggleIcon d-flex align-items-center"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M7.64582 4.14708C7.84073 3.95147 8.15731 3.9509 8.35292 4.14582L13.8374 9.6108C14.0531 9.82574 14.0531 10.1751 13.8374 10.39L8.35292 15.855C8.15731 16.0499 7.84073 16.0493 7.64582 15.8537C7.4509 15.6581 7.45147 15.3415 7.64708 15.1466L12.8117 10.0004L7.64708 4.85418C7.45147 4.65927 7.4509 4.34269 7.64582 4.14708Z" fill="#242424"></path>
</svg></div></button><div id="leftContentOther" class="toggleContent px-8 pb-12 mb-16 scroll-bar" style="display: none;"><span class="card-text listdisplay cs-content"><ul>
<li><a href="https://visualstudio.microsoft.com/" target="_blank" rel="noopener">Visual Studio homepage</a></li>
<li><a href="https://learn.microsoft.com/visualstudio/" target="_blank" rel="noopener">Visual Studio documentation</a></li>
<li><a href="https://visualstudio.microsoft.com/dev-essentials/" target="_blank" rel="noopener">Visual Studio Dev Essentials</a></li>
<li><a href="https://azure.microsoft.com/" target="_blank" rel="noopener">Microsoft Azure</a></li>
</ul>
<p><strong>Visual Studio on YouTube</strong></p>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLReL099Y5nRc-zbaFbf0aNcIamBQujOxP" target="_blank">Visual Studio Tips & Tricks</a></li>
<li><a href="https://www.youtube.com/playlist?list=PLReL099Y5nReWwlUgypSKwptZm3ljLOhX" target="_blank">Visual Studio Toolbox</a></li>
<li><a href="https://www.youtube.com/playlist?list=PLReL099Y5nRem6UA4w849hTfd0LzBIsAk" target="_blank">Visual Studio Office Hours</a></li>
<li><a href="https://www.youtube.com/playlist?list=PLReL099Y5nRdG2n1PrY_tbCsUznoYvqkS" target="_blank">Writing extensions with Mads</a></li>
</ul>
</span></div></div>
<!-- Second section -->
<!-- Third section -->
<div class="border-bottom mb-16 toggleWrapper" data-bi-id="blog_home_page_sidebar_archive"><button class="btn-no-styles w-100 d-flex justify-content-between px-8 mb-16 toggleButton" aria-expanded="false" aria-controls="rightContentArchive" data-bi-id="blog_home_page_sidebar_archive_expand"><h2 class="fs-20">Archive</h2><div class="toggleIcon d-flex align-items-center"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="dark-theme" d="M7.64582 4.14708C7.84073 3.95147 8.15731 3.9509 8.35292 4.14582L13.8374 9.6108C14.0531 9.82574 14.0531 10.1751 13.8374 10.39L8.35292 15.855C8.15731 16.0499 7.84073 16.0493 7.64582 15.8537C7.4509 15.6581 7.45147 15.3415 7.64708 15.1466L12.8117 10.0004L7.64708 4.85418C7.45147 4.65927 7.4509 4.34269 7.64582 4.14708Z" fill="#242424"></path>
</svg></div></button><div id="rightContentArchive" class="toggleContent px-8 pb-32 scroll-bar" style="display: none;"><span class="card-text listdisplay"><ul class="ftr-archives" role="list"> <li><a href="https://devblogs.microsoft.com/visualstudio/2024/12/">December 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/11/">November 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/10/">October 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/09/">September 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/08/">August 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/07/">July 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/06/">June 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/05/">May 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/04/">April 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/03/">March 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/02/">February 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2024/01/">January 2024</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/12/">December 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/11/">November 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/10/">October 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/09/">September 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/08/">August 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/07/">July 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/06/">June 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/05/">May 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/04/">April 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/03/">March 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/02/">February 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2023/01/">January 2023</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/12/">December 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/11/">November 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/10/">October 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/09/">September 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/08/">August 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/07/">July 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/06/">June 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/05/">May 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/04/">April 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/03/">March 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/02/">February 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2022/01/">January 2022</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/12/">December 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/11/">November 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/10/">October 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/09/">September 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/08/">August 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/07/">July 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/06/">June 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/05/">May 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/04/">April 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/03/">March 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/02/">February 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2021/01/">January 2021</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/12/">December 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/11/">November 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/10/">October 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/09/">September 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/08/">August 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/07/">July 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/06/">June 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/05/">May 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/04/">April 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/03/">March 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/02/">February 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2020/01/">January 2020</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/12/">December 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/11/">November 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/10/">October 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/09/">September 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/08/">August 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/07/">July 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/06/">June 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/05/">May 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/04/">April 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/03/">March 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/02/">February 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2019/01/">January 2019</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/12/">December 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/11/">November 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/10/">October 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/09/">September 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/08/">August 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/07/">July 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/06/">June 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/05/">May 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/04/">April 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/03/">March 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/02/">February 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2018/01/">January 2018</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/12/">December 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/11/">November 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/10/">October 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/09/">September 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/08/">August 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/07/">July 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/06/">June 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/05/">May 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/04/">April 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/03/">March 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/02/">February 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2017/01/">January 2017</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/12/">December 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/11/">November 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/10/">October 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/08/">August 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/07/">July 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/06/">June 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/05/">May 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/04/">April 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/03/">March 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/02/">February 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2016/01/">January 2016</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/12/">December 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/11/">November 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/10/">October 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/09/">September 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/08/">August 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/07/">July 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/06/">June 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/05/">May 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/04/">April 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/03/">March 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/02/">February 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2015/01/">January 2015</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/12/">December 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/11/">November 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/10/">October 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/09/">September 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/08/">August 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/07/">July 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/06/">June 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/05/">May 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/04/">April 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/03/">March 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/02/">February 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2014/01/">January 2014</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/12/">December 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/11/">November 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/10/">October 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/09/">September 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/08/">August 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/07/">July 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/06/">June 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/05/">May 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/04/">April 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/03/">March 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2013/01/">January 2013</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/11/">November 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/10/">October 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/09/">September 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/08/">August 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/07/">July 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/06/">June 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/05/">May 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/04/">April 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/03/">March 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/02/">February 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2012/01/">January 2012</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/11/">November 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/10/">October 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/09/">September 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/08/">August 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/05/">May 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/04/">April 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/03/">March 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/02/">February 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2011/01/">January 2011</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/12/">December 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/11/">November 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/10/">October 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/09/">September 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/08/">August 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/07/">July 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/06/">June 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/05/">May 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/04/">April 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/03/">March 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/02/">February 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2010/01/">January 2010</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2009/12/">December 2009</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2009/11/">November 2009</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2009/10/">October 2009</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2009/09/">September 2009</a></li>
<li><a href="https://devblogs.microsoft.com/visualstudio/2009/03/">March 2009</a></li>
</ul></span></div></div>
<!-- Repeat the above structure for each toggle -->
</div>
<div class="mb-40">
<h2 class="fs-20 mb-16">Follow this blog</h2>
<div class="d-flex flex-wrap gap-20 mb-40" data-bi-hn="Follow this blog">
<a style="width: 24px; height: 24px; position: relative;" title="facebook" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Visual Studio Blog-facebook" aria-label="Follow Us on Facebook" target="_blank" href="https://www.facebook.com/visualstudio/"><img src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/images/social-icons/facebook.svg" alt="facebook"></a><a style="width: 24px; height: 24px; position: relative;" title="twitter" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Visual Studio Blog-twitter" aria-label="Follow Us on Twitter" target="_blank" href="https://twitter.com/VisualStudio"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path class="dark-theme" d="M14.4821 10.6218L21.0389 3H19.4852L13.7919 9.61788L9.24467 3H4L10.8763 13.0074L4 21H5.55384L11.5661 14.0113L16.3683 21H21.613L14.4817 10.6218H14.4821ZM12.3539 13.0956L11.6572 12.0991L6.11372 4.16971H8.50033L12.974 10.5689L13.6707 11.5655L19.4859 19.8835H17.0993L12.3539 13.096V13.0956Z"></path></svg></a><a style="width: 24px; height: 24px; position: relative;" title="linkedin" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Visual Studio Blog-linkedin" aria-label="Follow Us on LinkedIn" target="_blank" href="https://www.linkedin.com/showcase/microsoft-visual-studio/"><img src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/images/social-icons/linkedin.svg" alt="linkedin"></a><a style="width: 24px; height: 24px; position: relative;" title="youtube" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Visual Studio Blog-youtube" aria-label="Follow Us on YouTube" target="_blank" href="https://www.youtube.com/visualstudio"><img src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/images/social-icons/youtube.svg" alt="youtube"></a><a style="width: 24px; height: 24px; position: relative;" title="twitch" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Visual Studio Blog-twitch" aria-label="Follow Us on Twitch" target="_blank" href="https://www.twitch.tv/visualstudio"><img src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/images/social-icons/twitch.svg" alt="twitch"></a><a style="width: 24px; height: 24px; position: relative;" title="TikTok" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Visual Studio Blog-tiktok" aria-label="Follow Us on TikTok" target="_blank" href="https://www.tiktok.com/@visualstudio"><img src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/images/social-icons/tiktok.svg" alt="TikTok"></a><a style="width: 24px; height: 24px; position: relative;" title="RSS Feed" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Visual Studio Blog-rss-feed" aria-label="Subscribe to Our RSS Feed" target="_blank" href="https://devblogs.microsoft.com/visualstudio/feed/"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="dark-theme-rss">
<path class="dark-theme" d="M6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM6.75 7.5C6.34494 7.5 6 7.18276 6 6.7777V6.7233C6 6.33021 6.30507 6.00189 6.69816 6.00012L6.75 6C12.9632 6 18 11.0368 18 17.25L17.9999 17.3018C17.9981 17.6949 17.6698 18 17.2767 18H17.2223C16.8172 18 16.5 17.6551 16.5 17.25C16.5 11.8652 12.1348 7.5 6.75 7.5ZM13.294 18H13.2036C12.805 18 12.5 17.6486 12.5 17.25C12.5 14.0744 9.92564 11.5 6.75 11.5C6.35135 11.5 6 11.195 6 10.7964V10.706C6 10.3267 6.2871 10.0048 6.66639 10.0005C6.69422 10.0002 6.72209 10 6.75 10C10.7541 10 14 13.2459 14 17.25C14 17.2779 13.9998 17.3058 13.9995 17.3336C13.9952 17.7129 13.6733 18 13.294 18ZM7.5 18C6.67157 18 6 17.3284 6 16.5C6 15.6716 6.67157 15 7.5 15C8.32843 15 9 15.6716 9 16.5C9 17.3284 8.32843 18 7.5 18Z" fill="#DA3B01"></path>
</svg></a> </div>
<div class="newsletter-form w-100" id="subscribe_form" data-bi-area="sidebar" data-bi-id="blog_home_page_sidebar_stay_informed">
<h2 id="stayInformed" class="fs-20 fw-600 mb-8">Stay informed</h2>
<div class="fs-14 pb-16">Get notified when new posts are published.</div>
<form method="post" action="https://devblogs.microsoft.com/visualstudio?na=s" onsubmit="return newsletter_check(this)">
<input type="hidden" name="nlang" value="">
<div class="d-flex flex-row align-items-center gap-12 mb-12">
<div class="d-flex align-items-center justify-content-start flex-md-grow-1 bg-white" style="align-self: stretch; height: 32px; border-radius: 4px; overflow: hidden; border: 1px solid var(--clr-border); width: 90%;"> <input class="x-hidden-focus bg-white" style="flex: 1 1 0; align-self: stretch; border: none; padding: 4px 10px; font-family: Segoe UI; color: var(--clr-body);" type="email" name="ne" aria-labelledby="stayInformed" placeholder="Enter your email" required=""></div><div class="d-flex align-items-center justify-content-center">
<button class="tnp-submit btn-primary" type="submit" value="Subscribe">Subscribe</button>
</div>
</div>
<div class="tnp-privacy-field" style="font-size: 10px; line-height: 14px; word-wrap: break-word"><label>By subscribing you agree to our <a style="color: var(--clr-body-link); text-decoration: underline;" href="https://docs.microsoft.com/en-us/collaborate/terms-of-use" target="_blank">Terms of Use</a> and <a style="color: var(--clr-body-link); text-decoration: underline;" href="https://go.microsoft.com/fwlink/?LinkId=521839" target="_blank">Privacy</a></label></div>
</form>
</div></div> </aside>
<script>
document.addEventListener('DOMContentLoaded', function () {
let currentPage = 1;
// Reference the "Load More" button
const loadMoreButton = document.getElementById('pload-more');
const loaderOverlay = document.getElementById('loader-overlay');
const masonryContainer = document.querySelector('.masonry-container');
// Check the initial post count
const initialPosts = masonryContainer.querySelectorAll('.masonry-card'); // Adjust selector if needed
if (initialPosts.length < 8) {
loadMoreButton.style.display = 'none'; // Hide "Load More" button if 8 or fewer posts
}
// Add a click event listener for the "Load More" button
loadMoreButton.addEventListener('click', function () {
currentPage++; // Increment page number
const currentBlogId = loadMoreButton.getAttribute('data-siteid');
loadMoreButton.style.display = 'none'; // Hide "Load More Posts" text
// Prepare data to send in the POST request
const data = new FormData();
data.append('action', 'evo_pagination_load_more');
data.append('site_id', currentBlogId);
data.append('paged', currentPage);
// Show the preloader
loaderOverlay.style.display = 'block';
// Perform the AJAX request using fetch API
fetch(devblogs_ajax_evo.ajaxurl, {
method: 'POST',
body: data
})
.then(response => response.json())
.then(res => {
// Append new items to the masonry container
const tempDiv = document.createElement('div');
tempDiv.innerHTML = res.html;
const newItems = tempDiv.children;
Array.from(newItems).forEach(item => {
item.classList.add('hidden'); // Add the 'hidden' class initially
masonryContainer.appendChild(item);
// Use CSS transition after appending the item
setTimeout(() => {
item.classList.remove('hidden'); // Trigger the CSS transition
}, 100);
});
// Show the masonry container after the items are added
masonryContainer.style.opacity = 1;
// **Re-initialize Gifffer after new items are added**
setTimeout(() => {
if (typeof Gifffer === 'function') {
Gifffer(); // Reinitialize Gifffer for new images
}
}, 300); // Delay to ensure new elements are in the DOM
// Show the "Load More Posts" button again only if there are more pages
if (currentPage < res.max) {
loadMoreButton.style.display = 'block'; // Show "Load More Posts" text
}
// Hide the preloader after 500ms
setTimeout(() => {
loaderOverlay.style.display = 'none';
}, 500);
})
.catch(error => {
console.error('Error:', error);
// Show the "Load More Posts" button if an error occurs
loadMoreButton.style.display = 'block';
// Hide the preloader
loaderOverlay.style.display = 'none';
});
});
});
</script>
</div><!-- .container-sidebar-home -->
</div>
</div><!-- end .wrapper -->
</main><!-- end #main -->
<!-- Add a hidden dark theme button to trigger the toggle function -->
<div style="display:none;">
</div> <script>
// Get iframe youtube video length
var iframes = jQuery('iframe[src^="https://www.youtube.com/embed/"], iframe[src^="//www.youtube.com/embed/"], iframe[src^="http://www.youtube.com/embed/"], iframe[src^="www.youtube.com/embed/"], iframe[src^="youtube.com/embed/"], iframe[src^="https://www.youtube.com/"]');
var i, len;
len = iframes.length;
// Country JSON data
function funJSONData(countryData) {
if (countryData.Country == 'CN') {
if (len > 0) {
for (var i = 0; i < len; ++i) {
var el = iframes[i];
el.parentNode.removeChild(el);
}
}
}
}
jQuery(document).ready(function () {
// Remove youtube videos from page
});
</script>
<script type="text/javascript" id="commentsvote-js-extra">
/* <![CDATA[ */
var votecommentajax = {"ajaxurl":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-admin\/admin-ajax.php"};
/* ]]> */
</script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/devblogs-comments-evo/admin/js/commentsvote.js?ver=1.1" id="commentsvote-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/metronet-profile-picture/js/mpp-frontend.js?ver=2.6.3" id="mpp_gutenberg_tabs-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/devblogs-evo-breadcrumbs/assets/breadcrumbs-schema.js?ver=1733860699" id="evo-breadcrumb-schema-script-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/shortcode-toc/assets/vendor/js/anchorific.js?ver=1.0.3" id="anchorific-js"></script>
<script type="text/javascript" id="devblogs-evo-scripts-js-extra">
/* <![CDATA[ */
var devblogs_ajax2 = {"ajaxurl":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-admin\/admin-ajax.php"};
var devblogs_ajax_evo = {"ajaxurl":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-admin\/admin-ajax.php"};
/* ]]> */
</script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/theme.min.js?ver=1.2.0.1729015445" id="devblogs-evo-scripts-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/custom-theme.min.js?ver=1.1" id="custom-theme-js-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/alert-banner.min.js?ver=1724956583" id="alert-banner-js-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/theme-picker.min.js?ver=1731007193" id="theme-picker-script-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/dropdown-menu.min.js?ver=1729185945" id="dropdown-menu-script-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/accordion-toggle.min.js?ver=1727281833" id="accordion-toggle-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/themes/devblogs-evo/js/gifffer.min.js?ver=1.1" id="gifffer-js-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/wp-featherlight/js/wpFeatherlight.pkgd.min.js?ver=1.3.4" id="wp-featherlight-js"></script>
<script type="text/javascript" src="https://devblogs.microsoft.com/visualstudio/wp-content/plugins/devblogs-blocks/assets/highlight.js" id="highlight-script-js"></script>
<script type="text/javascript">(function (undefined) {let scriptOptions={"_localizedStrings":{"redirect_overlay_title":"Hold On","redirect_overlay_text":"You are being redirected to another page,<br>it may take a few seconds.","webview_notification_text":"The selected provider doesn't support embedded browsers!"},"_targetWindow":"prefer-popup","_redirectOverlay":"overlay-with-spinner-and-message","_unsupportedWebviewBehavior":""};
/**
* Used when Cross-Origin-Opener-Policy blocked the access to the opener. We can't have a reference of the opened windows, so we should attempt to refresh only the windows that has opened popups.
*/
window._nslHasOpenedPopup = false;
window._nslWebViewNoticeElement = null;
window.NSLPopup = function (url, title, w, h) {
const userAgent = navigator.userAgent,
mobile = function () {
return /\b(iPhone|iP[ao]d)/.test(userAgent) ||
/\b(iP[ao]d)/.test(userAgent) ||
/Android/i.test(userAgent) ||
/Mobile/i.test(userAgent);
},
screenX = window.screenX !== undefined ? window.screenX : window.screenLeft,
screenY = window.screenY !== undefined ? window.screenY : window.screenTop,
outerWidth = window.outerWidth !== undefined ? window.outerWidth : document.documentElement.clientWidth,
outerHeight = window.outerHeight !== undefined ? window.outerHeight : document.documentElement.clientHeight - 22,
targetWidth = mobile() ? null : w,
targetHeight = mobile() ? null : h,
left = parseInt(screenX + (outerWidth - targetWidth) / 2, 10),
right = parseInt(screenY + (outerHeight - targetHeight) / 2.5, 10),
features = [];
if (targetWidth !== null) {
features.push('width=' + targetWidth);
}
if (targetHeight !== null) {
features.push('height=' + targetHeight);
}
features.push('left=' + left);
features.push('top=' + right);
features.push('scrollbars=1');
const newWindow = window.open(url, title, features.join(','));
if (window.focus) {
newWindow.focus();
}
window._nslHasOpenedPopup = true;
return newWindow;
};
let isWebView = null;
function checkWebView() {
if (isWebView === null) {
function _detectOS(ua) {
if (/Android/.test(ua)) {
return "Android";
} else if (/iPhone|iPad|iPod/.test(ua)) {
return "iOS";
} else if (/Windows/.test(ua)) {
return "Windows";
} else if (/Mac OS X/.test(ua)) {
return "Mac";
} else if (/CrOS/.test(ua)) {
return "Chrome OS";
} else if (/Firefox/.test(ua)) {
return "Firefox OS";
}
return "";
}
function _detectBrowser(ua) {
let android = /Android/.test(ua);
if (/Opera Mini/.test(ua) || / OPR/.test(ua) || / OPT/.test(ua)) {
return "Opera";
} else if (/CriOS/.test(ua)) {
return "Chrome for iOS";
} else if (/Edge/.test(ua)) {
return "Edge";
} else if (android && /Silk\//.test(ua)) {
return "Silk";
} else if (/Chrome/.test(ua)) {
return "Chrome";
} else if (/Firefox/.test(ua)) {
return "Firefox";
} else if (android) {
return "AOSP";
} else if (/MSIE|Trident/.test(ua)) {
return "IE";
} else if (/Safari\//.test(ua)) {
return "Safari";
} else if (/AppleWebKit/.test(ua)) {
return "WebKit";
}
return "";
}
function _detectBrowserVersion(ua, browser) {
if (browser === "Opera") {
return /Opera Mini/.test(ua) ? _getVersion(ua, "Opera Mini/") :
/ OPR/.test(ua) ? _getVersion(ua, " OPR/") :
_getVersion(ua, " OPT/");
} else if (browser === "Chrome for iOS") {
return _getVersion(ua, "CriOS/");
} else if (browser === "Edge") {
return _getVersion(ua, "Edge/");
} else if (browser === "Chrome") {
return _getVersion(ua, "Chrome/");
} else if (browser === "Firefox") {
return _getVersion(ua, "Firefox/");
} else if (browser === "Silk") {
return _getVersion(ua, "Silk/");
} else if (browser === "AOSP") {
return _getVersion(ua, "Version/");
} else if (browser === "IE") {
return /IEMobile/.test(ua) ? _getVersion(ua, "IEMobile/") :
/MSIE/.test(ua) ? _getVersion(ua, "MSIE ")
:
_getVersion(ua, "rv:");
} else if (browser === "Safari") {
return _getVersion(ua, "Version/");
} else if (browser === "WebKit") {
return _getVersion(ua, "WebKit/");
}
return "0.0.0";
}
function _getVersion(ua, token) {
try {
return _normalizeSemverString(ua.split(token)[1].trim().split(/[^\w\.]/)[0]);
} catch (o_O) {
}
return "0.0.0";
}
function _normalizeSemverString(version) {
const ary = version.split(/[\._]/);
return (parseInt(ary[0], 10) || 0) + "." +
(parseInt(ary[1], 10) || 0) + "." +
(parseInt(ary[2], 10) || 0);
}
function _isWebView(ua, os, browser, version, options) {
switch (os + browser) {
case "iOSSafari":
return false;
case "iOSWebKit":
return _isWebView_iOS(options);
case "AndroidAOSP":
return false;
case "AndroidChrome":
return parseFloat(version) >= 42 ? /; wv/.test(ua) : /\d{2}\.0\.0/.test(version) ? true : _isWebView_Android(options);
}
return false;
}
function _isWebView_iOS(options) {
const document = (window["document"] || {});
if ("WEB_VIEW" in options) {
return options["WEB_VIEW"];
}
return !("fullscreenEnabled" in document || "webkitFullscreenEnabled" in document || false);
}
function _isWebView_Android(options) {
if ("WEB_VIEW" in options) {
return options["WEB_VIEW"];
}
return !("requestFileSystem" in window || "webkitRequestFileSystem" in window || false);
}
const options = {},
nav = window.navigator || {},
ua = nav.userAgent || "",
os = _detectOS(ua),
browser = _detectBrowser(ua),
browserVersion = _detectBrowserVersion(ua, browser);
isWebView = _isWebView(ua, os, browser, browserVersion, options);
}
return isWebView;
}
function isAllowedWebViewForUserAgent(provider) {
const facebookAllowedWebViews = [
'Instagram',
'FBAV',
'FBAN'
];
let whitelist = [];
if (provider && provider === 'facebook') {
whitelist = facebookAllowedWebViews;
}
const nav = window.navigator || {},
ua = nav.userAgent || "";
if (whitelist.length && ua.match(new RegExp(whitelist.join('|')))) {
return true;
}
return false;
}
function disableButtonInWebView(providerButtonElement) {
if (providerButtonElement) {
providerButtonElement.classList.add('nsl-disabled-provider');
providerButtonElement.setAttribute('href', '#');
providerButtonElement.addEventListener('pointerdown', (e) => {
if (!window._nslWebViewNoticeElement) {
window._nslWebViewNoticeElement = document.createElement('div');
window._nslWebViewNoticeElement.id = "nsl-notices-fallback";
window._nslWebViewNoticeElement.addEventListener('pointerdown', function (e) {
this.parentNode.removeChild(this);
window._nslWebViewNoticeElement = null;
});
const webviewNoticeHTML = '<div class="error"><p>' + scriptOptions._localizedStrings.webview_notification_text + '</p></div>';
window._nslWebViewNoticeElement.insertAdjacentHTML("afterbegin", webviewNoticeHTML);
document.body.appendChild(window._nslWebViewNoticeElement);
}
});
}
}
window._nslDOMReady(function () {
window.nslRedirect = function (url) {
if (scriptOptions._redirectOverlay) {
const overlay = document.createElement('div');
overlay.id = "nsl-redirect-overlay";
let overlayHTML = '';
const overlayContainer = "<div id='nsl-redirect-overlay-container'>",
overlayContainerClose = "</div>",
overlaySpinner = "<div id='nsl-redirect-overlay-spinner'></div>",
overlayTitle = "<p id='nsl-redirect-overlay-title'>" + scriptOptions._localizedStrings.redirect_overlay_title + "</p>",
overlayText = "<p id='nsl-redirect-overlay-text'>" + scriptOptions._localizedStrings.redirect_overlay_text + "</p>";
switch (scriptOptions._redirectOverlay) {
case "overlay-only":
break;
case "overlay-with-spinner":
overlayHTML = overlayContainer + overlaySpinner + overlayContainerClose;
break;
default:
overlayHTML = overlayContainer + overlaySpinner + overlayTitle + overlayText + overlayContainerClose;
break;
}
overlay.insertAdjacentHTML("afterbegin", overlayHTML);
document.body.appendChild(overlay);
}
window.location = url;
};
let targetWindow = scriptOptions._targetWindow || 'prefer-popup',
lastPopup = false;
const buttonLinks = document.querySelectorAll(' a[data-plugin="nsl"][data-action="connect"], a[data-plugin="nsl"][data-action="link"]');
buttonLinks.forEach(function (buttonLink) {
buttonLink.addEventListener('click', function (e) {
if (lastPopup && !lastPopup.closed) {
e.preventDefault();
lastPopup.focus();
} else {
let href = this.href,
success = false;
if (href.indexOf('?') !== -1) {
href += '&';
} else {
href += '?';
}
const redirectTo = this.dataset.redirect;
if (redirectTo === 'current') {
href += 'redirect=' + encodeURIComponent(window.location.href) + '&';
} else if (redirectTo && redirectTo !== '') {
href += 'redirect=' + encodeURIComponent(redirectTo) + '&';
}
if (targetWindow !== 'prefer-same-window' && checkWebView()) {
targetWindow = 'prefer-same-window';
}
if (targetWindow === 'prefer-popup') {
lastPopup = NSLPopup(href + 'display=popup', 'nsl-social-connect', this.dataset.popupwidth, this.dataset.popupheight);
if (lastPopup) {
success = true;
e.preventDefault();
}
} else if (targetWindow === 'prefer-new-tab') {
const newTab = window.open(href + 'display=popup', '_blank');
if (newTab) {
if (window.focus) {
newTab.focus();
}
success = true;
window._nslHasOpenedPopup = true;
e.preventDefault();
}
}
if (!success) {
window.location = href;
e.preventDefault();
}
}
});
});
let buttonCountChanged = false;
const googleLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="google"]');
if (googleLoginButtons.length && checkWebView()) {
googleLoginButtons.forEach(function (googleLoginButton) {
if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') {
disableButtonInWebView(googleLoginButton);
} else {
googleLoginButton.remove();
buttonCountChanged = true;
}
});
}
const facebookLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="facebook"]');
if (facebookLoginButtons.length && checkWebView() && /Android/.test(window.navigator.userAgent) && !isAllowedWebViewForUserAgent('facebook')) {
facebookLoginButtons.forEach(function (facebookLoginButton) {
if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') {
disableButtonInWebView(facebookLoginButton);
} else {
facebookLoginButton.remove();
buttonCountChanged = true;
}
});
}
const separators = document.querySelectorAll('div.nsl-separator');
if (buttonCountChanged && separators.length) {
separators.forEach(function (separator) {
const separatorParentNode = separator.parentNode;
if (separatorParentNode) {
const separatorButtonContainer = separatorParentNode.querySelector('div.nsl-container-buttons');
if (separatorButtonContainer && !separatorButtonContainer.hasChildNodes()) {
separator.remove();
}
}
})
}
});
/**
* Cross-Origin-Opener-Policy blocked the access to the opener
*/
if (typeof BroadcastChannel === "function") {
const _nslLoginBroadCastChannel = new BroadcastChannel('nsl_login_broadcast_channel');
_nslLoginBroadCastChannel.onmessage = (event) => {
if (window?._nslHasOpenedPopup && event.data?.action === 'redirect') {
window._nslHasOpenedPopup = false;
const url = event.data?.href;
_nslLoginBroadCastChannel.close();
if (typeof window.nslRedirect === 'function') {
window.nslRedirect(url);
} else {
window.opener.location = url;
}
}
};
}})();</script> <!-- Model form for code insert -->
<div class="modal fade" id="codeModal" tabindex="-1" role="dialog" aria-labelledby="codeModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="codeModalLabel">Code Block</h5>
<button type="button" class="close" onclick="myCodeCancelFunction()" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<form id="myForm" action="#">
<div class="modal-body">
<div class="form-group">
<label for="code-text">Paste your code snippet</label>
<textarea class="form-control" id="code-text" style="height: 150px;"></textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" onclick="myCodeFunction()" class="btn btn-primary">Ok</button>
<button type="button" name="Cancel" onclick="myCodeCancelFunction()" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
</div>
</form>
</div>
</div>
</div>
<div class="back-comment-buttons" data-bi-area="sidebar">
<style>
.evo-right-sidebar {
position: fixed !important;
right: 10px;
bottom: 188px;
}
.evo-sidebar-button {
display: none;
visibility: hidden;
padding: 0;
z-index: 99999;
border-radius: 50%;
margin-bottom: 1rem;
}
.evo-sidebar-button:hover {
text-decoration: none;
}
.evo-sidebar-button.active {
display: flex;
visibility: visible;
}
.evo-sidebar-button-inner {
padding: 5px 8.5px;
border-radius: 50%;
background: var(--clr-card-bg);
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.14), 0px 0px 2px 0px rgba(0, 0, 0, 0.12);
color: var(--clr-landing-navbar);
}
.evo-sidebar-button-inner i,
.evo-sidebar-button-inner i::before {
color: var(--clr-landing-navbar);
}
</style>
<div class="evo-right-sidebar">
<a data-bi-id="click back to top of page" data-bi-name="Back to top" href="#page" title="Back to top" aria-label="click back to top of page" class="evo-sidebar-button back-to-top">
<span class="evo-sidebar-button-inner">
<svg width="30" height="30" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M39.5607 32.0607C38.9749 32.6464 38.0251 32.6464 37.4393 32.0607L24 18.6213L10.5607 32.0607C9.97487 32.6464 9.02513 32.6464 8.43934 32.0607C7.85355 31.4749 7.85355 30.5251 8.43934 29.9393L22.9393 15.4393C23.5251 14.8536 24.4749 14.8536 25.0607 15.4393L39.5607 29.9393C40.1464 30.5251 40.1464 31.4749 39.5607 32.0607Z" fill="currentColor"></path>
</svg>
</span>
</a>
</div>
</div>
<!-- Usabilla feedback button -->
<div id="usabilla-button" class="vscom-usabilla-button">
<a tabindex="0" id="usbl-integrated-button" data-bi-area="sidebar" data-bi-id="Usabilla feedback button" data-bi-name="Usabilla feedback button" href="javascript:" class="vscom-usabilla-link" role="button" onkeypress="if(event.keyCode==32||event.keyCode==13){event.preventDefault();var bt = document.getElementById('usbl-integrated-button');bt.click(event);};">
<p class="vscom-usabilla-text">
Feedback </p>
</a>
</div>
<script type="text/javascript">
/*{literal}<![CDATA[*/
window.lightningjs || function (c) { function g(b, d) { d && (d += (/\?/.test(d) ? "&" : "?") + "lv=1"); c[b] || function () { var i = window, h = document, j = b, g = h.location.protocol, l = "load", k = 0; (function () { function b() { a.P(l); a.w = 1; c[j]("_load") } c[j] = function () { function m() { m.id = e; return c[j].apply(m, arguments) } var b, e = ++k; b = this && this != i ? this.id || 0 : 0; (a.s = a.s || []).push([e, b, arguments]); m.then = function (b, c, h) { var d = a.fh[e] = a.fh[e] || [], j = a.eh[e] = a.eh[e] || [], f = a.ph[e] = a.ph[e] || []; b && d.push(b); c && j.push(c); h && f.push(h); return m }; return m }; var a = c[j]._ = {}; a.fh = {}; a.eh = {}; a.ph = {}; a.l = d ? d.replace(/^\/\//, (g == "https:" ? g : "http:") + "//") : d; a.p = { 0: +new Date }; a.P = function (b) { a.p[b] = new Date - a.p[0] }; a.w && b(); i.addEventListener ? i.addEventListener(l, b, !1) : i.attachEvent("on" + l, b); var q = function () { function b() { return ["<head></head><", c, ' onload="var d=', n, ";d.getElementsByTagName('head')[0].", d, "(d.", g, "('script')).", i, "='", a.l, "'\"></", c, ">"].join("") } var c = "body", e = h[c]; if (!e) return setTimeout(q, 100); a.P(1); var d = "appendChild", g = "createElement", i = "src", k = h[g]("div"), l = k[d](h[g]("div")), f = h[g]("iframe"), n = "document", p; k.style.display = "none"; e.insertBefore(k, e.firstChild).id = o + "-" + j; f.frameBorder = "0"; f.id = o + "-frame-" + j; /MSIE[ ]+6/.test(navigator.userAgent) && (f[i] = "javascript:false"); f.allowTransparency = "true"; l[d](f); try { f.contentWindow[n].open() } catch (s) { a.domain = h.domain, p = "javascript:var d=" + n + ".open();d.domain='" + h.domain + "';", f[i] = p + "void(0);" } try { var r = f.contentWindow[n]; r.write(b()); r.close() } catch (t) { f[i] = p + 'd.write("' + b().replace(/"/g, String.fromCharCode(92) + '"') + '");d.close();' } a.P(2) }; a.l && setTimeout(q, 0) })() }(); c[b].lv = "1"; return c[b] } var o = "lightningjs", k = window[o] = g(o); k.require = g; k.modules = c }({});
if (!navigator.userAgent.match(/Android|BlackBerry|BB10|iPhone|iPad|iPod|Opera Mini|IEMobile/i)) { window.usabilla_live = lightningjs.require("usabilla_live", "//w.usabilla.com/2a41eea4c9e1.js"); } else { window.usabilla_live = lightningjs.require("usabilla_live", "//w.usabilla.com/29d0684d6043.js"); }
window.usabilla_live("hide");
document.getElementById("usbl-integrated-button").addEventListener("click", function () {
window.usabilla_live("click");
});
/*]]>{/literal}*/
// Store the element that triggered the modal
let triggerElement;
jQuery(document).ready(function () {
// Hook into Featherlight's beforeOpen event to capture the trigger element
jQuery(document).on('click', '[data-featherlight]', function (event) {
// Save the element that triggered the Featherlight modal
triggerElement = jQuery(this);
});
// Hook into the afterClose event to return focus to the trigger element
jQuery.featherlight.defaults.afterClose = function () {
if (triggerElement) {
triggerElement.focus(); // Return focus to the element that triggered the modal
}
};
});
</script>
<!-- UHF footer -->
<div id="footerArea" class="uhf" data-m="{"cN":"footerArea","cT":"Area_coreuiArea","id":"a2Body","sN":2,"aN":"Body"}">
<div id="footerRegion" data-region-key="footerregion" data-m="{"cN":"footerRegion","cT":"Region_coreui-region","id":"r1a2","sN":1,"aN":"a2"}">
<div id="footerUniversalFooter" data-m="{"cN":"footerUniversalFooter","cT":"Module_coreui-universalfooter","id":"m1r1a2","sN":1,"aN":"r1a2"}" data-module-id="Category|footerRegion|coreui-region|footerUniversalFooter|coreui-universalfooter">
<footer id="uhf-footer" class="c-uhff context-uhf" data-uhf-mscc-rq="false" data-footer-footprint="/DEV_Blogs/DEV_BlogsFooter, fromService: True" data-m="{"cN":"Uhf footer_cont","cT":"Container","id":"c1m1r1a2","sN":1,"aN":"m1r1a2"}">
<nav class="c-uhff-nav" aria-label="Footer Resource links" data-m="{"cN":"Footer nav_cont","cT":"Container","id":"c1c1m1r1a2","sN":1,"aN":"c1m1r1a2"}">
<div class="c-uhff-nav-row">
<div class="c-uhff-nav-group" data-m="{"cN":"footerNavColumn1_cont","cT":"Container","id":"c1c1c1m1r1a2","sN":1,"aN":"c1c1m1r1a2"}">
<div class="c-heading-4" role="heading" aria-level="2">What's new</div>
<ul class="c-list f-bare">
<li>
<a aria-label="Surface Pro What's new" class="c-uhff-link" href="https://www.microsoft.com/en-us/surface/devices/surface-pro-11th-edition" data-m="{"cN":"Footer_WhatsNew_NewSurfacePro_nav","id":"n1c1c1c1m1r1a2","sN":1,"aN":"c1c1c1m1r1a2"}" target="_blank">Surface Pro</a>
</li>
<li>
<a aria-label="Surface Laptop What's new" class="c-uhff-link" href="https://www.microsoft.com/en-us/surface/devices/surface-laptop-7th-edition" data-m="{"cN":"Footer_WhatsNew_SurfaceLaptop_nav","id":"n2c1c1c1m1r1a2","sN":2,"aN":"c1c1c1m1r1a2"}" target="_blank">Surface Laptop</a>
</li>
<li>
<a aria-label="Surface Laptop Studio 2 What's new" class="c-uhff-link" href="https://www.microsoft.com/en-us/d/Surface-Laptop-Studio-2/8rqr54krf1dz" data-m="{"cN":"Footer_WhatsNew_SurfaceLaptopStudio2_nav","id":"n3c1c1c1m1r1a2","sN":3,"aN":"c1c1c1m1r1a2"}" target="_blank">Surface Laptop Studio 2</a>
</li>
<li>
<a aria-label="Surface Laptop Go 3 What's new" class="c-uhff-link" href="https://www.microsoft.com/en-us/d/Surface-Laptop-Go-3/8p0wwgj6c6l2" data-m="{"cN":"Footer_WhatsNew_SurfaceLaptopGo3_nav","id":"n4c1c1c1m1r1a2","sN":4,"aN":"c1c1c1m1r1a2"}" target="_blank">Surface Laptop Go 3</a>
</li>
<li>
<a aria-label="Microsoft Copilot What's new" class="c-uhff-link" href="https://www.microsoft.com/en-us/microsoft-copilot" data-m="{"cN":"Footer_WhatsNew_CopilotMicrosoft_nav","id":"n5c1c1c1m1r1a2","sN":5,"aN":"c1c1c1m1r1a2"}" target="_blank">Microsoft Copilot</a>
</li>
<li>
<a aria-label="AI in Windows What's new" class="c-uhff-link" href="https://www.microsoft.com/en-us/windows/copilot-ai-features" data-m="{"cN":"Whatsnew_AIinWindows_nav","id":"n6c1c1c1m1r1a2","sN":6,"aN":"c1c1c1m1r1a2"}" target="_blank">AI in Windows</a>
</li>
<li>
<a aria-label="Explore Microsoft products What's new" class="c-uhff-link" href="https://www.microsoft.com/en-us/microsoft-products-and-apps" data-m="{"cN":"Footer_WhatsNew_ExploreMicrosoftProducts_nav","id":"n7c1c1c1m1r1a2","sN":7,"aN":"c1c1c1m1r1a2"}" target="_blank">Explore Microsoft products</a>
</li>
<li>
<a aria-label="Windows 11 apps What's new" class="c-uhff-link" href="https://www.microsoft.com/windows/windows-11-apps" data-m="{"cN":"Footer_WhatsNew_Windows_11_apps_nav","id":"n8c1c1c1m1r1a2","sN":8,"aN":"c1c1c1m1r1a2"}" target="_blank">Windows 11 apps</a>
</li>
</ul>
</div>
<div class="c-uhff-nav-group" data-m="{"cN":"footerNavColumn2_cont","cT":"Container","id":"c2c1c1m1r1a2","sN":2,"aN":"c1c1m1r1a2"}">
<div class="c-heading-4" role="heading" aria-level="2">Microsoft Store</div>
<ul class="c-list f-bare">
<li>
<a aria-label="Account profile Microsoft Store" class="c-uhff-link" href="https://account.microsoft.com/" data-m="{"cN":"Footer_StoreandSupport_AccountProfile_nav","id":"n1c2c1c1m1r1a2","sN":1,"aN":"c2c1c1m1r1a2"}" target="_blank">Account profile</a>
</li>
<li>
<a aria-label="Download Center Microsoft Store" class="c-uhff-link" href="https://www.microsoft.com/en-us/download" data-m="{"cN":"Footer_StoreandSupport_DownloadCenter_nav","id":"n2c2c1c1m1r1a2","sN":2,"aN":"c2c1c1m1r1a2"}" target="_blank">Download Center</a>
</li>
<li>
<a aria-label="Microsoft Store support Microsoft Store" class="c-uhff-link" href="https://go.microsoft.com/fwlink/?linkid=2139749" data-m="{"cN":"Footer_StoreandSupport_SalesAndSupport_nav","id":"n3c2c1c1m1r1a2","sN":3,"aN":"c2c1c1m1r1a2"}" target="_blank">Microsoft Store support</a>
</li>
<li>
<a aria-label="Returns Microsoft Store" class="c-uhff-link" href="https://www.microsoft.com/en-us/store/b/returns" data-m="{"cN":"Footer_StoreandSupport_Returns_nav","id":"n4c2c1c1m1r1a2","sN":4,"aN":"c2c1c1m1r1a2"}" target="_blank">Returns</a>
</li>
<li>
<a aria-label="Order tracking Microsoft Store" class="c-uhff-link" href="https://www.microsoft.com/en-us/store/b/order-tracking" data-m="{"cN":"Footer_StoreandSupport_OrderTracking_nav","id":"n5c2c1c1m1r1a2","sN":5,"aN":"c2c1c1m1r1a2"}" target="_blank">Order tracking</a>
</li>
<li>
<a aria-label="Certified Refurbished Microsoft Store" class="c-uhff-link" href="https://www.microsoft.com/en-us/store/b/certified-refurbished-products" data-m="{"cN":"Footer_StoreandSupport_StoreLocations_nav","id":"n6c2c1c1m1r1a2","sN":6,"aN":"c2c1c1m1r1a2"}" target="_blank">Certified Refurbished</a>
</li>
<li>
<a aria-label="Microsoft Store Promise Microsoft Store" class="c-uhff-link" href="https://www.microsoft.com/en-us/store/b/why-microsoft-store?icid=footer_why-msft-store_7102020" data-m="{"cN":"Footer_StoreandSupport_MicrosoftPromise_nav","id":"n7c2c1c1m1r1a2","sN":7,"aN":"c2c1c1m1r1a2"}" target="_blank">Microsoft Store Promise</a>
</li>
<li>
<a aria-label="Flexible Payments Microsoft Store" class="c-uhff-link" href="https://www.microsoft.com/en-us/store/b/payment-financing-options?icid=footer_financing_vcc" data-m="{"cN":"Footer_StoreandSupport_Financing_nav","id":"n8c2c1c1m1r1a2","sN":8,"aN":"c2c1c1m1r1a2"}" target="_blank">Flexible Payments</a>
</li>
</ul>
</div>
<div class="c-uhff-nav-group" data-m="{"cN":"footerNavColumn3_cont","cT":"Container","id":"c3c1c1m1r1a2","sN":3,"aN":"c1c1m1r1a2"}">
<div class="c-heading-4" role="heading" aria-level="2">Education</div>
<ul class="c-list f-bare">
<li>
<a aria-label="Microsoft in education Education" class="c-uhff-link" href="https://www.microsoft.com/en-us/education" data-m="{"cN":"Footer_Education_MicrosoftInEducation_nav","id":"n1c3c1c1m1r1a2","sN":1,"aN":"c3c1c1m1r1a2"}" target="_blank">Microsoft in education</a>
</li>
<li>
<a aria-label="Devices for education Education" class="c-uhff-link" href="https://www.microsoft.com/en-us/education/devices/overview" data-m="{"cN":"Footer_Education_DevicesforEducation_nav","id":"n2c3c1c1m1r1a2","sN":2,"aN":"c3c1c1m1r1a2"}" target="_blank">Devices for education</a>
</li>
<li>
<a aria-label="Microsoft Teams for Education Education" class="c-uhff-link" href="https://www.microsoft.com/en-us/education/products/teams" data-m="{"cN":"Footer_Education_MicrosoftTeamsforEducation_nav","id":"n3c3c1c1m1r1a2","sN":3,"aN":"c3c1c1m1r1a2"}" target="_blank">Microsoft Teams for Education</a>
</li>
<li>
<a aria-label="Microsoft 365 Education Education" class="c-uhff-link" href="https://www.microsoft.com/en-us/education/products/microsoft-365" data-m="{"cN":"Footer_Education_Microsoft365Education_nav","id":"n4c3c1c1m1r1a2","sN":4,"aN":"c3c1c1m1r1a2"}" target="_blank">Microsoft 365 Education</a>
</li>
<li>
<a aria-label="How to buy for your school Education" class="c-uhff-link" href="https://www.microsoft.com/education/how-to-buy" data-m="{"cN":"Footer_Howtobuyforyourschool_nav","id":"n5c3c1c1m1r1a2","sN":5,"aN":"c3c1c1m1r1a2"}" target="_blank">How to buy for your school</a>
</li>
<li>
<a aria-label="Educator training and development Education" class="c-uhff-link" href="https://education.microsoft.com/" data-m="{"cN":"Footer_Education_EducatorTrainingDevelopment_nav","id":"n6c3c1c1m1r1a2","sN":6,"aN":"c3c1c1m1r1a2"}" target="_blank">Educator training and development</a>
</li>
<li>
<a aria-label="Deals for students and parents Education" class="c-uhff-link" href="https://www.microsoft.com/en-us/store/b/education" data-m="{"cN":"Footer_Education_DealsForStudentsandParents_nav","id":"n7c3c1c1m1r1a2","sN":7,"aN":"c3c1c1m1r1a2"}" target="_blank">Deals for students and parents</a>
</li>
<li>
<a aria-label="Azure for students Education" class="c-uhff-link" href="https://azure.microsoft.com/en-us/free/students/" data-m="{"cN":"Footer_Education_Azureforstudents_nav","id":"n8c3c1c1m1r1a2","sN":8,"aN":"c3c1c1m1r1a2"}" target="_blank">Azure for students</a>
</li>
</ul>
</div>
</div>
<div class="c-uhff-nav-row">
<div class="c-uhff-nav-group" data-m="{"cN":"footerNavColumn4_cont","cT":"Container","id":"c4c1c1m1r1a2","sN":4,"aN":"c1c1m1r1a2"}">
<div class="c-heading-4" role="heading" aria-level="2">Business</div>
<ul class="c-list f-bare">
<li>
<a aria-label="Microsoft Cloud Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/microsoft-cloud" data-m="{"cN":"Footer_Business_Microsoft_Cloud_nav","id":"n1c4c1c1m1r1a2","sN":1,"aN":"c4c1c1m1r1a2"}" target="_blank">Microsoft Cloud</a>
</li>
<li>
<a aria-label="Microsoft Security Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/security" data-m="{"cN":"Footer_Business_Microsoft Security_nav","id":"n2c4c1c1m1r1a2","sN":2,"aN":"c4c1c1m1r1a2"}" target="_blank">Microsoft Security</a>
</li>
<li>
<a aria-label="Dynamics 365 Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/dynamics-365" data-m="{"cN":"Footer_Business_MicrosoftDynamics365_nav","id":"n3c4c1c1m1r1a2","sN":3,"aN":"c4c1c1m1r1a2"}" target="_blank">Dynamics 365</a>
</li>
<li>
<a aria-label="Microsoft 365 Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/microsoft-365/business" data-m="{"cN":"Footer_Business_M365_nav","id":"n4c4c1c1m1r1a2","sN":4,"aN":"c4c1c1m1r1a2"}" target="_blank">Microsoft 365</a>
</li>
<li>
<a aria-label="Microsoft Power Platform Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/power-platform" data-m="{"cN":"Footer_DeveloperAndIT_Power Platform_nav","id":"n5c4c1c1m1r1a2","sN":5,"aN":"c4c1c1m1r1a2"}" target="_blank">Microsoft Power Platform</a>
</li>
<li>
<a aria-label="Microsoft Teams Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/microsoft-teams/group-chat-software" data-m="{"cN":"Footer_Business_Microsoft365_nav","id":"n6c4c1c1m1r1a2","sN":6,"aN":"c4c1c1m1r1a2"}" target="_blank">Microsoft Teams</a>
</li>
<li>
<a aria-label="Microsoft 365 Copilot Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/microsoft-365/copilot/copilot-for-work" data-m="{"cN":"Footer_CopilotMicrosoft365_nav","id":"n7c4c1c1m1r1a2","sN":7,"aN":"c4c1c1m1r1a2"}" target="_blank">Microsoft 365 Copilot</a>
</li>
<li>
<a aria-label="Small Business Business" class="c-uhff-link" href="https://www.microsoft.com/en-us/store/b/business?icid=CNavBusinessStore" data-m="{"cN":"Footer_Business-SmallBusiness_nav","id":"n8c4c1c1m1r1a2","sN":8,"aN":"c4c1c1m1r1a2"}" target="_blank">Small Business</a>
</li>
</ul>
</div>
<div class="c-uhff-nav-group" data-m="{"cN":"footerNavColumn5_cont","cT":"Container","id":"c5c1c1m1r1a2","sN":5,"aN":"c1c1m1r1a2"}">
<div class="c-heading-4" role="heading" aria-level="2">Developer & IT</div>
<ul class="c-list f-bare">
<li>
<a aria-label="Azure Developer & IT" class="c-uhff-link" href="https://azure.microsoft.com/en-us/" data-m="{"cN":"Footer_DeveloperAndIT_MicrosoftAzure_nav","id":"n1c5c1c1m1r1a2","sN":1,"aN":"c5c1c1m1r1a2"}" target="_blank">Azure</a>
</li>
<li>
<a aria-label="Developer Center Developer & IT" class="c-uhff-link" href="https://developer.microsoft.com/en-us/" data-m="{"cN":"Footer_DeveloperAndIT_DeveloperCenter_nav","id":"n2c5c1c1m1r1a2","sN":2,"aN":"c5c1c1m1r1a2"}" target="_blank">Developer Center</a>
</li>
<li>
<a aria-label="Documentation Developer & IT" class="c-uhff-link" href="https://learn.microsoft.com/docs/" data-m="{"cN":"Footer_DeveloperAndIT_Documentation_nav","id":"n3c5c1c1m1r1a2","sN":3,"aN":"c5c1c1m1r1a2"}" target="_blank">Documentation</a>
</li>
<li>
<a aria-label="Microsoft Learn Developer & IT" class="c-uhff-link" href="https://learn.microsoft.com/" data-m="{"cN":"Footer_DeveloperAndIT_MicrosoftLearn_nav","id":"n4c5c1c1m1r1a2","sN":4,"aN":"c5c1c1m1r1a2"}" target="_blank">Microsoft Learn</a>
</li>
<li>
<a aria-label="Microsoft Tech Community Developer & IT" class="c-uhff-link" href="https://techcommunity.microsoft.com/" data-m="{"cN":"Footer_DeveloperAndIT_MicrosoftTechCommunity_nav","id":"n5c5c1c1m1r1a2","sN":5,"aN":"c5c1c1m1r1a2"}" target="_blank">Microsoft Tech Community</a>
</li>
<li>
<a aria-label="Azure Marketplace Developer & IT" class="c-uhff-link" href="https://azuremarketplace.microsoft.com/en-us/" data-m="{"cN":"Footer_DeveloperAndIT_AzureMarketplace_nav","id":"n6c5c1c1m1r1a2","sN":6,"aN":"c5c1c1m1r1a2"}" target="_blank">Azure Marketplace</a>
</li>
<li>
<a aria-label="AppSource Developer & IT" class="c-uhff-link" href="https://appsource.microsoft.com/en-us/" data-m="{"cN":"Footer_DeveloperAndIT_AppSource_nav","id":"n7c5c1c1m1r1a2","sN":7,"aN":"c5c1c1m1r1a2"}" target="_blank">AppSource</a>
</li>
<li>
<a aria-label="Visual Studio Developer & IT" class="c-uhff-link" href="https://visualstudio.microsoft.com/" data-m="{"cN":"Footer_DeveloperAndIT_MicrosoftVisualStudio_nav","id":"n8c5c1c1m1r1a2","sN":8,"aN":"c5c1c1m1r1a2"}" target="_blank">Visual Studio</a>
</li>
</ul>
</div>
<div class="c-uhff-nav-group" data-m="{"cN":"footerNavColumn6_cont","cT":"Container","id":"c6c1c1m1r1a2","sN":6,"aN":"c1c1m1r1a2"}">
<div class="c-heading-4" role="heading" aria-level="2">Company</div>
<ul class="c-list f-bare">
<li>
<a aria-label="Careers Company" class="c-uhff-link" href="https://careers.microsoft.com/" data-m="{"cN":"Footer_Company_Careers_nav","id":"n1c6c1c1m1r1a2","sN":1,"aN":"c6c1c1m1r1a2"}" target="_blank">Careers</a>
</li>
<li>
<a aria-label="About Microsoft Company" class="c-uhff-link" href="https://www.microsoft.com/about" data-m="{"cN":"Footer_Company_AboutMicrosoft_nav","id":"n2c6c1c1m1r1a2","sN":2,"aN":"c6c1c1m1r1a2"}" target="_blank">About Microsoft</a>
</li>
<li>
<a aria-label="Company news Company" class="c-uhff-link" href="https://news.microsoft.com/" data-m="{"cN":"Footer_Company_CompanyNews_nav","id":"n3c6c1c1m1r1a2","sN":3,"aN":"c6c1c1m1r1a2"}" target="_blank">Company news</a>
</li>
<li>
<a aria-label="Privacy at Microsoft Company" class="c-uhff-link" href="https://privacy.microsoft.com/en-us" data-m="{"cN":"Footer_Company_PrivacyAtMicrosoft_nav","id":"n4c6c1c1m1r1a2","sN":4,"aN":"c6c1c1m1r1a2"}" target="_blank">Privacy at Microsoft</a>
</li>
<li>
<a aria-label="Investors Company" class="c-uhff-link" href="https://www.microsoft.com/investor/default.aspx" data-m="{"cN":"Footer_Company_Investors_nav","id":"n5c6c1c1m1r1a2","sN":5,"aN":"c6c1c1m1r1a2"}" target="_blank">Investors</a>
</li>
<li>
<a aria-label="Diversity and inclusion Company" class="c-uhff-link" href="https://www.microsoft.com/en-us/diversity/" data-m="{"cN":"Footer_Company_DiversityAndInclusion_nav","id":"n6c6c1c1m1r1a2","sN":6,"aN":"c6c1c1m1r1a2"}" target="_blank">Diversity and inclusion</a>
</li>
<li>
<a aria-label="Accessibility Company" class="c-uhff-link" href="https://www.microsoft.com/en-us/accessibility" data-m="{"cN":"Footer_Company_Accessibility_nav","id":"n7c6c1c1m1r1a2","sN":7,"aN":"c6c1c1m1r1a2"}" target="_blank">Accessibility</a>
</li>
<li>
<a aria-label="Sustainability Company" class="c-uhff-link" href="https://www.microsoft.com/en-us/sustainability/" data-m="{"cN":"Footer_Company_Sustainability_nav","id":"n8c6c1c1m1r1a2","sN":8,"aN":"c6c1c1m1r1a2"}" target="_blank">Sustainability</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="c-uhff-base">
<a data-m="{"id":"n7c1c1m1r1a2","sN":7,"aN":"c1c1m1r1a2"}" href="https://aka.ms/yourcaliforniaprivacychoices" class="c-uhff-link c-uhff-ccpa" target="_blank">
<svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 14" xml:space="preserve" height="16" width="43">
<title>Your Privacy Choices Opt-Out Icon</title>
<path d="M7.4 12.8h6.8l3.1-11.6H7.4C4.2 1.2 1.6 3.8 1.6 7s2.6 5.8 5.8 5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"></path>
<path d="M22.6 0H7.4c-3.9 0-7 3.1-7 7s3.1 7 7 7h15.2c3.9 0 7-3.1 7-7s-3.2-7-7-7zm-21 7c0-3.2 2.6-5.8 5.8-5.8h9.9l-3.1 11.6H7.4c-3.2 0-5.8-2.6-5.8-5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#06f"></path>
<path d="M24.6 4c.2.2.2.6 0 .8L22.5 7l2.2 2.2c.2.2.2.6 0 .8-.2.2-.6.2-.8 0l-2.2-2.2-2.2 2.2c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8L20.8 7l-2.2-2.2c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l2.2 2.2L23.8 4c.2-.2.6-.2.8 0z" style="fill:#fff"></path>
<path d="M12.7 4.1c.2.2.3.6.1.8L8.6 9.8c-.1.1-.2.2-.3.2-.2.1-.5.1-.7-.1L5.4 7.7c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0L8 8.6l3.8-4.5c.2-.2.6-.2.9 0z" style="fill:#06f"></path>
</svg>
<span>Your Privacy Choices</span>
</a>
<noscript>
<a data-m='{"id":"n8c1c1m1r1a2","sN":8,"aN":"c1c1m1r1a2"}' href="https://aka.ms/yourcaliforniaprivacychoices" class='c-uhff-link c-uhff-ccpa'>
<svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 14" xml:space="preserve" height="16" width="43">
<title>Your Privacy Choices Opt-Out Icon</title>
<path d="M7.4 12.8h6.8l3.1-11.6H7.4C4.2 1.2 1.6 3.8 1.6 7s2.6 5.8 5.8 5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/>
<path d="M22.6 0H7.4c-3.9 0-7 3.1-7 7s3.1 7 7 7h15.2c3.9 0 7-3.1 7-7s-3.2-7-7-7zm-21 7c0-3.2 2.6-5.8 5.8-5.8h9.9l-3.1 11.6H7.4c-3.2 0-5.8-2.6-5.8-5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#06f"/>
<path d="M24.6 4c.2.2.2.6 0 .8L22.5 7l2.2 2.2c.2.2.2.6 0 .8-.2.2-.6.2-.8 0l-2.2-2.2-2.2 2.2c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8L20.8 7l-2.2-2.2c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l2.2 2.2L23.8 4c.2-.2.6-.2.8 0z" style="fill:#fff"/>
<path d="M12.7 4.1c.2.2.3.6.1.8L8.6 9.8c-.1.1-.2.2-.3.2-.2.1-.5.1-.7-.1L5.4 7.7c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0L8 8.6l3.8-4.5c.2-.2.6-.2.9 0z" style="fill:#06f"/>
</svg>
<span>Your Privacy Choices</span>
</a>
</noscript>
<a data-m="{"id":"n9c1c1m1r1a2","sN":9,"aN":"c1c1m1r1a2"}" href="https://go.microsoft.com/fwlink/?linkid=2259814" class="c-uhff-link c-uhff-consumer" target="_blank">
<span>Consumer Health Privacy</span>
</a>
<nav aria-label="Microsoft corporate links">
<ul class="c-list f-bare" data-m="{"cN":"Corp links_cont","cT":"Container","id":"c10c1c1m1r1a2","sN":10,"aN":"c1c1m1r1a2"}">
<li id="c-uhff-footer_sitemap">
<a class="c-uhff-link" href="https://www.microsoft.com/en-us/sitemap1.aspx" data-mscc-ic="false" data-m="{"cN":"Footer_Sitemap_nav","id":"n1c10c1c1m1r1a2","sN":1,"aN":"c10c1c1m1r1a2"}" target="_blank">Sitemap</a>
</li>
<li id="c-uhff-footer_contactus">
<a class="c-uhff-link" href="https://support.microsoft.com/contactus" data-mscc-ic="false" data-m="{"cN":"Footer_ContactUs_nav","id":"n2c10c1c1m1r1a2","sN":2,"aN":"c10c1c1m1r1a2"}" target="_blank">Contact Microsoft</a>
</li>
<li id="c-uhff-footer_privacyandcookies">
<a class="c-uhff-link" href="https://go.microsoft.com/fwlink/?LinkId=521839" data-mscc-ic="false" data-m="{"cN":"Footer_PrivacyandCookies_nav","id":"n3c10c1c1m1r1a2","sN":3,"aN":"c10c1c1m1r1a2"}" target="_blank">Privacy </a>
</li>
<li class=" x-hidden" id="c-uhff-footer_managecookies">
<a class="c-uhff-link" href="#" data-mscc-ic="false" data-m="{"cN":"Footer_ManageCookies_nav","id":"n4c10c1c1m1r1a2","sN":4,"aN":"c10c1c1m1r1a2"}">Manage cookies</a>
</li>
<li id="c-uhff-footer_termsofuse">
<a class="c-uhff-link" href="https://go.microsoft.com/fwlink/?LinkID=206977" data-mscc-ic="false" data-m="{"cN":"Footer_TermsOfUse_nav","id":"n5c10c1c1m1r1a2","sN":5,"aN":"c10c1c1m1r1a2"}" target="_blank">Terms of use</a>
</li>
<li id="c-uhff-footer_trademarks">
<a class="c-uhff-link" href="https://go.microsoft.com/fwlink/?linkid=2196228" data-mscc-ic="false" data-m="{"cN":"Footer_Trademarks_nav","id":"n6c10c1c1m1r1a2","sN":6,"aN":"c10c1c1m1r1a2"}" target="_blank">Trademarks</a>
</li>
<li id="c-uhff-footer_safetyandeco">
<a class="c-uhff-link" href="https://go.microsoft.com/fwlink/?linkid=2196227" data-mscc-ic="false" data-m="{"cN":"Footer_SafetyAndEco_nav","id":"n7c10c1c1m1r1a2","sN":7,"aN":"c10c1c1m1r1a2"}" target="_blank">Safety & eco</a>
</li>
<li id="c-uhff-recycling">
<a class="c-uhff-link" href="https://www.microsoft.com/en-us/legal/compliance/recycling" data-mscc-ic="false" data-m="{"cN":"Recycling_nav","id":"n8c10c1c1m1r1a2","sN":8,"aN":"c10c1c1m1r1a2"}" target="_blank">Recycling</a>
</li>
<li id="c-uhff-footer_aboutourads">
<a class="c-uhff-link" href="https://choice.microsoft.com" data-mscc-ic="false" data-m="{"cN":"Footer_AboutourAds_nav","id":"n9c10c1c1m1r1a2","sN":9,"aN":"c10c1c1m1r1a2"}" target="_blank">About our ads</a>
</li>
<li>© Microsoft 2024</li>
</ul>
</nav>
</div>
</footer>
<script id="uhf-footer-ccpa">
const globalPrivacyControlEnabled = navigator.globalPrivacyControl;
const GPC_DataSharingOptIn = (globalPrivacyControlEnabled) ? false : checkThirdPartyAdsOptOutCookie();
function checkThirdPartyAdsOptOutCookie() {
try {
const ThirdPartyAdsOptOutCookieName = '3PAdsOptOut';
var cookieValue = getCookie(ThirdPartyAdsOptOutCookieName);
return cookieValue != 1;
} catch {
return true;
}
}
function getCookie(cookieName) {
var cookieValue = document.cookie.match('(^|;)\\s*' + cookieName + '\\s*=\\s*([^;]+)');
return (cookieValue) ? cookieValue[2] : '';
}
</script>
</div>
</div>
</div><!--/ UHF footer -->
<!-- UHF search functionality query parameter append for all pages excluding landing page -->
<script type="text/javascript">
var serachHtml = '<input type="hidden" name="blog" value="/visualstudio/" data-m="{"cN":"HiddenInput_nav","id":"n2c1c9c3m1r1a1","sN":2,"aN":"c1c9c3m1r1a1"}" style="overflow-x: visible;">';
jQuery(".c-uhfh-actions #searchForm").append(serachHtml);
</script>
<div class="usabilla_live_button_container" id="usabilla_live_button_container_58988554" role="button" tabindex="0" aria-label="Usabilla Feedback Button" style="display: none;"><style type="text/css" nonce="">div.usabilla_live_button_container#usabilla_live_button_container_58988554[role="button"] {height:130px;position:fixed;z-index:999999;right:0;top:auto !important;margin-top:-65px;bottom:10%;width:40px}</style><iframe src="" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" data-tags="right" title="Usabilla Feedback Button" class="usabilla-live-button" id="usabilla_live_button_container_iframe602277652"></iframe></div></body></html>