tag:blogger.com,1999:blog-51530174049885953282024-03-27T02:35:29.979-04:00Rather TechnicalSeva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.comBlogger72125tag:blogger.com,1999:blog-5153017404988595328.post-3420352000508966272024-03-22T11:57:00.004-04:002024-03-25T16:15:51.285-04:00NET within NET<p> Amazing discovery of the day: you can host .NET 5+ within a .NET 4 application.<span></span></p><a name='more'></a><span>You can't plain reference a .NET 5+ assembly from a .NET 4 one and expect it to work. The frameworks are so different that Microsoft thought a rebrand/rename (to "Core") was warranted at a time. They went back on that later and returned to the .NET branding, but that's beside the point. The point is, straightforward calls from NET 4 to Core-targeting code don't work.</span><p></p><p>Enter hostfxr, the trusty DLL for hosting .NET Core 3+ from native code. You can P/Invoke into that, load a .NET 5+ assembly and call a static public class method. The only caveat is, there has to be a public delegate datatype with the same signature as the method in question, declared in the Core world. If there isn't, the method has to follow a preset signature. Point is, it's not for calling assemblies that were not built with cross-version calling in mind in the first place.</p><p>This is decidedly a low level approach. It's also possible to call .NET 5+ from .NET 4 using good old COM. Again, the Core assembly has to be built with COM support.</p><p>The motivating use case for this was - I wanted to build a Visual Studio add-in that would inspect the compiled binary in a .NET 8 projects. The add-ins run under .NET 4 (along with the rest of Visual Studio). I have a strong suspicion Visual Studio itself already does a similar trick - when you create a .NET hosting context, on some runs I've seen the result code that means "context already exists".</p><p>UPDATE: the requirement that the callee method adheres to a publicly declared delegate type, and that the assembly qualified name for the latter must be passed to hostfxr, can't be sidestepped with passing a specialization of an <span style="font-family: courier;">Action<...></span> or a <span style="font-family: courier;">Func<...></span>. It's possible to get <span style="font-family: courier;">Type</span> objects for generic datatype specializations, and they have assembly qualified names, too, but passing a name like this doesn't work in this context.</p><p>This, for example, is an assembly qualified name for a <span style="font-family: courier;">Func<string, string></span> in a .NET 8 project:</p><div style="text-align: left;"><span style="font-family: courier;">System.Func`2[[System.String, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e</span></div><div style="text-align: left;"><span style="font-family: courier;"><br /></span></div><div style="text-align: left;"><br /></div><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-62998655596679048712022-11-07T12:49:00.001-05:002022-11-07T12:49:43.578-05:00Full circle with a gap at 11 o'clock<p>Some time ago I've claimed that I've <a href="https://rathertech.blogspot.com/2020/05/full-circle.html">run a full circle</a> on a TLS certificate lifecycle. Well, there was one more kink in that circle that I've failed to acknowledge at the time.<span><br /></span></p><a name='more'></a>The kink had to do with the unremarkable step of "installing a certificate" on the machine where previously a CSR for that certificate was generated. On the Windows UI level, it's pretty much a two click operation - double click on a signed cert in Explorer, click OK to confirm. Internally, the only parameter of note is where to place the cert (machine vs user and the cert store name).<div><br /></div><div>In PowerShell, there is a ready made cmdlet for that - <a href="https://learn.microsoft.com/en-us/powershell/module/pki/import-certificate?view=windowsserver2022-ps" target="_blank">Import-Certificate</a>. However, the whole theme of this series was decomposing certificate operations into .NET crypto primitives, and this one doesn't admit, it seems, such a decomposition. At least not easily.</div><div><br /></div><div>I have even checked the decompiled MSIL of the DLL behind Import-Certificate (Microsoft.CertificateServices.PKIClient.Cmdlets.dll, available in the .NET Global Assembly Cache) - its managed implementation does a couple of sanity checks, then calls into native code.</div><div><br /></div><div>I have a strong suspicion that this is yet another case of a crypto operation that is possible is native CryptoAPI but isn't quite exposed in .NET. Normally, I'd expect the import procedure to go like this:</div><div><ol style="text-align: left;"><li>Load the newly signed cert</li><li>Find the saved CSR in the Requests cert store by matching the public key</li><li>Retrieve the private key reference from the saved CSR</li><li>Attach the private key reference to the newly signed cert</li><li>Add the cert to the a cert store</li><li>Delete the saved CSR from the Requests store</li></ol><div>Step 3 seems to be either impossible or rather involved. You load the CSR, you get an X509Certificate2 object where the HasPrivateKey property evaluates to True, but the PrivateKey property is empty.</div></div>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-77644847441404148632022-11-01T17:55:00.003-04:002022-11-01T18:16:02.857-04:00No version is technically a version<p> Amazing discovery of the day: if your Android application doesn't link against the Google Play billing library, but claims to use the com.android.vending.BILLING permission in the manifest, the Google Play developer console will turn your APK down, saying that it uses an unsupported version of the billing library, and why won't you upgrade to v4.</p><p>If your app links against billing v5 (the latest as of the time of this writing) but lists said permission in the manifest, you will receive the same error message.</p>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-35815928846327411812022-09-17T14:27:00.006-04:002022-11-01T18:19:00.699-04:00The problem of repeated crashes<p>Postmortem app crash reporting and analysis is a bit of a hobbyhorse for me. I see it as an extension of the bug reporting facility - a crash in production (typically, but not always) indicates a bug. But does <i>every</i> crash indicate a <i>separate, distinct</i> bug?<span></span></p><a name='more'></a><p></p><p>When I say "crash" I mean "a condition that would normally cause a program to terminate, unless special care has been taken to prevent immediate termination". So a crash condition could be:</p><p></p><ul style="text-align: left;"><li>A *nix signal (modulo SIGUSRx)</li><li>An uncaught Windows structured exception (SEH)</li><li>An uncaught Java/.NET/Python/JavaScript exception</li><li>A run-time error (e. g. an array bounds check fail)</li></ul><div>So imagine a crash has occurred, your faithful crash reporting subsystem has reported it, you have a report. At the very minimum, the report contains a location indicator (crash address, or a source file/line if you are lucky), and the nature of the crash - if signal, the numeric signal code, if exception, the exception class. Ideally, a stack trace would also be there, and some local state.</div><div><br /></div><div>On the receiving end, there is your bug tracker. And the bug tracker has to answer a question - <b>is it a new bug, or another instance of an existing crash causing bug</b>? It's a surprisingly involved question.</div><div><br /></div><div>For one thing, matching file/line is not a guarantee of anything. To use a trivial example, an</div><div><br /></div><div><span style="font-family: courier;">x = MyArray[MyIndex];</span></div><div><br /></div><div>line may case a "null reference" exception if <span style="font-family: courier;">MyArray</span> is not initialized, or an "array out of bounds" if the value of <span style="font-family: courier;">MyIndex</span> is off; and those two conditions could easily have different root causes.</div><div><br /></div><div>On the other hand, once we start dealing with several versions of the app coexisting on different production devices, the same bug could cause crashes on <i>different locations</i> in different versions, while sharing the same root cause. Trivially, if lines were added to the source where the crashing function is between version 2 and version 3, the line number in the crash would vary accordingly. A heuristic to catch this would be - matching line numbers not relative to the top of the file, but to the top of the crashing function, but only as long as the function source is otherwise the same between versions.</div><div><br /></div><div>Still, even matching location/condition sometimes is not sufficient. What if a function crashes on an unexpectedly null argument, but said argument can come from multiple sources and therefore different root causes? You don't want to match the whole call stack, especially considering that the root cause error could be halfway through the stack and the far end of it might legitimately differ. In other words, the following is a possible situation:</div><div><br /></div><div>
<table border="1">
<tbody><tr><td>foo() - CRASH!</td><td>foo() - CRASH!</td></tr>
<tr><td>happy() (error A)</td><td>lucky() (error B)</td></tr>
</tbody></table><br /></div><div>
But so is this:</div><div><br /><table border="1">
<tbody><tr><td>foo() - CRASH!</td><td>foo() - CRASH!</td></tr>
<tr><td>bar() (error A)</td><td>bar() (error A)</td></tr>
<tr><td>happy()</td><td>lucky()</td></tr>
</tbody></table>
<br /></div><div>In the former case, it's <i>two different errors</i> with the same crash location/type, in the latter, it's the same error manifesting downstack. I don't have a good answer how can a crash analysis system tell between those two cases, short of human triage.</div><div><br /></div><div>Ideally, inconsistent state should not be able to cross function call boundaries. The mandatory null-marking of modern C#, for example, is a step in that direction, so are type hints. But consistency is such a squishy concept. Null/not null is the simplest invariant of them all, but there are so many subtle ways to introduce state that turns out to be invalid later. On top of everything else, consistency checks are not free of runtime cost. In desktop/server computing it might be negligible, but in mobile and, especially, embedded coding they still retain the habit of counting bytes and cycles.</div><div><br /></div><div>With all that in mind, the algorithm of a crash report analyzer would need to strike a balance between a positive bias and a negative bias. It's the well know <a href="https://en.wikipedia.org/wiki/Lumpers_and_splitters" target="_blank">lumper-splitter problem</a>, all over again.</div><p></p>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-21443485938190471772022-08-31T13:25:00.007-04:002022-08-31T14:33:41.980-04:00Project vs. collection<p>Some time ago, <a href="https://rathertech.blogspot.com/2018/04/who-am-i-and-what-are-my-rights-in-tfs.html">I've discussed the identity of the account</a> that TFS agent jobs are using to connect back to TFS via the <span style="font-family: courier;">distributedTask</span> PowerShell context variable, or the equivalent <span style="font-family: courier;">System.AccessToken</span> release variable. Back at the time, I've concluded that the identity behind that token was "Build Service (CollectionName)". Well, just today I've encountered a case where a release was running under a different identity - "ProjectName Build Service (CollectionName)". Both coexist.<span></span></p><a name='more'></a><p></p><p>I can not, for now, tell what determines which of those two artificial identities is used for releases in each particular project. To make matters more difficult, the "get identity" endpoint would fail with the token. Other endpoints for reading project specific data were failing, too. </p><p>Turns out, there is another way to tell the identity behind the token. TFS tokens are JSON Web Tokens (JWTs), a JWT consists of three dot character separated parts - header, claims, and signature. The former two are Base64-encoded JSON (in UTF-8), with the twist that the flavor of Base64 is <a href="https://en.wikipedia.org/wiki/Base64#Variants_summary_table" target="_blank">the filename safe kind</a>. Inside the claims there is a field called <span style="font-family: courier;">nameid</span> that is a GUID, corresponding to the <span style="font-family: courier;">Id</span> field in the <span style="font-family: courier;">tbl_Identity</span> table of the <span style="font-family: courier;">Tfs_Configuration</span> database. So if you run the following PowerShell:</p><p><span style="font-family: courier;">$Endpoint = $distributedTaskContext.GetEndpoint("SystemVssConnection")<br />$Token = $Endpoint.Authorization.P</span><span style="font-family: courier;">arameters.AccessToken<br /></span><span style="font-family: courier;">$c = $Token.Split('.')[1]<br /></span><span style="font-family: courier;">$c = $c.Replace('-', '+').Replace('_', '/')<br /></span><span style="font-family: courier;">$c = $c.PadRight($c.Length + 4 - $c.Length%4, '=')<br /></span><span style="font-family: courier;">$c = </span><span style="font-family: courier;">[Convert]::FromBase64String($c)<br />$c = </span><span style="font-family: courier;">[System.Text.Encoding]::UTF8.GetString($c)<br /></span><span style="font-family: courier;">$Claims = $c | ConvertFrom-Json<br /></span><span style="font-family: courier;">Write-Host $Claims.nameid</span></p><p>You will have a nameid that can be used in the following SQL against the TFS database:<br /><br /><span style="font-family: courier;">select *<br />from Tfs_Configuration.dbo.tbl_Identity<br />where Id='paste-nameid-here'</span></p><p>By the way, the failing endpoints stopped failing once I've added the "(Project) Build Service" to the project team.</p><p>There is also a built-in token parser in .NET (<a href="https://docs.microsoft.com/en-us/dotnet/api/system.identitymodel.tokens.jwt.jwtsecuritytokenhandler?view=azure-dotnet" target="_blank">JwtSecurityTokenHandler</a>), but it's more trouble in this particular context than it's worth. Also, one can dump the token contents and parse it interactively with <a href="https://jwt.io">https://jwt.io</a> . To the best of my knowledge, there is no out of the box parser for filename safe Base64 in .NET.</p>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-49777011361224516422021-12-11T15:37:00.005-05:002021-12-14T10:17:05.057-05:00Abusing COM, this time in C#<p>Some time ago, I've written up <a href="/2017/11/abusing-com-for-tightly-coupled-process.html">a technique</a> for setting up object oriented, call based interprocess communication using an idiosyncratic subset of COM. A case for something similar came up for me again, but the project is in C# with .NET 6. So I've adapted the same technique to work in a managed world.<span></span></p><a name='more'></a><p></p><p>The ideas are the same - the client starts the server process with a cookie in the command line, the server lists its COM object in the Running Object Table (ROT) using a name that contains the cookie, the interfaces involved should marshal out of the box, the client pulls the server's object from the ROT using the cookie.</p><p>Anyway, <a href="https://gist.github.com/sevaa/9a7dbe682258a2a3c2f404be90d119be" target="_blank">here's a C# gist</a>. Like all things managed, there's considerably less typing than the C++ equivalent. Originally compiled against .NET 6, it recompiles and works under .NET Framework 4.7.2 too.</p><p>The only point worth mentioning is that the interface is decorated with the GUID of <span style="font-family: courier;">IDispatch</span>. Were it a dispinterface with a real IID, it won't be marshalable without registration, and the bit where the object reference from the ROT is being converted to <span style="font-family: courier;">IProtocol </span>would fail (the C# <span style="font-family: courier;">as</span> operator would return null). Internally, what happens at that point, the client calls <span style="font-family: courier;">QueryInterface()</span> on the proxy object, the proxy forwards it to the server, the server dutifully returns an interface pointer that points at <span style="font-family: courier;">IDispatch.</span> COM would like to pass it back to the client, but COM sees what IID was <span style="font-family: courier;">QueryInterface()</span> called with, and it was not a known IID. COM has no way of knowing it's a dispinterface and not a custom interface, doesn't know how to marshal it over the process boundary, and at the end of it, <span style="font-family: courier;">QueryInterface()</span> on the client fails.</p><p>Another workaround for that would involve registering the custom IID under HKEY_CLASSES_ROOT\Interfaces, and providing the GUID for PSDispatch ({00020420-0000-0000-C000-000000000046}) as the value of ProxyStubClsid32. But I decided to go with zero machine footprint instead.</p><p>The Protocol.cs file needs to be present in both the client and the server, as it contains things the client and the server should agree on. The RunningObjectTable.cs file needs to be in both, too; it's a helper class for ROT access.</p>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-78077895044651104112021-10-26T15:53:00.004-04:002024-03-25T13:19:17.840-04:00Sequential vs. semantic<p>This is about the naming of releases in Azure DevOps (formerly known as TFS and VSTS). The default pattern of release names has been, as long as I can remember, sequential within the definition's scope: "Release 1", "Release 2", etc. That's been a minor pet peeve of mine for a while, and now we've come up with a technique to change this format to something more informative. Specifically, one can name releases with respect to the current product version, as every reasonable project team would want to.</p>
<span><a name='more'></a></span>
You can't change the release name once the release is going. But the pattern for the release names is configurable, and may contain references to variables. So the idea is:
<div><br /><ol style="text-align: left;"><li>Create (or pick) a variable group under Pipelines/Library </li><li>Create a variable in that variable group for the current version of your product </li><li>During the build, update the variable to the current version of the product </li><li>In the release definition, under Variables/Variable Groups, link the variable group to the release def </li><li>Under definition Options, place a $(reference) to the version variable under Release name format </li></ol><br />This way, instead of "Release 19", you can have "Release 19 - v2.6.11".
<p>TFS complains if $(rev:r) is not in the name format string,
claims the release name won’t be unique that way. So you’d have to combine the
product version and the built-in release counter in the format string.</p>
<p>The exact way of publishing the version number during the
build might vary. If the release is being initiated by the build, then the <a href="https://marketplace.visualstudio.com/items?itemName=sevaalekseyev.variableupdater" target="_blank">Shared Variable Updater</a> extension is your friend; it changes the value of a library variable to the provided string, which may be extracted from a project file, or a Win32 DLL, or a compiled .NET assembly, or what have you. Shared
Variable Updater has one caveat: it needs an explicit write grant in the variable group security to update it. <b>You need to go to the variable group security,
and change the role of the “Project Collection Build Service” to Administrator.</b></p>
<p>If you build outside TFS, there are Powershell cmdlets in
the gallery module VSTeam that can set variables: Get-VSTeamVariableGroup and
Update-VSTeamVariableGroup.<strike> There is no “update a single variable” cmdlet, last
time I’ve checked, but you can combine those.</strike> UPDATE: there is now, Set-VSTeamVariableGroupVariable.</p></div>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-88473380738203069652020-12-02T12:05:00.004-05:002020-12-02T12:05:45.723-05:00OAuth scopes in Azure DevOps 2020<div>Here's another OAuth scope dump from the latest on-prem instance of Azure DevOps.</div><div><br /></div><div>The same caveat applies: some of those might be cloud only.</div><div><b><br /></b></div><b><div><span><a name='more'></a></span><b><br /></b></div>preview_api_all</b><br />
<ul>
<li>/_apis#OPTIONS</li>
<li>/DefaultCollection/_apis#OPTIONS</li>
<li>/_apis/connectiondata#GET</li>
<li>/DefaultCollection/_apis/connectiondata#GET</li>
<li>/_apis/ServiceDefinitions#GET</li>
<li>/_apis/build/builds#GET+PATCH+DELETE</li>
<li>/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/_apis/build/definitions</li>
<li>/_apis/build/queues</li>
<li>/DefaultCollection/_apis/build/builds#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/DefaultCollection/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/build/definitions</li>
<li>/DefaultCollection/_apis/build/queues</li>
<li>/DefaultCollection/_apis/resources/Containers#GET</li>
<li>/DefaultCollection/*/_apis/build/builds#GET+PATCH+DELETE+PUT+POST</li>
<li>/DefaultCollection/*/_apis/build/folders#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/definitions#GET+POST+PUT+DELETE+PATCH</li>
<li>/DefaultCollection/*/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/tags#GET</li>
<li>/DefaultCollection/*/_apis/build/options#GET</li>
<li>/DefaultCollection/_apis/build/queues#GET</li>
<li>/DefaultCollection/_apis/build/options#GET</li>
<li>/DefaultCollection/_apis/build/controllers#GET</li>
<li>/_apis/accounts</li>
<li>/_apis/profile/profiles</li>
<li>/_apis/projectCollections</li>
<li>/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/projects#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/_apis/notifications/*/eventdefinitions</li>
<li>/_apis/hooks/consumers</li>
<li>/_apis/hooks/publishers</li>
<li>/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
<li>/_apis/hooks/inputValuesQuery#POST</li>
<li>/_apis/hooks/notificationsQuery#POST</li>
<li>/_apis/hooks/subscriptionsQuery#POST</li>
<li>/_apis/hooks/publishersQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/consumers</li>
<li>/DefaultCollection/_apis/hooks/publishers</li>
<li>/DefaultCollection/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/hooks/inputValuesQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/notificationsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/subscriptionsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/publishersQuery#POST</li>
<li>/_apis/chat/rooms/*/messages#GET+POST+PUT+PATCH+DELETE</li>
<li>/_apis/chat/rooms#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/chat/rooms/*/messages#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/chat/rooms#GET+POST+PUT+PATCH+DELETE</li>
<li>/_apis/tfvc/branches</li>
<li>/_apis/tfvc/changesets</li>
<li>/_apis/tfvc/labels</li>
<li>/_apis/tfvc/shelvesets</li>
<li>/_apis/tfvc/workspaces#GET+POST</li>
<li>/_apis/tfvc/changesetsBatch#POST</li>
<li>/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/_apis/tfvc/branches</li>
<li>/DefaultCollection/_apis/tfvc/changesets</li>
<li>/DefaultCollection/_apis/tfvc/items</li>
<li>/DefaultCollection/_apis/tfvc/labels</li>
<li>/DefaultCollection/_apis/tfvc/shelvesets</li>
<li>/DefaultCollection/_apis/tfvc/workspaces#GET+POST</li>
<li>/DefaultCollection/_apis/tfvc/changesetsBatch#POST</li>
<li>/DefaultCollection/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/*/_apis/tfvc#GET+POST</li>
<li>/_apis/git/repositories#GET+POST</li>
<li>/_apis/git/repositories/*/commits</li>
<li>/_apis/git/*/repositories/*/commits</li>
<li>/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/_apis/git/repositories/*/forks/*#GET</li>
<li>/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/_apis/git/repositories/*/forkSyncRequests#GET+POST</li>
<li>/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/_apis/git/*/repositories/*/forkSyncRequests#GET+POST</li>
<li>/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/_apis/git/repositories/*/pushes#GET+POST</li>
<li>/_apis/git/*/repositories/*/pushes#GET+POST</li>
<li>/_apis/git/repositories/*/pushes/*</li>
<li>/_apis/git/*/repositories/*/pushes/*</li>
<li>/_apis/git/repositories/*#GET+PATCH+DELETE</li>
<li>/_apis/git/*/repositories/*#GET+PATCH+DELETE</li>
<li>/_apis/git/*/repositories#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes/*</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes/*</li>
<li>/DefaultCollection/_apis/git/repositories/*#GET+PATCH+DELETE+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*#GET+PATCH+DELETE+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequests#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/codereview/reviews#GET</li>
<li>/DefaultCollection/*/_apis/codereview/reviews#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/codereview/reviewsbatch#POST</li>
<li>/DefaultCollection/*/_apis/codereview/settings#GET+POST+PUT</li>
<li>/DefaultCollection/_apis/visits/artifactVisits#PUT</li>
<li>/DefaultCollection/_apis/visits/artifactVisitsBatch#POST</li>
<li>/DefaultCollection/_apis/visits/artifactStatsBatch#POST</li>
<li>/DefaultCollection/*/_apis/policy/Evaluations#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/policy/configurations</li>
<li>/DefaultCollection/*/_apis/policy/configurations/*/revisions</li>
<li>/DefaultCollection/*/_apis/policy/types</li>
<li>/DefaultCollection/*/_apis/git/policy/configurations</li>
<li>/_apis/wit/attachments#GET+POST+PUT</li>
<li>/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/attachments#GET+POST+PUT</li>
<li>/DefaultCollection/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/_apis/wit/fields#GET+POST</li>
<li>/_apis/wit/wiql#GET+POST</li>
<li>/_apis/wit/workitemrelationtypes#GET</li>
<li>/_apis/wit/workitems#GET+POST+PATCH</li>
<li>/_apis/wit/workitemtypecategories#GET</li>
<li>/_apis/wit/workitemtypes#GET</li>
<li>/_apis/wit/$ruleEngine#POST</li>
<li>/_apis/wit/$batch#POST</li>
<li>/_apis/wit/artifactlinktypes#GET</li>
<li>/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/_apis/wit/artifactlinktypes#GET</li>
<li>/DefaultCollection/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/_apis/wit/fields#GET+POST</li>
<li>/DefaultCollection/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/_apis/wit/workitemrelationtypes#GET</li>
<li>/DefaultCollection/_apis/wit/workitems#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/$ruleEngine#POST</li>
<li>/DefaultCollection/_apis/wit/$batch#POST</li>
<li>/DefaultCollection/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/_apis/work/processes#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/work/processdefinitions#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/fields#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/classificationnodes#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypecategories#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypes#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/*/*/_apis/wit/templates#GET+PUT+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/projectProcessMigration#POST</li>
<li>/DefaultCollection/*/_apis/work/predefinedQueries#GET</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/_apis/resources/Containers/*</li>
<li>/_apis/resources/Containers/*</li>
<li>/_api/_wit/teamProjects</li>
<li>/DefaultCollection/_api/_wit/teamProjects</li>
<li>/DefaultCollection/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/iterations#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/_apis/work/processconfiguration#GET</li>
<li>/DefaultCollection/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogs#GET</li>
<li>/DefaultCollection/*/*/_apis/work/workitemsorder#PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/taskboardColumns#GET+PUT</li>
<li>/DefaultCollection/*/*/_apis/work/taskboardWorkItems#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/boards/boards#GET+POST+PATCH+DELETE</li>
<li>/_apis/clt/testdrops#GET+POST</li>
<li>/_apis/clt/testruns#GET+POST+PATCH</li>
<li>/_apis/clt/testruns/*/errors</li>
<li>/_apis/clt/testruns/*/messages</li>
<li>/_apis/clt/testruns/*/results</li>
<li>/_apis/clt/testruns/*/counterinstances</li>
<li>/_apis/clt/testruns/*/countersamples</li>
<li>/_apis/clt/apm</li>
<li>/_apis/clt/configuration</li>
<li>/_apis/clt/agentgroups#GET+POST+PATCH+DELETE</li>
<li>/_apis/clt/agentgroups/*/agents#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test#GET+POST+PATCH+DELETE</li>
<li>/_apis/test/suites</li>
<li>/_apis/Identities#GET+PUT+DELETE</li>
<li>/_apis/IdentityBatch#POST</li>
<li>/_apis/Groups#GET+DELETE+POST</li>
<li>/_apis/Scopes#GET+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/discussion/threads#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/discussion/threadsBatch#POST</li>
<li>/DefaultCollection/_apis/discussion/comments#PATCH</li>
<li>/_apis/Commerce/*#GET</li>
<li>/_apis/Commerce/Subscription/*/*#GET+PUT</li>
<li>/_apis/gallery/*#GET</li>
<li>/_apis/gallery/acquisitionrequests/*#POST</li>
</ul>
<b>vso.base</b><br />
<ul>
<li>/_apis#OPTIONS</li>
<li>/DefaultCollection/_apis#OPTIONS</li>
<li>/_apis/connectiondata#GET</li>
<li>/_apis/servicelevel#GET</li>
<li>/DefaultCollection/_apis/connectiondata#GET</li>
<li>/_apis/ServiceDefinitions#GET</li>
<li>/_apis/resourceareas#GET</li>
<li>/DefaultCollection/_apis/resourceareas#GET</li>
<li>/_apis/operations#GET</li>
<li>/DefaultCollection/_apis/operations#GET</li>
<li>/_apis/permissions#GET</li>
<li>/_apis/SecurityNamespaces#GET</li>
<li>/_apis/AccessControlLists#GET</li>
<li>/_apis/security/permissionEvaluationBatch#POST</li>
<li>/DefaultCollection/_apis/permissions#GET</li>
<li>/DefaultCollection/_apis/SecurityNamespaces#GET</li>
<li>/DefaultCollection/_apis/AccessControlLists#GET</li>
<li>/DefaultCollection/_apis/security/permissionEvaluationBatch#POST</li>
<li>/_apis/securityroles/scopes/*/roledefinitions#GET</li>
<li>/_apis/securityroles/scopes/*/roleassignments/resources/*#GET</li>
<li>/DefaultCollection/_apis/securityroles/scopes/*/roledefinitions#GET</li>
<li>/DefaultCollection/_apis/securityroles/scopes/*/roleassignments/resources/*#GET</li>
</ul>
<b>vso.profile</b><br />
<ul>
<li>/_apis/account#GET</li>
<li>/_apis/account/regions#GET</li>
<li>/_apis/accounts#GET</li>
<li>/_apis/projectCollections#GET</li>
<li>/_apis/profile/profiles#GET</li>
<li>/_apis/profile/UserDefaults#GET</li>
<li>/_apis/profile/regions#GET</li>
<li>/_apis/profile/georegion#GET</li>
<li>/_apis/profile/Locations#GET</li>
<li>/_apis/profile/Settings#GET</li>
<li>/_apis/profile/Attributes#GET+PATCH</li>
<li>/_apis/ClientNotification/Subscriptions#GET</li>
<li>/_apis/process/processes#GET</li>
<li>/DefaultCollection/_apis/projects#GET</li>
<li>/DefaultCollection/_apis#OPTIONS</li>
<li>/_apis/Organization/Regions#GET</li>
</ul>
<b>vso.profile_write</b><br />
<ul>
<li>/_apis/profile/profiles#PATCH+PUT</li>
</ul>
<b>vso.acquisition_write</b><br />
<ul>
<li>/*/_apis/ServiceDefinitions#GET</li>
<li>/*/_apis/projectCollections#GET</li>
<li>/*/_apis/projects#GET+POST</li>
<li>/*/_apis/operations#GET</li>
<li>/_apis/ServiceDefinitions#GET</li>
<li>/_apis/projects#GET+POST</li>
<li>/_apis/operations#GET</li>
<li>/_apis/profile/avatar#GET+POST+DELETE+PUT</li>
<li>/_apis/profile/profiles#GET+POST+PATCH</li>
<li>/_apis/profile/UserDefaults#GET+PUT</li>
<li>/_apis/accounts#GET+POST</li>
<li>/api/account#GET+POST</li>
<li>/_apis/delegatedauth/registration#GET</li>
<li>/_apis/delegatedauth/registrationsecret#GET</li>
<li>/_apis/delegatedauth/authorizations#GET</li>
<li>/_apis/UserMapping/UserAccountMappings#GET</li>
<li>/_apis/user/attributes#GET+PATCH+DELETE</li>
<li>/_apis/user/avatar#GET+PUT+DELETE</li>
<li>/_apis/user/avatarPreview#POST</li>
<li>/_apis/user/contactWithOffers#GET+PUT</li>
<li>/_apis/user/userDefaults#GET</li>
<li>/_apis/user/user#GET+POST+PATCH</li>
<li>/_apis/UserEntitlements/*#DELETE</li>
<li>/_apis/useraad/aadMembership#GET</li>
<li>/_apis/Pipelines/Connections#POST</li>
<li>/_apis/Contribution/dataProviders/query#POST</li>
<li>/_apis/Contribution/nodes/query#POST</li>
<li>/_apis/OrganizationPolicy/Policies#GET</li>
<li>/_apis/HostAcquisition/Regions#GET</li>
</ul>
<b>vso.identity</b><br />
<ul>
<li>/*/_apis/identities#GET</li>
<li>/*/_apis/groups#GET</li>
<li>/*/_apis/scopes#GET</li>
<li>/*/_apis/identitybatch#POST</li>
<li>/_apis/identities#GET</li>
<li>/_apis/groups#GET</li>
<li>/_apis/scopes#GET</li>
<li>/_apis/identitybatch#POST</li>
<li>/DefaultCollection/_apis/identities#GET</li>
<li>/DefaultCollection/_apis/groups#GET</li>
<li>/DefaultCollection/_apis/scopes#GET</li>
<li>/DefaultCollection/_apis/identitybatch#POST</li>
</ul>
<b>vso.identity_manage</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/_apis/identities#GET+POST+PUT+DELETE</li>
<li>/_apis/groups#GET+POST+PUT+DELETE</li>
<li>/_apis/scopes#GET+POST+PUT+DELETE+PATCH</li>
<li>/DefaultCollection/_apis/identities#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/groups#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/scopes#GET+POST+PUT+DELETE+PATCH</li>
<li>/Services/*/IdentityManagementService.asmx#POST</li>
<li>/*/Services/*/IdentityManagementService.asmx#POST</li>
<li>/Services/*/IdentityManagementService2.asmx#POST</li>
<li>/*/Services/*/IdentityManagementService2.asmx#POST</li>
</ul>
<b>vso.hooks</b><br />
<ul>
<li>/_apis/hooks/consumers#GET</li>
<li>/_apis/hooks/inputValuesQuery#POST</li>
<li>/_apis/hooks/notificationsQuery#POST</li>
<li>/_apis/hooks/publishers#GET</li>
<li>/_apis/hooks/publishersQuery#POST</li>
<li>/_apis/hooks/subscriptions#GET</li>
<li>/_apis/hooks/subscriptionsQuery#POST</li>
<li>/_apis/hooks/testNotifications#POST</li>
<li>/DefaultCollection/_apis/hooks/consumers#GET</li>
<li>/DefaultCollection/_apis/hooks/inputValuesQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/notificationsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/publishers#GET</li>
<li>/DefaultCollection/_apis/hooks/publishersQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/subscriptions#GET</li>
<li>/DefaultCollection/_apis/hooks/subscriptionsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/testNotifications#POST</li>
</ul>
<b>vso.hooks_write</b><br />
<ul>
<li>/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.hooks_interact</b><br />
<ul>
<li>/DefaultCollection/_apis/wit/workitems#PATCH</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypes/*/states#GET</li>
</ul>
<b>vso.work</b><br />
<ul>
<li>/_apis/tagging#GET</li>
<li>/DefaultCollection/_apis/tagging#GET</li>
<li>/DefaultCollection/_apis/wit/attachments#GET</li>
<li>/DefaultCollection/_apis/wit/fields#GET</li>
<li>/DefaultCollection/_apis/wit/workitemrelationtypes#GET</li>
<li>/DefaultCollection/_apis/wit/queries#GET</li>
<li>/DefaultCollection/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/*/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/_apis/wit/workitemsbatch#POST</li>
<li>/DefaultCollection/*/_apis/wit/workitemsbatch#POST</li>
<li>/DefaultCollection/_apis/wit/workitems#GET</li>
<li>/DefaultCollection/*/_apis/wit/attachments#GET</li>
<li>/DefaultCollection/*/_apis/wit/revisions#GET</li>
<li>/DefaultCollection/*/_apis/wit/fields#GET</li>
<li>/DefaultCollection/*/_apis/wit/classificationnodes#GET</li>
<li>/DefaultCollection/*/_apis/wit/queries#GET</li>
<li>/DefaultCollection/*/_apis/wit/queriesbatch#POST</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypecategories#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypes#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypetemplate#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET</li>
<li>/DefaultCollection/*/*/_apis/wit/templates#GET</li>
<li>/DefaultCollection/_apis/wit/workitemicons#GET</li>
<li>/DefaultCollection/_apis/wit/recyclebin#GET</li>
<li>/DefaultCollection/*/_apis/wit/recyclebin#GET</li>
<li>/DefaultCollection/_apis/wit/workitemtransitions#GET</li>
<li>/DefaultCollection/_apis/wit/workitemtypetemplate#GET</li>
<li>/DefaultCollection/_apis/wit/$ruleEngine#POST</li>
<li>/DefaultCollection/*/_apis/work/boards#GET</li>
<li>/DefaultCollection/*/*/_apis/work/boards#GET</li>
<li>/DefaultCollection/*/*/_apis/work/iterations#GET</li>
<li>/DefaultCollection/*/_apis/work/teamsettings#GET</li>
<li>/DefaultCollection/*/*/_apis/work/teamsettings#GET</li>
<li>/DefaultCollection/*/_apis/work/processconfiguration#GET</li>
<li>/DefaultCollection/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogs#GET</li>
<li>/DefaultCollection/_apis/work/boardcolumns#GET</li>
<li>/DefaultCollection/*/_apis/work/boardcolumns#GET</li>
<li>/DefaultCollection/_apis/work/boardrows#GET</li>
<li>/DefaultCollection/*/_apis/work/boardrows#GET</li>
<li>/DefaultCollection/_apis/work/accountMyWorkRecentActivity#GET</li>
<li>/DefaultCollection/*/_apis/work/predefinedQueries#GET</li>
<li>/DefaultCollection/*/_apis/boards/boards#GET</li>
<li>/DefaultCollection/*/*/_apis/work/taskboardColumns#GET</li>
<li>/DefaultCollection/*/*/_apis/work/taskboardWorkItems#GET</li>
<li>/DefaultCollection/_apis/wit/reporting/workItemRevisions#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/reporting/workItemRevisions#GET+POST</li>
<li>/DefaultCollection/_apis/wit/reporting/workItemLinks#GET</li>
<li>/DefaultCollection/*/_apis/wit/reporting/workItemLinks#GET</li>
<li>/DefaultCollection/*/_apis/wit/reporting/workItemComments#GET</li>
<li>/DefaultCollection/_apis/process/processes#GET</li>
<li>/DefaultCollection/_apis/wit/artifactlinktypes#GET</li>
<li>/DefaultCollection/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/*/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/_apis/work/processes#GET</li>
<li>/DefaultCollection/_apis/work/processdefinitions#GET</li>
<li>/_apis/search/workItemSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/workItemSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/workItemSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/wit/tags#GET</li>
<li>/v2/_odata/*</li>
<li>/v2/_odata/*/*</li>
</ul>
<b>vso.work_write</b><br />
<ul>
<li>/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/attachments#GET+POST+PUT</li>
<li>/DefaultCollection/*/_apis/wit/attachments#GET+POST+PUT</li>
<li>/DefaultCollection/*/_apis/wit/classificationnodes#GET+POST+DELETE+PATCH</li>
<li>/DefaultCollection/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/workitems#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/recyclebin#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/_apis/boards/boards#GET+PATCH+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/recyclebin#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/$batch#POST</li>
<li>/DefaultCollection/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/*/*/_apis/wit/templates#GET+PUT+POST+DELETE</li>
<li>/DefaultCollection/_apis/work/processes#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/work/processdefinitions#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/fields#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/fields#GET+POST</li>
<li>/DefaultCollection/*/*/_apis/work/iterations#GET+PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/workitemsorder#PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/taskboardColumns#GET+PUT</li>
<li>/DefaultCollection/*/*/_apis/work/taskboardWorkItems#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/wit/tags#GET+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/projectProcessMigration#POST</li>
</ul>
<b>vso.work_full</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/WorkItemTracking/*/ClientService.asmx#POST</li>
<li>/WorkItemTracking/*/ConfigurationSettingsService.asmx#POST</li>
<li>/WorkItemTracking/*/Integration.asmx#POST</li>
<li>/*/WorkItemTracking/*/ClientService.asmx#POST</li>
<li>/*/WorkItemTracking/*/ConfigurationSettingsService.asmx#POST</li>
<li>/*/WorkItemTracking/*/Integration.asmx#POST</li>
<li>/Services/*/ProcessTemplate.asmx#POST</li>
<li>/*/Services/*/ProcessTemplate.asmx#POST</li>
<li>/Services/*/TeamConfigurationService.asmx#POST</li>
<li>/*/Services/*/TeamConfigurationService.asmx#POST</li>
<li>/WorkItemTracking/*/AttachFileHandler.ashx#GET</li>
<li>/*/WorkItemTracking/*/AttachFileHandler.ashx#GET</li>
<li>/WorkItemTracking/*/AttachFileHandler.ashx#POST</li>
<li>/*/WorkItemTracking/*/AttachFileHandler.ashx#POST</li>
</ul>
<b>vso.build</b><br />
<ul>
<li>/DefaultCollection/_apis/resources/Containers#GET</li>
<li>/DefaultCollection/*/_apis/build/builds#GET</li>
<li>/DefaultCollection/*/_apis/build/changes#GET</li>
<li>/DefaultCollection/*/_apis/build/folders#GET</li>
<li>/DefaultCollection/*/_apis/build/definitions#GET</li>
<li>/DefaultCollection/*/_apis/build/requests#GET</li>
<li>/DefaultCollection/*/_apis/build/qualities#GET</li>
<li>/DefaultCollection/*/_apis/build/tags#GET</li>
<li>/DefaultCollection/*/_apis/build/options#GET</li>
<li>/DefaultCollection/*/_apis/build/repos#GET</li>
<li>/DefaultCollection/*/_apis/build/latest#GET</li>
<li>/DefaultCollection/*/_apis/build/authorizedresources#GET</li>
<li>/DefaultCollection/*/_apis/build/definitions/*/resources#GET</li>
<li>/DefaultCollection/_apis/build/builds#GET</li>
<li>/DefaultCollection/_apis/build/queues#GET</li>
<li>/DefaultCollection/_apis/build/options#GET</li>
<li>/DefaultCollection/_apis/build/controllers#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/hubs/build/plans#GET</li>
<li>/_apis/clienttools/artifacttool/release#GET</li>
<li>/_apis/dedup/chunks/*#GET</li>
<li>/_apis/dedup/nodes/*#GET</li>
<li>/_apis/dedup/urls/*#POST</li>
<li>/_apis/artifact/*/content#GET</li>
<li>/*/_apis/clienttools/artifacttool/release#GET</li>
<li>/*/_apis/dedup/chunks/*#GET</li>
<li>/*/_apis/dedup/nodes/*#GET</li>
<li>/*/_apis/dedup/urls/*#POST</li>
<li>/*/_apis/artifact/*/content#GET</li>
<li>/_apis/pipelines#GET</li>
<li>/*/_apis/pipelines#GET</li>
</ul>
<b>vso.build_execute</b><br />
<ul>
<li>/DefaultCollection/*/_apis/build/builds#GET+PATCH+DELETE+PUT+POST</li>
<li>/DefaultCollection/*/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/folders#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/definitions#GET+POST+PUT+DELETE+PATCH</li>
<li>/DefaultCollection/*/_apis/build/authorizedresources#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/build/definitions/*/resources#GET+PATCH</li>
<li>/DefaultCollection/_apis/build/builds#GET+PATCH+DELETE+PUT+POST</li>
<li>/DefaultCollection/_apis/build/queues#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/distributedtask/hubs/build/plans#GET+PUT+POST+PATCH</li>
<li>/_apis/dedup/chunks/*#PUT+POST</li>
<li>/_apis/dedup/nodes/*#PUT+POST</li>
<li>/*/_apis/dedup/chunks/*#PUT+POST</li>
<li>/*/_apis/dedup/nodes/*#PUT+POST</li>
<li>/_apis/pipelines#GET+PATCH+DELETE+PUT+POST</li>
<li>/*/_apis/pipelines#GET+PATCH+DELETE+PUT+POST</li>
</ul>
<b>vso.pipelines</b><br />
<ul>
<li>/DefaultCollection/*/_apis/pipelines/*/runs#GET+POST</li>
<li>/DefaultCollection/_apis/pipelines/*/runs#GET+POST</li>
<li>/_apis/distributedtask/packages/agent#GET</li>
<li>/_apis/distributedtask/pools#DELETE+GET+PATCH+POST</li>
<li>/_apis/distributedtask/pools/*/agents#DELETE+GET+PATCH+POST+PUT</li>
<li>/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/_apis/distributedtask/pools/*/admintoken#GET</li>
<li>/_apis/distributedtask/pools/*/agents#GET</li>
</ul>
<b>vso.code</b><br />
<ul>
<li>/DefaultCollection/_apis/tfvc/branches#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/branches#GET</li>
<li>/DefaultCollection/_apis/tfvc/changesets#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/changesets#GET</li>
<li>/DefaultCollection/_apis/tfvc/changesetsBatch#POST</li>
<li>/DefaultCollection/_apis/tfvc/labels#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/labels#GET</li>
<li>/DefaultCollection/_apis/tfvc/labelItems#GET</li>
<li>/DefaultCollection/_apis/tfvc/shelvesets#GET</li>
<li>/DefaultCollection/_apis/tfvc/items#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/items#GET</li>
<li>/DefaultCollection/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/*/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/*/*/_git/*#GET</li>
<li>/DefaultCollection/*/_git/*#GET</li>
<li>/DefaultCollection/_git/*#GET</li>
<li>/DefaultCollection/*/*/_git/_full/*#GET</li>
<li>/DefaultCollection/*/_git/_full/*#GET</li>
<li>/DefaultCollection/_git/_full/*#GET</li>
<li>/DefaultCollection/*/*/_git/_optimized/*#GET</li>
<li>/DefaultCollection/*/_git/_optimized/*#GET</li>
<li>/DefaultCollection/_git/_optimized/*#GET</li>
<li>/DefaultCollection/*/*/_git/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/_git/*/git-upload-pack#POST</li>
<li>/DefaultCollection/_git/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/*/_git/_full/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/_git/_full/*/git-upload-pack#POST</li>
<li>/DefaultCollection/_git/_full/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/*/_git/_optimized/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/_git/_optimized/*/git-upload-pack#POST</li>
<li>/DefaultCollection/_git/_optimized/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/*/_git/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/_git/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/_git/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/*/_git/_full/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/_git/_full/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/_git/_full/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/*/_git/_optimized/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/_git/_optimized/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/_git/_optimized/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/*/_git/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_git/*/gvfs/*#POST</li>
<li>/DefaultCollection/_git/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/*/_git/_full/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_git/_full/*/gvfs/*#POST</li>
<li>/DefaultCollection/_git/_full/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/*/_git/_optimized/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_git/_optimized/*/gvfs/*#POST</li>
<li>/DefaultCollection/_git/_optimized/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/blobs#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commits</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/items#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pushes#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/refs#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/stats/branches#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/trees#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/*/_apis/git/favorites/refs#GET</li>
<li>/DefaultCollection/*/_apis/git/favorites/refs#POST</li>
<li>/DefaultCollection/*/_apis/git/favorites/refs#PUT</li>
<li>/DefaultCollection/*/_apis/git/favorites/refs#DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/blobs#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/items#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/fileDiffs#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/conflicts#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pushes#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/refs#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/stats/branches#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/trees#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/limitedRefCriteria#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/blobs#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/items#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/merges/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/refs#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/stats/branches#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/trees#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/_apis/git/repositories#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/blobs#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/items#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/conflicts#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/refs#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/stats/branches#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/trees#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/limitedRefCriteria#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/*/_apis/git/pullRequests#GET</li>
<li>/DefaultCollection/_apis/git/pullRequests#GET</li>
<li>/DefaultCollection/_apis/codereview/reviews#GET</li>
<li>/DefaultCollection/*/_apis/codereview/reviews#GET</li>
<li>/DefaultCollection/*/_apis/codereview/reviewsbatch#POST</li>
<li>/DefaultCollection/*/_apis/codereview/settings#GET</li>
<li>/DefaultCollection/_apis/visits/artifactVisitsBatch#POST</li>
<li>/DefaultCollection/_apis/visits/artifactStatsBatch#POST</li>
<li>/DefaultCollection/*/_apis/policy/Evaluations#GET</li>
<li>/DefaultCollection/*/_apis/policy/configurations#GET</li>
<li>/DefaultCollection/*/_apis/policy/types#GET</li>
<li>/DefaultCollection/*/_apis/policy/configurations/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/git/policy/configurations#GET</li>
<li>/_apis/search/codeSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/codeSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/codeSearchResults#POST</li>
<li>/_apis/search/advancedCodeSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/advancedCodeSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/advancedCodeSearchResults#POST</li>
<li>/_apis/search/codeQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/codeQueryResults#POST</li>
<li>/DefaultCollection/*/_apis/search/codeQueryResults#POST</li>
<li>/_apis/search/codeAdvancedQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/codeAdvancedQueryResults#POST</li>
<li>/DefaultCollection/*/_apis/search/codeAdvancedQueryResults#POST</li>
<li>/_apis/search/codeSearchPaginatedResults#POST</li>
<li>/DefaultCollection/_apis/search/codeSearchPaginatedResults#POST</li>
<li>/DefaultCollection/*/_apis/search/codeSearchPaginatedResults#POST</li>
<li>/_apis/search/customCode#GET</li>
<li>/DefaultCollection/_apis/search/customCode#GET</li>
<li>/DefaultCollection/*/_apis/search/customCode#GET</li>
<li>/_apis/search/customRepository#GET</li>
<li>/DefaultCollection/_apis/search/customRepository#GET</li>
<li>/DefaultCollection/*/_apis/search/customRepository#GET</li>
<li>/_apis/search/customProject#GET</li>
<li>/DefaultCollection/_apis/search/customProject#GET</li>
<li>/DefaultCollection/*/_apis/search/customProject#GET</li>
<li>/_apis/search/customTenant#GET</li>
<li>/DefaultCollection/_apis/search/customTenant#GET</li>
<li>/DefaultCollection/*/_apis/search/customTenant#GET</li>
<li>/_apis/search/status/repositories/*#GET</li>
<li>/DefaultCollection/*/_apis/search/status/repositories/*#GET</li>
</ul>
<b>vso.code_write</b><br />
<ul>
<li>/DefaultCollection/_apis/tfvc/changesets#GET+POST</li>
<li>/DefaultCollection/*/_apis/tfvc/changesets#GET+POST</li>
<li>/DefaultCollection/*/*/_git/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_git/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_git/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_git/_full/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_git/_full/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_git/_full/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_git/_optimized/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_git/_optimized/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_git/_optimized/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pushes#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/conflicts#PATCH</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pushes#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/objects#PUT</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/objects#PUT</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/conflicts#PATCH</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/merges#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/objects#PUT</li>
<li>/DefaultCollection/_apis/git/repositories/*/objects#PUT</li>
<li>/DefaultCollection/*/_apis/codereview/reviews#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/codereview/settings#POST+PUT</li>
<li>/DefaultCollection/_apis/visits/artifactVisits#PUT</li>
<li>/DefaultCollection/*/_apis/policy/Evaluations#PATCH</li>
<li>/DefaultCollection/*/_apis/policy/configurations#POST+PUT+DELETE</li>
<li>/_apis/search/customCode#POST</li>
<li>/DefaultCollection/_apis/search/customCode#POST</li>
<li>/DefaultCollection/*/_apis/search/customCode#POST</li>
<li>/_apis/search/customRepository#POST</li>
<li>/DefaultCollection/_apis/search/customRepository#POST</li>
<li>/DefaultCollection/*/_apis/search/customRepository#POST</li>
<li>/_apis/search/customTenant#POST</li>
<li>/DefaultCollection/_apis/search/customTenant#POST</li>
<li>/DefaultCollection/*/_apis/search/customTenant#POST</li>
</ul>
<b>vso.code_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/git/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/limitedRefCriteria#PUT</li>
<li>/DefaultCollection/_apis/git/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/limitedRefCriteria#PUT</li>
</ul>
<b>vso.code_full</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/v4.0/item.ashx</li>
<li>/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/DefaultCollection/Services/v4.0/item.ashx</li>
<li>/DefaultCollection/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/VersionControl/*/integration.asmx#POST</li>
<li>/VersionControl/*/repository.asmx#POST</li>
<li>/*/VersionControl/*/integration.asmx#POST</li>
<li>/*/VersionControl/*/repository.asmx#POST</li>
<li>/VersionControl/*/item.ashx#POST</li>
<li>/VersionControl/*/upload.ashx#POST</li>
<li>/*/VersionControl/*/item.ashx#POST</li>
<li>/*/VersionControl/*/upload.ashx#POST</li>
</ul>
<b>vso.code_status</b><br />
<ul>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/statuses#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/statuses#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/iterations/*/statuses#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/iterations/*/statuses#GET+POST+PATCH+DELETE</li>
</ul>
<b>vso.chat_write</b><br />
<ul>
<li>/DefaultCollection/_apis/chat/rooms#GET</li>
<li>/DefaultCollection/_apis/chat/rooms/*/messages#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/chat/rooms/*/users#GET+PUT+DELETE</li>
</ul>
<b>vso.chat_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/chat/rooms#GET+POST+PATCH+PUT+DELETE</li>
</ul>
<b>vso.agentpools</b><br />
<ul>
<li>/_apis/distributedtask/packages/agent#GET</li>
<li>/_apis/distributedtask/pools#GET</li>
<li>/_apis/distributedtask/pools/*/agents#GET</li>
<li>/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/_apis/distributedtask/queues#GET</li>
<li>/_apis/distributedtask/tasks#GET</li>
<li>/DefaultCollection/_apis/distributedtask/packages/agent#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/agents#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/DefaultCollection/_apis/distributedtask/queues#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/queues#GET</li>
<li>/DefaultCollection/_apis/distributedtask/tasks#GET</li>
</ul>
<b>vso.agentpools_manage</b><br />
<ul>
<li>/_apis/distributedtask/packages/agent#GET</li>
<li>/_apis/distributedtask/pools#DELETE+GET+PATCH+POST</li>
<li>/_apis/distributedtask/pools/*/agents#DELETE+GET+PATCH+POST+PUT</li>
<li>/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/_apis/distributedtask/queues#DELETE+GET+PATCH+POST+PUT</li>
<li>/_apis/distributedtask/tasks#DELETE+GET+PATCH+POST+PUT</li>
<li>/DefaultCollection/_apis/distributedtask/packages/agent#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools#DELETE+GET+PATCH+POST</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/agents#DELETE+GET+PATCH+POST+PUT</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/DefaultCollection/_apis/distributedtask/queues#DELETE+GET+PATCH+POST</li>
<li>/DefaultCollection/*/_apis/distributedtask/queues#DELETE+GET+PATCH+POST+PUT</li>
<li>/DefaultCollection/_apis/distributedtask/tasks#DELETE+GET+PATCH+POST+PUT</li>
</ul>
<b>vso.agentpools_listen</b><br />
<ul>
<li>/_apis/distributedtask/pools/*/jobrequests#GET+PATCH+DELETE</li>
<li>/_apis/distributedtask/pools/*/messages#GET+DELETE</li>
<li>/_apis/distributedtask/pools/*/sessions#GET+POST+DELETE</li>
<li>/_apis/distributedtask/pools/*/agents/*/updates#PUT</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/jobrequests#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/messages#GET+DELETE</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/sessions#GET+POST+DELETE</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/agents/*/updates#PUT</li>
</ul>
<b>vso.governance.extension_write</b><br />
<ul>
<li>/_apis/governance/components#GET</li>
<li>/_apis/governance/products#GET</li>
<li>/_apis/governance/products/*/registrations/*/policyStatuses#PUT</li>
<li>/*/_apis/ComponentGovernance/components#GET</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories#GET</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policyStatuses#PUT</li>
<li>/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policyStatuses#PUT</li>
<li>/*/_apis/ComponentGovernance/componentknowledgequeries#POST</li>
<li>/_apis/ComponentGovernance/componentknowledgequeries#POST</li>
</ul>
<b>vso.governance</b><br />
<ul>
<li>/_apis/governance/*#GET</li>
<li>/_apis/governance/products/*/registrationcomponentQueries#POST</li>
<li>/*/_apis/ComponentGovernance/*#GET</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrationcomponentQueries#POST</li>
</ul>
<b>vso.governance_write</b><br />
<ul>
<li>/_apis/governance/products/*/snapshots#PATCH</li>
<li>/_apis/governance/products/*/registrationrequests#POST</li>
<li>/_apis/governance/products/*/registrations#PATCH</li>
<li>/_apis/governance/products/*/registrationbatch#POST+PATCH</li>
<li>/_apis/governance/products/*/registrations/*/policystatuses/*/retryrequest#POST</li>
<li>/_apis/governance/products/*/registrations/*/policystatuses#PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/snapshots#PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrationrequests#POST</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations#PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrationbatch#POST+PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policystatuses/*/retryrequest#POST</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policystatuses#PATCH</li>
<li>/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policystatuses#PATCH</li>
</ul>
<b>vso.governance_manage</b><br />
<ul>
<li>/_apis/governance/*#POST+PATCH+PUT+DELETE</li>
<li>/*/_apis/ComponentGovernance/*#POST+PATCH+PUT+DELETE</li>
<li>/_apis/ComponentGovernance/*#POST+PATCH+PUT+DELETE</li>
</ul>
<b>vso.packaging</b><br />
<ul>
<li>/_apis/clienttools/artifacttool/release#GET</li>
<li>/_apis/dedup/chunks/*#GET</li>
<li>/_apis/dedup/nodes/*#GET</li>
<li>/_apis/dedup/urls/*#POST</li>
<li>/_apis/packaging#HEAD+GET</li>
<li>/_apis/public/packaging#HEAD+GET</li>
<li>/_packaging#HEAD+GET</li>
<li>/*/_apis/clienttools/artifacttool/release#GET</li>
<li>/*/_apis/dedup/chunks/*#GET</li>
<li>/*/_apis/dedup/nodes/*#GET</li>
<li>/*/_apis/dedup/urls/*#POST</li>
<li>/*/_apis/packaging#HEAD+GET</li>
<li>/*/_apis/public/packaging#HEAD+GET</li>
<li>/*/_packaging#HEAD+GET</li>
<li>/_apis/search/packageSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/packageSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/packageSearchResults#POST</li>
</ul>
<b>vso.packaging_write</b><br />
<ul>
<li>/_apis/dedup/chunks/*#PUT+POST</li>
<li>/_apis/dedup/nodes/*#PUT+POST</li>
<li>/_apis/packaging#HEAD+GET+POST+PUT</li>
<li>/_apis/provenance#HEAD+GET+POST+PUT</li>
<li>/_packaging#HEAD+GET+POST+PUT</li>
<li>/_packaging/*/nuget/v2#DELETE</li>
<li>/_packaging/*/npm#DELETE</li>
<li>/_apis/packaging/feeds/*/maven/groups/*/artifacts/*/versions#DELETE</li>
<li>/_apis/packaging/*/packages/*/versions#DELETE</li>
<li>/*/_apis/dedup/chunks/*#PUT+POST</li>
<li>/*/_apis/dedup/nodes/*#PUT+POST</li>
<li>/*/_apis/packaging#HEAD+GET+POST+PUT</li>
<li>/*/_apis/provenance#HEAD+GET+POST+PUT</li>
<li>/*/_packaging#HEAD+GET+POST+PUT</li>
<li>/*/_packaging/*/nuget/v2#DELETE</li>
<li>/*/_packaging/*/npm#DELETE</li>
<li>/*/_apis/packaging/feeds/*/maven/groups/*/artifacts/*/versions#DELETE</li>
<li>/*/_apis/packaging/*/packages/*/versions#DELETE</li>
</ul>
<b>vso.packaging_manage</b><br />
<ul>
<li>/_apis/packaging#HEAD+GET+PATCH+POST+PUT+DELETE</li>
<li>/_packaging#HEAD+GET+PATCH+POST+PUT+DELETE</li>
<li>/*/_apis/packaging#HEAD+GET+PATCH+POST+PUT+DELETE</li>
<li>/*/_packaging#HEAD+GET+PATCH+POST+PUT+DELETE</li>
</ul>
<b>vso.oss</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/*#GET</li>
</ul>
<b>vso.oss_write</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/Requests#POST+PUT+PATCH</li>
<li>/DefaultCollection/_apis/oss/Versions#PATCH</li>
<li>/DefaultCollection/_apis/oss/Validation#POST</li>
</ul>
<b>vso.oss_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/*#POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.oss.extension_read</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/ExtensionData/*#GET</li>
</ul>
<b>vso.oss.extension_write</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/ExtensionData/*#POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.test</b><br />
<ul>
<li>/DefaultCollection/_apis/test/suites#GET</li>
<li>/DefaultCollection/_apis/testplan/suites#GET</li>
<li>/DefaultCollection/*/_apis/test/plans#GET</li>
<li>/DefaultCollection/*/_apis/test/runs#GET</li>
<li>/DefaultCollection/*/_apis/test/extensionFields#GET</li>
<li>/DefaultCollection/*/_apis/test/suites#GET</li>
<li>/DefaultCollection/*/_apis/test/results#GET</li>
<li>/DefaultCollection/*/_apis/test/testSettings#GET</li>
<li>/DefaultCollection/*/_apis/test/codeCoverage#GET</li>
<li>/DefaultCollection/*/_apis/test/configurations#GET</li>
<li>/DefaultCollection/*/_apis/test/variables#GET</li>
<li>/DefaultCollection/*/_apis/test/cloneOperation#GET</li>
<li>/DefaultCollection/*/_apis/test/session#GET</li>
<li>/DefaultCollection/*/_apis/test/suiteEntry#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultRetentionSettings#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRelease#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByBuild#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRequirement#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultDetailsByRelease#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultDetailsByBuild#GET</li>
<li>/DefaultCollection/*/_apis/test/TestMethods#GET</li>
<li>/DefaultCollection/*/_apis/test/Points#GET</li>
<li>/DefaultCollection/*/_apis/testresults/runs#GET</li>
<li>/DefaultCollection/*/_apis/testresults/tags#GET</li>
<li>/DefaultCollection/*/_apis/testresults/tagsummary#GET</li>
<li>/DefaultCollection/*/_apis/testresults/testlog#GET</li>
<li>/DefaultCollection/*/_apis/testresults/testlogstoreendpoint#GET</li>
<li>/DefaultCollection/*/_apis/testresults/extensionFields#GET</li>
<li>/DefaultCollection/*/_apis/testresults/results#GET</li>
<li>/DefaultCollection/*/_apis/testresults/testSettings#GET</li>
<li>/DefaultCollection/*/_apis/testresults/codeCoverage#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultRetentionSettings#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRelease#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByBuild#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRequirement#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultDetailsByRelease#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultDetailsByBuild#GET</li>
<li>/DefaultCollection/*/_apis/testresults/TestMethods#GET</li>
<li>/DefaultCollection/*/_apis/testplan/plans#GET</li>
<li>/DefaultCollection/*/_apis/testplan/suites#GET</li>
<li>/DefaultCollection/*/_apis/testplan/configurations#GET</li>
<li>/DefaultCollection/*/_apis/testplan/variables#GET</li>
<li>/DefaultCollection/*/_apis/testplan/suiteEntry#GET</li>
<li>/DefaultCollection/*/*/_apis/test/session#GET</li>
<li>/DefaultCollection/_apis/FeatureFlags#GET</li>
</ul>
<b>vso.test_write</b><br />
<ul>
<li>/DefaultCollection/*/_apis/test/plans#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/suites#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/runs#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/results#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/extensionFields#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/testSettings#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/test/codeCoverage#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/configurations#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/variables#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/cloneOperation#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/session#GET+POST+PATCH</li>
<li>/DefaultCollection/*/_apis/test/suiteEntry#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/test/ResultRetentionSettings#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRelease#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRequirement#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/TestMethods#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/test/Points#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testresults/runs#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testresults/tags#GET+POST+PATCH</li>
<li>/DefaultCollection/*/_apis/testresults/tagsummary#GET+POST+PATCH</li>
<li>/DefaultCollection/*/_apis/testresults/testlog#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/testlogstoreendpoint#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/results#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/extensionFields#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/testSettings#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/testresults/codeCoverage#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/ResultRetentionSettings#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRelease#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRequirement#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/TestMethods#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/plans#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/suites#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/configurations#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/variables#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/suiteEntry#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/testplan/testcases#DELETE</li>
<li>/DefaultCollection/*/*/_apis/test/session#GET+POST+PATCH</li>
<li>/DefaultCollection/_apis/FeatureFlags#GET</li>
</ul>
<b>vso.loadtest</b><br />
<ul>
<li>/_apis/clt/testdrops</li>
<li>/_apis/clt/testruns</li>
<li>/_apis/clt/testruns/*/errors</li>
<li>/_apis/clt/testruns/*/messages</li>
<li>/_apis/clt/testruns/*/results</li>
<li>/_apis/clt/testruns/*/counterinstances</li>
<li>/_apis/clt/testruns/*/countersamples</li>
<li>/_apis/clt/apm</li>
<li>/_apis/clt/configuration</li>
<li>/_apis/clt/agentgroups</li>
<li>/_apis/clt/agentgroups/*/agents</li>
</ul>
<b>vso.loadtest_write</b><br />
<ul>
<li>/_apis/clt/testdrops#GET+POST</li>
<li>/_apis/clt/testruns#GET+POST+PATCH</li>
<li>/_apis/clt/agentgroups#GET+POST+PATCH+DELETE</li>
<li>/_apis/clt/agentgroups/*/agents#GET+POST+PATCH+DELETE</li>
</ul>
<b>vso.licensing</b><br />
<ul>
<li>/_apis/licensing/clientrights</li>
<li>/_apis/licensing/ExtensionEntitlements/*/*#GET</li>
<li>/_apis/licensing/Usage#GET</li>
<li>/_apis/licensing/AccountAssignedExtensions#GET</li>
</ul>
<b>vso.extension</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions#GET</li>
</ul>
<b>vso.extension_manage</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/InstalledExtensionsByName#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensionsByName#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/RequestedExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/RequestedExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/AcquisitionOptions#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/AcquisitionOptions#GET</li>
<li>/_apis/ExtensionManagement/AcquisitionRequests#POST</li>
<li>/DefaultCollection/_apis/ExtensionManagement/AcquisitionRequests#POST</li>
</ul>
<b>vso.extension.data</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET</li>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET</li>
<li>/_apis/Contribution/InstalledApps#GET</li>
<li>/DefaultCollection/_apis/Contribution/InstalledApps#GET</li>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/*/ExtensionDataCollectionQuery#POST</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/*/ExtensionDataCollectionQuery#POST</li>
</ul>
<b>vso.extension.data_write</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET+POST+PATCH+DELETE+PUT</li>
</ul>
<b>vso.extension.default</b><br />
<ul>
<li>/_apis/Contribution/InstalledApps#GET</li>
<li>/DefaultCollection/_apis/Contribution/InstalledApps#GET</li>
<li>/_apis/Contribution/nodes/query#POST</li>
<li>/DefaultCollection/_apis/Contribution/nodes/query#POST</li>
</ul>
<b>vso.extension.preview</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
</ul>
<b>vso.commerce.write</b><br />
<ul>
<li>/_apis/Commerce/*#GET+POST+PATCH+PUT</li>
<li>/_apis/Commerce/Subscription/*/*#GET+PUT+POST</li>
<li>/_apis/OfferMeter/*#GET+POST</li>
<li>/_apis/OfferMeter/OfferMeter/*#GET+POST</li>
<li>/_apis/OfferMeter/OfferMeterPrice/*#GET+PUT</li>
<li>/_apis/Meters/*#GET+PATCH</li>
<li>/_apis/Meters/Meters/*#GET+PATCH</li>
<li>/_apis/OfferSubscription/*#GET+POST+PATCH+PUT</li>
<li>/_apis/OfferSubscription/OfferSubscription/*#GET+POST+PATCH+PUT</li>
<li>/_apis/Subscription/Subscription/*/*#GET+PUT+POST+PATCH+DELETE</li>
<li>/_apis/PurchaseRequest/PurchaseRequest/*#PUT+PATCH</li>
<li>/_apis/Subscription/AccountDetails/*#GET</li>
<li>/_apis/OrganizationBilling/OrganizationBilling/*#GET</li>
<li>/_apis/DefaultAccessLevel/DefaultAccessLevel/*#GET+POST</li>
<li>/_apis/EnterpriseBilling/EnterpriseBilling/*#GET</li>
</ul>
<b>vso.azcomm_write</b><br />
<ul>
<li>/*/_apis/AzComm/BillingSetup/*#GET+PATCH+PUT+DELETE</li>
<li>/*/_apis/AzComm/MeterResource/*#GET+PATCH+POST</li>
<li>/_apis/AzComm/MeterUsage/*#GET+POST</li>
<li>/*/_apis/AzComm/MeterUsage2/*/*#GET+POST</li>
<li>/_apis/AzComm/AzureSubscription/*#GET</li>
<li>/*/_apis/AzComm/DefaultLicenseType/*#GET+PUT</li>
</ul>
<b>vso.gallery</b><br />
<ul>
<li>/_apis/gallery/publishers#GET</li>
<li>/_apis/gallery/extensions#GET</li>
</ul>
<b>vso.gallery_acquire</b><br />
<ul>
<li>/_apis/gallery/acquisitionrequests#POST</li>
<li>/_apis/gallery/acquisitionoptions#GET+POST</li>
</ul>
<b>vso.gallery_publish</b><br />
<ul>
<li>/_apis/gallery/publishers/*/extensions#POST+PUT+DELETE</li>
<li>/_apis/gallery/publisher/*/extension/*/accountsbyname#POST+DELETE</li>
<li>/_apis/gallery/extensions#POST+PUT+DELETE</li>
<li>/_apis/gallery/extensions/*/accounts#POST+DELETE</li>
</ul>
<b>vso.gallery_manage</b><br />
<ul>
<li>/_apis/gallery/publishers#POST+PUT+DELETE</li>
</ul>
<b>vso.entitlements</b><br />
<ul>
<li>/_apis/licensing/entitlements#GET</li>
</ul>
<b>preview_msdn_licensing</b><br />
<ul>
<li>/_apis/licensing/msdn/me</li>
</ul>
<b>user_impersonation</b><br />
<ul>
<li>/_signedin#GET+POST</li>
</ul>
<b>signout</b><br />
<ul>
<li>/_signout</li>
</ul>
<b>app_token</b><br />
<ul>
<li>/*#*</li>
</ul>
<b>vso.release</b><br />
<ul>
<li>/DefaultCollection/_apis/release/releases#GET</li>
<li>/DefaultCollection/*/_apis/release/definitions#GET</li>
<li>/DefaultCollection/*/_apis/release/definitions/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/release/releases#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/workitems#GET</li>
<li>/DefaultCollection/*/_apis/release/approvals#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/manualInterventions#GET</li>
<li>/DefaultCollection/*/_apis/release/deployments#GET+POST</li>
<li>/DefaultCollection/*/_apis/release/artifacts/versions#GET</li>
<li>/DefaultCollection/*/_apis/release/environmenttemplates#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/hubs/release/plans#GET</li>
<li>/DefaultCollection/*/_apis/release/artifacts/inputvaluesquery#POST</li>
<li>/DefaultCollection/*/_apis/release/folders#GET</li>
</ul>
<b>vso.release_execute</b><br />
<ul>
<li>/DefaultCollection/*/_apis/release/definitions#GET+POST+PUT</li>
<li>/DefaultCollection/*/_apis/release/definitions/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/release/releases#GET+POST+PATCH+PUT</li>
<li>/DefaultCollection/*/_apis/release/releases/*/workitems#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments#PATCH</li>
<li>/DefaultCollection/*/_apis/release/approvals#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/manualInterventions#GET</li>
<li>/DefaultCollection/*/_apis/release/environmenttemplates#GET+POST+PATCH</li>
<li>/DefaultCollection/*/_apis/release/gates#PATCH</li>
<li>/DefaultCollection/*/_apis/release/deployments#GET+POST</li>
<li>/DefaultCollection/*/_apis/release/artifacts/versions#GET+POST</li>
<li>/DefaultCollection/*/_apis/release/folders#GET+POST+PATCH</li>
</ul>
<b>vso.release_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/release/definitions#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/release/definitions/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/release/releases#GET+POST+PATCH+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/release/releases/*/workitems#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments#PATCH</li>
<li>/DefaultCollection/*/_apis/release/approvals#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/release/releases/*/manualInterventions#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/release/environmenttemplates#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/release/deployments#GET+POST</li>
<li>/DefaultCollection/*/_apis/release/folders#GET+POST+PATCH+DELETE</li>
</ul>
<b>vso.release_logs</b><br />
<ul>
<li>/DefaultCollection/*/_apis/release/releases/*/logs#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments/*/tasks/*/logs#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments/*/gates/*/tasks/*/logs#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments/*/deployPhases/*/tasks/*/logs#GET</li>
</ul>
<b>vso.securefiles_read</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/securefiles#GET</li>
</ul>
<b>vso.securefiles_write</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/securefiles#POST</li>
</ul>
<b>vso.securefiles_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/securefiles#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.machinegroup_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/machinegroups/*#GET+POST+DELETE+PATCH</li>
<li>/DefaultCollection/*/_apis/distributedtask/deploymentgroups/*#GET+POST+DELETE+PATCH+PUT</li>
</ul>
<b>vso.live_updates</b><br />
<ul>
<li>/signalr#GET+POST</li>
<li>/_apis/*/signalr#GET+POST</li>
</ul>
<b>vso.taskgroups</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups/*/revisions#GET</li>
</ul>
<b>vso.taskgroups_add</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#POST</li>
</ul>
<b>vso.taskgroups_read</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups/*/revisions#GET</li>
</ul>
<b>vso.taskgroups_write</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#POST</li>
</ul>
<b>vso.taskgroups_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.variablegroups_read</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/variablegroups#GET</li>
</ul>
<b>vso.variablegroups_write</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/variablegroups#POST</li>
</ul>
<b>vso.variablegroups_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/variablegroups#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.serviceendpoint</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/serviceendpoints#GET</li>
<li>/DefaultCollection/_apis/distributedtask/serviceendpointtypes#GET</li>
<li>/DefaultCollection/*/_apis/serviceendpoint/endpoints#GET</li>
<li>/DefaultCollection/_apis/serviceendpoint/types#GET</li>
</ul>
<b>vso.serviceendpoint_query</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/serviceendpointproxy#POST</li>
<li>/DefaultCollection/*/_apis/serviceendpoint/endpointproxy#POST</li>
</ul>
<b>vso.serviceendpoint_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/serviceendpoints#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/serviceendpoint/endpoints#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.drop</b><br />
<ul>
<li>/DefaultCollection/_apis/drop/client#HEAD</li>
<li>/DefaultCollection/_apis/blob/blobs/*#GET</li>
<li>/DefaultCollection/_apis/blob/blobsbatch#POST</li>
<li>/DefaultCollection/_apis/dedup/chunks/*#GET</li>
<li>/DefaultCollection/_apis/dedup/nodes/*#GET</li>
<li>/DefaultCollection/_apis/dedup/urls/*#POST</li>
<li>/DefaultCollection/_apis/drop/drop#OPTIONS</li>
<li>/DefaultCollection/_apis/drop/drop/*#GET</li>
<li>/DefaultCollection/_apis/drop/fetch/*#GET+POST</li>
<li>/DefaultCollection/_apis/drop/drops/*#OPTIONS+GET</li>
<li>/DefaultCollection/_apis/drop/manifests/*#OPTIONS+GET</li>
</ul>
<b>vso.drop_write</b><br />
<ul>
<li>/DefaultCollection/_apis/blob/blobs#OPTIONS</li>
<li>/DefaultCollection/_apis/blob/blobs/*#POST</li>
<li>/DefaultCollection/_apis/dedup/chunks/*#PUT+POST</li>
<li>/DefaultCollection/_apis/dedup/nodes/*#PUT+POST</li>
<li>/DefaultCollection/_apis/drop/drop/*#PUT+POST+PATCH</li>
<li>/DefaultCollection/_apis/drop/drops/*#OPTIONS+PUT+POST+PATCH</li>
<li>/DefaultCollection/_apis/drop/manifests/*#OPTIONS+POST</li>
</ul>
<b>vso.drop_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/drop/drop/*#DELETE</li>
<li>/DefaultCollection/_apis/drop/drops/*#DELETE</li>
</ul>
<b>vso.buildcache</b><br />
<ul>
<li>/_apis/buildcache/cachedeterminismguid/*#GET</li>
<li>/_apis/buildcache/contenthashlist#OPTIONS</li>
<li>/_apis/buildcache/contenthashlist/*#GET</li>
<li>/_apis/buildcache/selector#OPTIONS</li>
<li>/_apis/buildcache/selector/*#GET</li>
<li>/_apis/blob/blob/referencesbatch#POST</li>
</ul>
<b>vso.buildcache_write</b><br />
<ul>
<li>/_apis/buildcache/contenthashlist/*#POST</li>
<li>/_apis/buildcache/incorporateStrongFingeprint/*#PUT</li>
<li>/_apis/blob/blobs#OPTIONS</li>
<li>/_apis/blob/blobs/*#POST</li>
</ul>
<b>vso.authorization_grant</b><br />
<ul>
<li></li>
</ul>
<b>vso.project</b><br />
<ul>
<li>/DefaultCollection/_apis/projects#GET</li>
<li>/DefaultCollection/_apis/teams#GET</li>
</ul>
<b>vso.project_write</b><br />
<ul>
<li>/DefaultCollection/_apis/projects#PATCH</li>
</ul>
<b>vso.project_manage</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/_apis/projects#POST+DELETE</li>
<li>/Services/*/CommonStructureService.asmx#POST</li>
<li>/*/Services/*/CommonStructureService.asmx#POST</li>
<li>/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
<li>/*/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
<li>/*/*/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
<li>/*/*/*/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
</ul>
<b>vso.symbols</b><br />
<ul>
<li>/DefaultCollection/_apis/symbol/symsrv#OPTIONS</li>
<li>/DefaultCollection/_apis/symbol/symsrv/*#GET</li>
<li>/DefaultCollection/_apis/symbol/debugentries#OPTIONS</li>
<li>/DefaultCollection/_apis/symbol/debugentries/*#GET</li>
<li>/DefaultCollection/_apis/symbol/requests#OPTIONS+GET</li>
</ul>
<b>vso.symbols_write</b><br />
<ul>
<li>/DefaultCollection/_apis/symbol/requests#POST</li>
<li>/DefaultCollection/_apis/symbol/requests/*#POST+PATCH</li>
<li>/DefaultCollection/_apis/blob/blobs#OPTIONS</li>
<li>/DefaultCollection/_apis/blob/blobs/*#POST</li>
</ul>
<b>vso.symbols_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/symbol/requests/*#DELETE</li>
</ul>
<b>vso.analytics</b><br />
<ul>
<li>/DefaultCollection/_odata/*#GET</li>
<li>/DefaultCollection/*/_odata/*#GET</li>
<li>/_odata/*/$batch#POST</li>
<li>/_odata/$batch#POST</li>
<li>/DefaultCollection/*/_apis/analytics/views#GET</li>
<li>/DefaultCollection/_apis/Favorite/Favorites#GET</li>
</ul>
<b>vso.gh_analytics</b><br />
<ul>
<li>/DefaultCollection/_apis/analytics/stage#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/analytics/stage/*/*/Invalid#POST</li>
</ul>
<b>vso.identitypicker</b><br />
<ul>
<li>/_apis/IdentityPicker/identities#POST</li>
<li>/_apis/IdentityPicker/identities/*/avatar#GET</li>
<li>/DefaultCollection/_apis/IdentityPicker/identities#POST</li>
<li>/DefaultCollection/_apis/IdentityPicker/identities/*/avatar#GET</li>
</ul>
<b>vso.dashboards</b><br />
<ul>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards#HEAD+GET</li>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards/*/widgets#HEAD+GET</li>
</ul>
<b>vso.dashboards_manage</b><br />
<ul>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards#HEAD+GET+POST+DELETE</li>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards/*/widgets#HEAD+GET+POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.connected_server</b><br />
<ul>
<li>/_apis/Commerce/CommercePackage#GET</li>
<li>/_apis/Commerce/CommercePackage/*#GET</li>
</ul>
<b>vso.notification</b><br />
<ul>
<li>/_apis/notification/EventTypes#GET</li>
<li>/_apis/notification/EventTypes/*/fieldValuesQuery#POST</li>
<li>/_apis/notification/Subscriptions#GET</li>
<li>/_apis/notification/SubscriptionQuery#POST</li>
<li>/_apis/notification/Follows#GET</li>
<li>/_apis/notification/SubscriptionTemplates#GET</li>
<li>/_apis/notification/StatisticsQuery#POST</li>
<li>/_apis/notification/subscribers#GET</li>
<li>/_apis/notification/EventTransforms#POST</li>
<li>/DefaultCollection/_apis/notification/EventTypes#GET</li>
<li>/DefaultCollection/_apis/notification/EventTypes/*/fieldValuesQuery#POST</li>
<li>/DefaultCollection/_apis/notification/Subscriptions#GET</li>
<li>/DefaultCollection/_apis/notification/SubscriptionQuery#POST</li>
<li>/DefaultCollection/_apis/notification/Follows#GET</li>
<li>/DefaultCollection/_apis/notification/SubscriptionTemplates#GET</li>
<li>/DefaultCollection/_apis/notification/StatisticsQuery#POST</li>
<li>/DefaultCollection/_apis/notification/subscribers#GET</li>
<li>/DefaultCollection/_apis/notification/EventTransforms#POST</li>
</ul>
<b>vso.notification_write</b><br />
<ul>
<li>/_apis/notification/Subscriptions#GET+PATCH+POST+DELETE+PUT</li>
<li>/DefaultCollection/_apis/notification/Subscriptions#GET+PATCH+POST+DELETE+PUT</li>
<li>/_apis/notification/SubscriptionEvaluationRequests#GET+POST</li>
<li>/DefaultCollection/_apis/notification/SubscriptionEvaluationRequests#GET+POST</li>
<li>/_apis/notification/Follows#GET+POST+DELETE</li>
<li>/DefaultCollection/_apis/notification/Follows#GET+POST+DELETE</li>
<li>/_apis/notification/subscribers#GET+PATCH</li>
<li>/DefaultCollection/_apis/notification/subscribers#GET+PATCH</li>
</ul>
<b>vso.notification_manage</b><br />
<ul>
<li>/_apis/notification/BatchNotificationOperations#POST</li>
<li>/DefaultCollection/_apis/notification/BatchNotificationOperations#POST</li>
</ul>
<b>vso.notification_publish</b><br />
<ul>
<li>/_apis/notification/Events#POST</li>
<li>/DefaultCollection/_apis/notification/Events#POST</li>
</ul>
<b>vso.settings</b><br />
<ul>
<li>/_apis/Settings/*#GET</li>
<li>/DefaultCollection/_apis/Settings/*#GET</li>
</ul>
<b>vso.settings_write</b><br />
<ul>
<li>/_apis/Settings/*#GET+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/Settings/*#GET+PUT+PATCH+DELETE</li>
</ul>
<b>vso.features</b><br />
<ul>
<li>/_apis/FeatureManagement/*#GET</li>
<li>/DefaultCollection/_apis/FeatureManagement/*#GET</li>
<li>/_apis/FeatureManagement/FeatureStatesQuery/*#POST</li>
<li>/DefaultCollection/_apis/FeatureManagement/FeatureStatesQuery/*#POST</li>
</ul>
<b>vso.features_write</b><br />
<ul>
<li>/_apis/FeatureManagement/*#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/FeatureManagement/*#GET+POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.proxy</b><br />
<ul>
<li>/Services/v4.0/item.ashx</li>
<li>/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/TeamFoundation/Administration/v3.0/LocationService.asmx#POST</li>
<li>/Services/v3.0/LocationService.asmx#POST</li>
<li>/DefaultCollection/Services/v4.0/item.ashx</li>
<li>/DefaultCollection/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/DefaultCollection/Services/v3.0/LocationService.asmx#POST</li>
<li>/*/*/*/_git/*#GET</li>
<li>/*/*/_git/*#GET</li>
<li>/*/_git/*#GET</li>
<li>/*/*/*/_git/_full/*#GET</li>
<li>/*/*/_git/_full/*#GET</li>
<li>/*/_git/_full/*#GET</li>
<li>/*/*/*/_git/*/git-upload-pack#POST</li>
<li>/*/*/_git/*/git-upload-pack#POST</li>
<li>/*/_git/*/git-upload-pack#POST</li>
<li>/*/*/*/_git/_full/*/git-upload-pack#POST</li>
<li>/*/*/_git/_full/*/git-upload-pack#POST</li>
<li>/*/_git/_full/*/git-upload-pack#POST</li>
<li>/*/*/*/_git/*/gvfs/*#POST</li>
<li>/*/*/_git/*/gvfs/*#POST</li>
<li>/*/_git/*/gvfs/*#POST</li>
<li>/*/*/*/_git/_full/*/gvfs/*#POST</li>
<li>/*/*/_git/_full/*/gvfs/*#POST</li>
<li>/*/_git/_full/*/gvfs/*#POST</li>
</ul>
<b>vso.graph</b><br />
<ul>
<li>/_apis/graph/descriptors/*#GET</li>
<li>/_apis/graph/groups/*#GET</li>
<li>/_apis/graph/subjectlookup#POST</li>
<li>/_apis/graph/memberships/*#GET</li>
<li>/_apis/graph/memberships/*/*#GET+HEAD</li>
<li>/_apis/graph/membershipstates/*#GET</li>
<li>/_apis/graph/storagekeys/*#GET</li>
<li>/_apis/graph/scopes/*#GET</li>
<li>/_apis/graph/subjects/*#GET</li>
<li>/_apis/graph/users/*#GET</li>
<li>/*/_apis/graph/descriptors/*#GET</li>
<li>/*/_apis/graph/groups/*#GET</li>
<li>/*/_apis/graph/subjectlookup#POST</li>
<li>/*/_apis/graph/memberships/*#GET</li>
<li>/*/_apis/graph/memberships/*/*#GET+HEAD</li>
<li>/*/_apis/graph/membershipstates/*#GET</li>
<li>/*/_apis/graph/storagekeys/*#GET</li>
<li>/*/_apis/graph/scopes/*#GET</li>
<li>/*/_apis/graph/subjects/*#GET</li>
<li>/*/_apis/graph/users/*#GET</li>
</ul>
<b>vso.graph_manage</b><br />
<ul>
<li>/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/users/*#POST+DELETE</li>
<li>/*/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/*/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/users/*#POST+DELETE</li>
</ul>
<b>vso.graph_write</b><br />
<ul>
<li>/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/users/*#POST+DELETE</li>
<li>/*/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/*/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/users/*#POST+DELETE</li>
</ul>
<b>vso.security_manage</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/_apis/SecurityNamespaces#POST</li>
<li>/_apis/AccessControlLists#POST+DELETE</li>
<li>/_apis/AccessControlEntries#POST+DELETE</li>
<li>/_apis/Permissions#DELETE</li>
<li>/DefaultCollection/_apis/SecurityNamespaces#POST</li>
<li>/DefaultCollection/_apis/AccessControlLists#POST+DELETE</li>
<li>/DefaultCollection/_apis/AccessControlEntries#POST+DELETE</li>
<li>/DefaultCollection/_apis/Permissions#DELETE</li>
<li>/_apis/securityroles/scopes/*/roleassignments/resources/*#POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/securityroles/scopes/*/roleassignments/resources/*#POST+PUT+DELETE</li>
<li>/Services/*/SecurityService.asmx#POST</li>
<li>/*/Services/*/SecurityService.asmx#POST</li>
<li>/Services/*/GroupSecurityService.asmx#POST</li>
<li>/*/Services/*/GroupSecurityService.asmx#POST</li>
</ul>
<b>vso.memberentitlementmanagement</b><br />
<ul>
<li>/_apis/MemberEntitlements/*#GET</li>
<li>/_apis/MemberEntitlements#GET</li>
<li>/_apis/GroupEntitlements/*#GET</li>
<li>/_apis/GroupEntitlements#GET</li>
<li>/_apis/UserEntitlements/*#GET</li>
<li>/_apis/UserEntitlements#GET</li>
<li>/_apis/UserEntitlementSummary#GET</li>
<li>/DefaultCollection/_apis/MemberEntitlements/*#GET</li>
<li>/DefaultCollection/_apis/MemberEntitlements#GET</li>
<li>/DefaultCollection/_apis/GroupEntitlements/*#GET</li>
<li>/DefaultCollection/_apis/GroupEntitlements#GET</li>
<li>/DefaultCollection/_apis/UserEntitlements/*#GET</li>
<li>/DefaultCollection/_apis/UserEntitlements#GET</li>
<li>/DefaultCollection/_apis/UserEntitlementSummary#GET</li>
</ul>
<b>vso.memberentitlementmanagement_write</b><br />
<ul>
<li>/_apis/MemberEntitlements/*#PATCH+DELETE</li>
<li>/_apis/MemberEntitlements#POST</li>
<li>/_apis/GroupEntitlements/*#PATCH+DELETE</li>
<li>/_apis/GroupEntitlements#POST</li>
<li>/_apis/UserEntitlements/*#PATCH+DELETE</li>
<li>/_apis/UserEntitlements#PATCH+POST</li>
<li>/DefaultCollection/_apis/MemberEntitlements/*#PATCH+DELETE</li>
<li>/DefaultCollection/_apis/MemberEntitlements#POST</li>
<li>/DefaultCollection/_apis/GroupEntitlements/*#PATCH+DELETE</li>
<li>/DefaultCollection/_apis/GroupEntitlements#POST</li>
<li>/DefaultCollection/_apis/UserEntitlements/*#PATCH+DELETE</li>
<li>/DefaultCollection/_apis/UserEntitlements#PATCH+POST</li>
</ul>
<b>vso.wiki</b><br />
<ul>
<li>/DefaultCollection/_apis/wiki/wikis#GET</li>
<li>/DefaultCollection/*/_apis/wiki/wikis#GET</li>
<li>/_apis/search/wikiSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/wikiSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/wikiSearchResults#POST</li>
</ul>
<b>vso.wiki_write</b><br />
<ul>
<li>/DefaultCollection/_apis/wiki/wikis#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wiki/wikis#GET+POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.teams_integration</b><br />
<ul>
<li>/_teams/configure#GET</li>
<li>/_teams/configure#POST</li>
</ul>
<b>vso.notification_diagnostics</b><br />
<ul>
<li>/_apis/notification/subscriptions/*/diagnostics#GET+PUT</li>
<li>/DefaultCollection/_apis/notification/subscriptions/*/diagnostics#GET+PUT</li>
<li>/_apis/notification/DiagnosticLogs#GET</li>
<li>/DefaultCollection/_apis/notification/DiagnosticLogs#GET</li>
</ul>
<b>vso.workitemsearch</b><br />
<ul>
<li>/_apis/search/workItemQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/workItemQueryResults#POST</li>
</ul>
<b>vso.codesearch</b><br />
<ul>
<li>/_apis/search/codeQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/codeQueryResults#POST</li>
<li>/_apis/search/codeAdvancedQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/codeAdvancedQueryResults#POST</li>
</ul>
<b>vso.tokenadministration</b><br />
<ul>
<li>/DefaultCollection/_apis/tokenadmin/revocations#POST</li>
<li>/DefaultCollection/_apis/tokenadmin/revocationrules#POST</li>
<li>/DefaultCollection/_apis/tokenadmin/personalaccesstokens/*#GET</li>
</ul>
<b>vso.tokens</b><br />
<ul>
<li></li>
</ul>
<b>vso.auditlog</b><br />
<ul>
<li>/_apis/audit/auditlog#GET</li>
<li>/_apis/audit/downloadlog#GET</li>
</ul>
<b>vso.auditstreams_manage</b><br />
<ul>
<li>/_apis/audit/streams#GET+POST+PUT</li>
</ul>
<b>vso.auditstreams_delete</b><br />
<ul>
<li>/_apis/audit/streams#DELETE</li>
</ul>
<b>vso.chatops_teams</b><br />
<ul>
<li>/_teams/configure#GET</li>
<li>/_teams/configure#POST</li>
<li>/_apis/teams/messages#POST</li>
<li>/_teams/azpipelinesconfigure#GET</li>
<li>/_teams/azpipelinesconfigure#POST</li>
<li>/_apis/teams/azpipelinesmessages#POST</li>
<li>/_teams/azboardsconfigure#GET</li>
<li>/_teams/azboardsconfigure#POST</li>
<li>/_apis/teams/azboardsmessages#POST</li>
<li>/_teams/azreposconfigure#GET</li>
<li>/_teams/azreposconfigure#POST</li>
<li>/_apis/teams/azreposmessages#POST</li>
<li>/_teams/signout#POST</li>
</ul>
<b>vso.chatops_slack</b><br />
<ul>
<li>/_apis/slack/slashcommands#POST</li>
<li>/_apis/slack/menuoptions#POST</li>
<li>/_apis/slack/interactivecomponents#POST</li>
<li>/_apis/slack/slackeventmessages#POST</li>
<li>/_apis/slack/boardsslashcommands#POST</li>
<li>/_apis/slack/boardsmenuoptions#POST</li>
<li>/_apis/slack/boardsinteractivecomponents#POST</li>
<li>/_apis/slack/boardsslackeventmessages#POST</li>
<li>/_apis/slack/reposslashcommands#POST</li>
<li>/_apis/slack/reposinteractivecomponents#POST</li>
<li>/_apis/slack/reposslackeventmessages#POST</li>
<li>/_apis/slack/*#POST</li>
</ul>
<b>vso.environment_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/pipelines/environments/*#GET+POST+DELETE+PATCH+PUT</li>
</ul>
<b>vso.chatops_azure_teams</b><br />
<ul>
<li>/_apis/teams/azalertsmessages#POST</li>
<li>/_teams/signout#POST</li>
</ul>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-27384369169097198262020-07-31T12:03:00.006-04:002021-12-05T18:30:14.694-05:00It's AzDevOps all the way downOy vey. Some posts ago, I've mentioned that all <s>TFS</s> Azure DevOps collection databases had the same schema, haven't I? Well, not quite.<span><a name='more'></a></span><span><br /></span><div><br /></div><div>The team collections in my TFS setup all go back a few years. They were created when the instance was running TFS 2015 or even TFS 2013. Since then, we had no new collections - until a couple of weeks ago. We've created a new collection, and it threw a major monkey wrench into the database-based reporting works.</div><div><br /></div><div>For starters, the name of the new collection database is not <font face="courier">Tfs_CollectionName</font>; it's <font face="courier">AzureDevOps_CollectionName</font>. So the <a href="https://rathertech.blogspot.com/2018/12/federating-tfs-tables-across-collections.html">federation query generator</a> was thrown off right away. Fortunately, one can join <font face="courier">tbl_Host</font> to <font face="courier">Tfs_Configuration.dbo.tbl_Database</font> to resolve that.</div><div><br /></div><div>In addition, they've rearranged the order of columns in some of the tables I was federating. As far as I could see, they didn't introduce any substantive schema discrepancies between legacy collections and modern ones, but the column order difference made federation by SELECT *... UNION impossible. Now the procedure has to spell out the exact field names for each table by selecting from a system view:</div><div><br /></div><div><div><font face="courier"> set @FieldSet = (select '[' + name + ']' as a from Tfs_DefaultCollection.sys.columns</font></div><div><font face="courier"> where [object_id]=object_id('Tfs_DefaultCollection.'+@Owner+'.'+@Table)</font></div><div><font face="courier"> order by column_id</font></div><div><font face="courier"><span style="white-space: pre;"></span> for xml path(''))</font></div></div><div><font face="courier"> set @FieldSet = replace(substring(@FieldSet, 4, len(@FieldSet) - 7), '</a><a>', ',')</font></div><div><br /></div><div>For on-prem instances of AzDevOps that were never TFS, the database names <span style="font-family: courier;">Tfs_Configuration</span><font face="inherit"> and </font><span style="font-family: courier;">Tfs_DefaultCollection</span><font face="inherit"> that I'm using without further reflection might be off, too.</font></div><div><font face="inherit"><br /></font></div><div><font face="inherit">Note: I know about </font><font face="courier">STRING_AGG</font><font face="inherit"> in MSSQL 2017+. We have an old server.</font></div>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-40021809895526434022020-05-13T14:07:00.000-04:002020-05-14T15:13:48.467-04:00Full circleFollowing up from <a href="https://rathertech.blogspot.com/2020/05/csr-with-powershell.html" target="_blank">my last post about generating a CSR</a>, I went through the motions of testing the full cycle for said CSR. I'd sign it with a bogus (but locally trusted) authority certificate, install the signed cert locally, export the PFX, install it on a Web server, select the cert for TLS on an IIS website, and hit it with a bunch of desktop browsers. The certificate works as expected.<br />
<br />
<a name='more'></a><br />
That said, the part where I've signed the CSR with another cert (technically with its private key) was somewhat involved. Initially I thought I'd do it in PowerShell, but it turned out some of the requisite logic is native only. It's present in CryptoAPI, but .NET doesn't surface it. There is a .NET method for signing a CSR object with another certificate, the way a certificate authority would, but there's no method for loading a CSR from a file, short of either P/Invoke or writing your own ASN.1 parser. Similarly, serializing the Authority Key Identifier extension, which is rather relevant for establishing the certificate chain, is supported by CryptoAPI but not by .NET.<br />
<br />
In general, the job is doable in PowerShell, but only if one is willing to either write a bunch of ugly P/Invoke and marshaling code, or reinvent a good piece of CryptoAPI logic. The minimal workable "sign a CSR with a cert" piece was ~130 lines of C++ (would be more with proper error handling and careful memory management), and probably twice as many in PowerShell.<br />
<br />Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-56216559027684714152020-05-11T15:37:00.006-04:002020-09-23T11:36:20.706-04:00CSR with PowerShellFollowing up from a <a href="https://rathertech.blogspot.com/2014/06/vba-code-signing-with-corporate.html" target="_blank">past post</a>, I've decided to put together a PowerShell script for generating a certificate signing request for a certificate authority to sign. <a href="https://gist.github.com/sevaa/802a01649aa0746c959240146074c2b5" target="_blank">Here's the script</a>, but some commentary is in order.<br />
<br />
<a name='more'></a><br />
<br />
There are several examples of creating certificate signing requests (CSRs) using PowerShell out there, but they tend to use the <span style="font-family: "courier new" , "courier" , monospace;">certreq</span> command line utility, and that's a crying shame, seeing that PowerShell is a perfectly valid .NET library consumer. The <span style="font-family: "courier new" , "courier" , monospace;">System.Security.Cryptography</span> namespace has all the crypto you need.<br />
<br />
I explicitly set out to emulate both the certificate request format and the storage methods that Microsoft tools use, so that the generated request would play nicely with the rest of the Microsoft world. Notably, the private key is persisted in the Windows key store (either current user or local machine), and the certificate request is persisted as a self-signed cert-key pair in the certificate store under "Certificate Enrollment Requests".<br />
<br />
Since emulating the Microsoft toolset was the goal, some of the cert properties the script creates are extraneous. For example, for <b>Key Usage</b> it's enough to provide <b>Key Encipherment</b> and <b>Digital Signature</b>, but Microsoft also adds <b>Data Encipherment</b>, so my script does, too. In the same vein, for <b>Enhanced Key Usage</b>, <b>Server Auth</b> is sufficient for TLS, but Microsoft adds <b>Client Auth</b> also, and so does my script. To the best of my knowledge, the mainstream HTTPS clients would happily work without those extra usage values.<br />
<br />
The crypto algorithms in the script are hard-coded to RSA with 2048-bit key and SHA256. As of this writing (May 2020), this is considered sufficiently secure. The script uses .NET classes for RSA that are backed by the native CNG library (Crypto Next Generation), as opposed to the legacy CryptoAPI. CNG is supported since Windows Vista.<br />
<br />
Following Microsoft's example, the script adds the <b>Application Policies</b> and <b>Friendly Name</b> extensions. <b>Application Policies</b> seems to be a slightly reformatted copy of <b>Enhanced Key Usage</b>. The script hardcodes them both. As for the <b>Friendly Name</b> extension (OID 1.3.6.1.4.1.311.10.11.11), that's a strange extension. Even though the Microsoft Certificate Manager appends it to the cert request as long as you provide a friendly name, it's a second class citizen in Windows. Microsoft's own certificate viewer doesn't know about it (displays just the numeric OID, and the value is displayed as a raw byte array). The <span style="font-family: "courier new" , "courier" , monospace;">System.Security.Cryptography.Oid</span> class doesn't report its display name. The native API function <span style="font-family: "courier new" , "courier" , monospace;">CryptFindOIDInfo</span>, which backs the display name lookup in <span style="font-family: "courier new" , "courier" , monospace;">Oid</span>, returns NULL for it. The said OID is documented in wincrypt.h as <span style="font-family: "courier new" , "courier" , monospace;">szOID_CERT_PROP_ID_PREFIX</span> followed by <span style="font-family: "courier new" , "courier" , monospace;">CERT_FRIENDLY_NAME_PROP_ID</span>. Its content should be a UTF-16 representation of the certificate friendly name parameter, NULL terminated. Even though the certificate <i>details</i> window is not aware of this extension, whatever logic generates the Friendly Name column in the certificate list is.<br />
<br />
<a href="https://aka.ms/AA8dvlr" target="_blank">There's a Windows feedback problem report for that issue.</a> Feel free to click and upvote.<br />
<br />
<b>Subject Alternative Name</b> is pretty much a required extension now. Chrome displays the scary security message (you know the one) if SAN is not present in the cert. So the script doesn't even consider the case when alternative name(s) are not given. The script uses the <span style="font-family: courier;">SubjectAlternativeNameBuilder</span> class, which is only available since .NET 4.7.2; there's a legacy version of the script side by side that doesn't depend on that class.<br />
<br />
In PowerShell 5+, there's a <span style="font-family: "courier new" , "courier" , monospace;">using namespace</span> command, which would make the script easier to follow by omitting the namespace name. I've decided to go with PowerShell 4 compatibility instead.Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-13740841883792887572020-04-22T14:52:00.002-04:002020-07-30T18:17:20.729-04:00c:\>TFSToday, we're going to take a look at another wonderfully disjoint area of <strike>TFS</strike> Azure DevOps administration - command line clients. There are four Microsoft provided ones (that I know), and another that's probably the best of them all.<br />
<br />
<a name='more'></a><br />
<h4>
Tf.exe, the Visual Studio one</h4>
This is the command line utility that comes with Visual Studio. As of Visual Studio 2019, it resides under (Visual Studio)\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer, and its primary focus is source control, both TFVC and Git. Plays nicely with the Visual Studio TFVC integration, in the sense that it's aware of local workspaces. By default, it's not under PATH, but it is if you open the Developer Command Prompt.<br />
<br />
Since it ships along with Visual Studio, it's definitely by Microsoft. Historically, it's probably the oldest command line TFS client.<br />
<h4>
Tfx, the node.js based one</h4>
This one is familiar to anyone who has ever developed TFS extensions. It comes as an NPM package called <span style="font-family: "courier new" , "courier" , monospace;">tfx-cl</span>i, its NPM home is <a href="https://www.npmjs.com/package/tfx-cli" target="_blank">here</a>, and its sources are <a href="https://github.com/Microsoft/tfs-cli" target="_blank">out on Github</a>, under Microsoft. The focus is different; it has three sections:<br />
<ol>
<li>extension</li>
<li>build</li>
<li>workitem</li>
</ol>
<div>
Unlike Tf.exe, it's cross platform. For the same reason, it doesn't support Windows (NTLM) authentication when connecting to on-prem TFS from a Windows client; that's a major functional gap of the node.js HTTP client.</div>
<div>
<br /></div>
<div>
To the best of my knowledge, this tool is the only way to compile an extension to a VSIX file.</div>
<h4>
Az devops, the misleadingly named one</h4>
<div>
"<span style="font-family: "courier new" , "courier" , monospace;">Az</span>" is a command line utility for administering all things Azure, including the bits that are branded as Azure but are not cloud based (e. g. the on-prem Azure DevOps Server, formerly known as TFS). It ships as a standalone installation script (MSI), but internally, it's a Python app. A copy of Python 3.6 ships along with it (at least for Windows). Like the previous one, it's cross platform by virtue of its Pythonic nature, and incapable of using Windows auth for the very same reason.</div>
<div>
<br /></div>
<div>
It's <a href="https://github.com/Azure/azure-cli" target="_blank">home on Github</a> is under Azure, definitely a Microsoft property.</div>
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">Az</span> has a plugin based architecture, and TFS relevant bits are but a small subset of downloadable functional areas. It used to be that all TFS commands were under "devops", but not anymore; as of April 2020, the following areas are supported:</div>
<div>
<ol>
<li>az devops</li>
<li>az pipelines</li>
<li>az boards</li>
<li>az repos</li>
<li>az artifacts</li>
</ol>
<div>
Which roughly correspond to the functional areas of the TFS Web UI.</div>
</div>
<h4>
vsts, the not-quite-abandoned old version </h4>
<div>
An old version of <span style="font-family: "courier new" , "courier" , monospace;">az devops</span> that's still <a href="https://docs.microsoft.com/en-us/cli/vsts/overview?view=vsts-cli-latest" target="_blank">documented and offered up for download</a> separately. This tool was renamed, rebranded and rewritten as <span style="font-family: Courier New, Courier, monospace;">az devops</span>; you can see its old forks on Github being still called "<span style="font-family: "courier new" , "courier" , monospace;">vsts-cli</span>", but pointing at Azure/azure-devops-cli-extension.</div>
<h4>
VSTeam, the Powershell one</h4>
<div>
It's a Powershell downloadable module, installed via <span style="font-family: "courier new" , "courier" , monospace;">Install-Module</span>. It's under active development, and it also has functionality pretty much across the board. It provides a plethora of Powershell cmdlets; the only downside is, well, Powershell. Does Powershell even count as a command line? They claim it runs under Powershell Core under *nix (I've never tried), but on Windows, it supports NTLM auth.<br />
<br />
Its home is <a href="https://www.powershellgallery.com/packages/VSTeam/" target="_blank">at the Powershell Gallery</a>, and the sources are <a href="https://github.com/DarqueWarrior/vsteam" target="_blank">out on Github</a>. This one is not branded as Microsoft, but <a href="https://github.com/DarqueWarrior" target="_blank">the principal maintainer</a> is a Microsoft employee who <a href="http://donovanbrown.com/" target="_blank">blogs about TFS a lot</a>. I'm not sure what to make of this arrangement.</div>
<div>
<br /></div>
<div>
The set of functionality is eclectic and uneven. This tool is not vying to cover the whole API surface (<span style="font-family: "courier new" , "courier" , monospace;">az devops</span> does); they don't even try with the work item functionality, and there's almost nothing you can do with TFVC source control. Most cmdlets are rather thin wrappers on top of REST API calls. This tool is mostly concerned with setup-type tasks as opposed to day-to-day software development. That said, the maintainers tend to honor feature requests, and release fairly often.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
</div>
<div>
<br /></div>
<br />
<br />
<br />
<br />Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-34800999861221967742020-03-22T22:48:00.004-04:002021-02-09T10:27:18.291-05:00One core, two cores...I <a href="/2020/03/who-wants-to-meet-sayaka-san.html">mentioned before</a> that Windows 10 came with two flavors of SAPI, 5.4 proper and OneCore, internally also marked as v.5.4. The <span style="font-family: "courier new" , "courier" , monospace;">System.Speech.Synthesis</span> classes of the .NET library employ the classic SAPI, while the <span style="font-family: "courier new" , "courier" , monospace;">Windows.Media.SpeechSynthesis</span> classes of the UWP library run on top of OneCore. You can see that by the contents of the voice Id values. Native applications that target SAPI directly, via COM, have the option of using either. Why was SAPI forked like that - I'm not sure.<br />
<br />
<a name='more'></a><br />
<br />
The API surfaces of SAPI proper and SAPI OneCore are almost identical. Their classes have different CLSIDs, their typelibs have different LibIDs (but the same name, so you have two identical lines in the registered typelib list):<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy0ifcjtSEAXcLizeefyzRFaEnHAmREe0Gb_6vQ8MAMY048w8O6A6D4_sf0S624SvgIm-mmWfCCEuYIfZQXZtEtbmWVdil475A7gDV2DZTJkTs35JDSTpLZv0Lt2P3z21TwI1YGAHOIzw/s1600/twosapis.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="753" data-original-width="1426" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy0ifcjtSEAXcLizeefyzRFaEnHAmREe0Gb_6vQ8MAMY048w8O6A6D4_sf0S624SvgIm-mmWfCCEuYIfZQXZtEtbmWVdil475A7gDV2DZTJkTs35JDSTpLZv0Lt2P3z21TwI1YGAHOIzw/s320/twosapis.png" width="320" /></a></div>
<br />
<br />
The set of supported interfaces is different; SAPI proper supports both custom interfaces (e. g. <span style="font-family: "courier new" , "courier" , monospace;">ISpVoice</span>) and dual, IDispatch-based, Automation compatible ones (e. g. <span style="font-family: "courier new" , "courier" , monospace;">ISpeechVoice</span>). Meanwhile, OneCore only has the custom ones. The IIDs are all identical. Lack of Automation support means you can't access OneCore from JavaScript/VBScript clients.<br />
<br />
The discrepancy causes a beautiful disconnect in the Windows settings. If you go to Settings/Time and Language/Speech, you'd see three Japanese voices (Ayumi/Haruka/Ichiro). If you go to Control Panel/Speech Recognition/Text to Speech, you'd see only Haruka. The former is a UWP app, the latter is a desktop one.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqaf3MH2a2Qnrfm6xXPOSanlIjAN8bSgzmLwIMHc-7MYI-nTsYKorpJyj7AQHIFMr9YjnAf6YYSVMX1EvxuO1ECnbwDGiCM_p1TB191gesAFUMzinLOVKDZdEGFK6fcZlYrO9uQIn9-bM/s1600/voices.png"><img border="0" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqaf3MH2a2Qnrfm6xXPOSanlIjAN8bSgzmLwIMHc-7MYI-nTsYKorpJyj7AQHIFMr9YjnAf6YYSVMX1EvxuO1ECnbwDGiCM_p1TB191gesAFUMzinLOVKDZdEGFK6fcZlYrO9uQIn9-bM/s320/voices.png" width="320" /></a><br />
<br />
On Windows 8.1 and before, there was no SAPI OneCore. The respective classes of the WinRT API (the predecessor to UWP) would work with SAPI proper instead. The same WinRT 8.1 application, if run on Windows 10, would use OneCore, though. There was no explicit way of installing the TTS voices on Windows 8.1, the way it is on Windows 10, but if you install a language via PC Settings/Region and Language, at least for Japanese, that would install the Haruka voice under SAPI as well.<br />
<br />
The Windows 8.0 iteration of WinRT didn't have the <span style="font-family: "courier new" , "courier" , monospace;">Windows.Media.SpeechSynthesis</span> namespace.<br />
<br />
SAPI 5.4 proper would ship with the OS at least since Windows 7.Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-35196412022910556982020-03-15T12:56:00.001-04:002020-03-25T11:35:31.900-04:00More TTSContinuing with the Windows speech synthesis (SAPI) theme. <a href="https://developercommunity.visualstudio.com/idea/948724/support-for-sapi-54-onecore.html" target="_blank">The situation with Sayaka is a crying shame, no question there.</a> As for Ayumi and Ichiro, they are perfectly compatible with SAPI 5.4 proper. Move their tokens to HKLM\..\Speech, and they are perfectly willing to talk, too.<br />
<br />
Writing to HKLM requires elevation, though. Maybe those apps that would like to register extra voices on startup can do so in HKCU. SAPI has a key there, too.<br />
<br />
<br />Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-10924740905428475302020-03-13T14:37:00.002-04:002021-01-30T11:57:02.238-05:00Who wants to meet Sayaka-san?<br />
And now, for something completely different - speech synthesis in Windows (AKA SAPI).<br />
<br />
Windows 10 comes with a built-in speech engine. In fact, it comes with two - SAPI 5.4 proper, and SAPI 5.4 OneCore (four on a 64-bit OS). They all coexist side by side. The data files are largely shared.<br />
<br />
My specific interest comes from a desire for spoken Japanese language. One can install the Japanese text-to-speech (TTS) voices in Settings, under Time and Language/Speech. Once you do, there are three Japanese voices in the list - Ayumi, Haruka, and Ichiro. Together with the three English voices, six total.<br />
<br />
That's the Windows settings, but what about SAPI applications? Turns out, SAPI 5.4 gets only Haruka, while OneCore get all three. So going forward, my interest was limited to OneCore. The more voices, the merrier.<br />
<br />
SAPI stores its voice list in the registry - different keys for SAPI 5.4 proper and 5.4 OneCore. Yet if you look at the registry key HKLM\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens, you will see seven subkeys. <b>The seventh one is Microsoft Sayaka.</b> Why isn't she present in the list and why can't applications find her?<br />
<a name='more'></a><br />
<br />
I've been poking around SAPI, trying to point it directly at the Sayaka registry key, encountering SPERR_NOT_FOUND, until I ran my program under Process Monitor. Turned out, my process was querying the registry in a completely different place:<br />
<blockquote class="tr_bq">
<span face="arial, "helvetica neue", helvetica, sans-serif" style="background-color: white; color: #242729; font-size: 15px;">HKCU\Software\Microsoft\Speech_OneCore\Isolated\7WUiMB20NMV5Y7TgZ2WJXbUw32iGZQSvSkeaf0AevtQ\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens\</span></blockquote>
<br />
So it seems like SAPI OneCore (unlike SAPI 5.4 proper) isolates its settings. What would be the unit of isolation? I've created a brand new project, copied the same code into that one and ran again. And it got a different isolation cookie - not 7WUiMB20NMV5Y7TgZ2WJXbUw32iGZQSvSkeaf0AevtQ, something else.<br />
<br />
So SAPI creates isolation profiles on the fly, based on the identity of the current executable. But the voices in the isolation profile must come from somewhere, from some master list. <b>Turns out, the master list of Japanese voices for SAPI is in the XML files under C:\Windows\System32\Speech_OneCore\Common\ja-JP.</b> On 64-bit Windows, there's another instance under SysWOW64. The one file that's present there only lists Ayumi, Haruka, and Ichiro. No Sayaka in sight. The contents of the XML pretty much match the registry settings.<br />
<div>
<br /></div>
<div>
My second avenue of exploration was - <b>can we copy the registry settings for Sayaka to the isolation key? </b>Turns out, <b>yes</b>. I've copied the whole Sayaka key from HKLM\...\Voices to my app's isolation key, and SAPI OneCore would find her and let her speak. You can access the voice by a hard-coded ID, or via enumeration. She's got a pleasant voice.</div>
<div>
<br /></div>
<div>
But that couldn't be the endpoint. After all, leveraging Process Monitor is not something I'd recommend to either end users or application developers, and how else would you know the location of the settings isolation area? So I've set out to find a way to figure out the isolation cookie without SAPI's help.</div>
<div>
<br /></div>
<div>
Since the debug symbols for sapi_onecore.dll are out on the Microsoft Symbol Server, it was easier than I thought. There's a function <span style="font-family: "courier new", courier, monospace;">CSpRegistryIsolator::GenerateUniqueRegKeyName</span>, guess what it does. First, it calls <span style="font-family: "courier new", courier, monospace;">GetModuleFileNameW</span> with a zero module handle (spoiler: that's the current executable). Then it calls a function called <span style="font-family: "courier new", courier, monospace;">SHA256</span>. Then, <span style="font-family: "courier new", courier, monospace;">Base64Encode</span>.</div>
<div>
<br />
The only wrinkle to this straightforward scheme is - rather than passing the length of the filename buffer in bytes to the hash function, they pass the <i>string </i>length in wide characters. As a result, it only hashes the first half of the file name. Looks like someone forgot to multiply their wcslen() by 2.</div>
<div>
<br /></div>
<div>
Also, there's more than one flavor of Base64. SAPI uses the filename safe Base64 - digits 62 and 63 are - and _, respectively, and there's no padding with = signs.</div>
<div>
<br /></div>
<div>
Having discovered all that, I started to ponder the wisdom of relying on undocumented implementation details, such as this half-baked hash/encode scheme. My next key insight was - <b>SAPI has functions for creating and populating voice tokens</b>. And the isolation area is writable without elevation - otherwise, how would SAPI be able to create it on the fly?</div>
<div>
<br /></div>
<div>
So here's my best solution so far: if Sayaka is not registered, create a token for her by SAPI means, and populate with values and attributes from Sayaka's home under HKLM. This is perfect for <i>specific applications</i> that want to hear her talk.</div>
<div>
<br /></div>
<div>
<hr />
But what about that business with the master list of voices? Turns out, it's not that easy to add an XML file to that folder. It's off limits even to administrators - only <span style="font-family: "courier new", courier, monospace;">TrustedInstaller </span>can modify it. Fortunately, there are <a href="https://www.winhelponline.com/blog/run-program-as-trustedinstaller-locked-registry-keys-files/" target="_blank">quite a few utilities</a> that let one impersonate it. I've used <a href="https://www.sordum.org/9416/powerrun-v1-4-run-with-highest-privileges/" target="_blank">the one called PowerRun</a>. Once I've copied the Sayaka XML to both master lists (32- and 64-bit), it was visible to the SAPI OneCore applications, even the ones that already had an isolation profile in place.<br />
<br />
This approach is for people, not programs. It will work even for those SAPI apps that have no prior knowledge about Sayaka. Impersonating TrustedInstaller requires administrator permissions, naturally.</div>
<div>
<br /></div>
<hr />
Having said all that, I think Sayaka was badly mistreated by Microsoft. <a href="https://aka.ms/AA8bv1t" target="_blank">I've created a petition to make her a first class citizen.</a> Please go there and upvote! Windows 10 only.<br />
<br />
<div>
The original investigation diary, as well as some useful code snippets, are <a href="https://stackoverflow.com/questions/60618283/where-is-sayaka/60672214#60672214" target="_blank">here at StackOverflow</a>. I've erased the SAPI isolation cookie generation sample - it worked, but it was too hacky for my taste. The cookie recipe is here, use at your own peril.</div>
Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-68892209799272771322020-02-07T15:57:00.001-05:002020-09-29T10:53:03.916-04:00A dwarf is sitting under a tree...I've published a <a href="https://pypi.org/project/dwex/" target="_blank">package on PyPI</a>! That's a first for me.<br />
<br />
<b>DWARF Explorer</b> (<i>dwex</i> for short) is a cross platform GUI utility in Python for visualizing the debug information in DWARF format. It was initially meant for iOS dSYM bundles and Android unstripped native binaries, but runs under Windows, MacOS, and Linux. For completeness' sake, it takes Windows' PE files, too, with the caveat that the primary format of debug symbols on Windows isn't DWARF, it's PDB.<span><a name='more'></a></span><br />
<br />
There are two compilers that I know of that emit Windows executables with DWARF info though - GCC on Cygwin, and Free Pascal. Not that much of a business case, I know. That said, Free Pascal and debugging its binaries is somewhat present on my radar.<br />
<br />
The main portion of the debug information is logically a tree, so an Explorer style UI was in order - a tree on the left, a list on the right.<br />
<br />
All the heavy lifting is being done by two open source libraries from PyPI - <a href="https://pypi.org/project/filebytes/" target="_blank">filebytes</a> and <a href="https://pypi.org/project/pyelftools/" target="_blank">pyelftools</a>. My primary contribution was the GUI wrapper around the two of them.Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-22864196987141015862019-10-18T15:41:00.002-04:002020-12-01T10:56:53.191-05:00Select from TFVCMore <strike>TFS</strike> Azure DevOps schema exploration. This time, source control. Specifically, the classic TFS source control, also known as TFVC. No Git this time, that is a discussion for another day.<br />
<br />
So I have an innocent desire to run a report off the content of some files in source control. The question is, how are they stored? There are four tables of interest:<br />
<br />
<a name='more'></a><ul>
<li><b>tbl_Version</b></li>
<li><b>tbl_FileReference</b></li>
<li><b>tbl_FileMetadata</b></li>
<li><b>tbl_Content</b></li>
</ul>
<div>
The first table, <b>tbl_Version</b>, has the file name and path. Since I'm only interested in latest versions of files, I filter it by VersionTo=0x7FFFFFFF and DeletionId = 0.</div>
<div>
<br /></div>
<div>
It connects to the home project via the ItemDataspaceId field. In order to get to file content, you have to join it to <b>tbl_FileReference</b> via a triple PartitionId-DataspaceId-FileID.</div>
<div>
<br /></div>
<div>
I'm honestly not sure when does PartitionID come into play. In my on-prem TFS instance, it's uniformly 1. Maybe it is only used in VSTS, or for setups with multiple database servers. What is important, though, the indices on those tables all include PartitionId as the first field, so whenever you join them, you get a major performance boost from joining by PartitionId too.</div>
<div>
<br /></div>
<div>
There's a field ResourceId in <b>tbl_FileReference</b>, <b>tbl_FileMetadata</b>, and <b>tbl_Content</b>. It's a GUID, and one would expect that it identifies a file uniquely, but the indices on the first two are on (PartitionId, ResourceId).</div>
<div>
<br /></div>
<div>
The file contents are in <b>tbl_Content</b>. The OffsetFrom/OffsetTo fields suggest it stores file chunks, but in my experience, files up to 200 KB (uncompressed) are stored as one chunk. So I never had to write any chunk combination logic.</div><div><b><br /></b></div><div><b>LATE CORRECTION:</b> I've seen chunks in Tfs_Configuration.tbl_Content. Technically it's not a TFVC related table.</div>
<div>
<br /></div>
<div>
There's another piece of logic to it, which I had to support. The field Content in <b>tbl_Content</b> can be compressed, or it can be stored as a patch (delta) relative to another record in <b>tbl_Content</b>. You can tell by looking at the file's record in <b>tbl_FileMetadata</b>:</div>
<div>
<ul>
<li>ContentType = 2 - it's a delta, use RelatedResourceId to track the original</li>
<li>ContentType <> 2 and CompressionType = 1 - it's compressed</li>
<li>Otherwise, it's just the file data as VARBINARY</li>
</ul>
<div>
The compression is straightforward GZip, either SQL Server's DECOMPRESS function or .NET's GZipStream class will take care of that.</div>
</div>
<div>
<br /></div>
<div>
The delta logic is trickier. The format of deltas is PA30, AKA Intra Package Delta, AKA IPD. It's a proprietary binary patch format, used in CAB files among other places. It's not documented (to the best of my knowledge), but there's a public implementation by Microsoft, which ships with Windows as msdelta.dll.</div>
<div>
<br /></div>
<div>
The problem is that there's no way to call msdelta.dll directly from Transact-SQL. This is where realtime reporting from the TFS databases is next to impossible (except maybe with CLR functions), and one might have to spend some time and build an ETL package. Applying the delta to the base is rather straightforward in C#, with a bit of P/Invoke. <a href="https://gist.github.com/sevaa/a49457319946379b60e885f6b5a9f5ca" target="_blank">I've created a gist that wraps the relevant function.</a> The only comment to that code is that the value of DELTA_INPUT.Editable should be true, and the Flags parameter of ApplyDeltaB should be AllowPa19, which is 1. That's the values that TFS' own file retrieval logic passes.</div>
<div>
<br /></div>
<div>
The original to a delta might be a delta, too. So some chain chasing would be necessary.</div>
<div>
<br /></div>
<div>
Another table that might be of interest is <b>tbl_Changeset</b>. It connects to <b>tbl_Version</b> via ChangeSetId, which corresponds to VersionTo in the latter. There's no DataspaceId in <b>tbl_Changeset</b>,<b> </b>because a changeset can span multiple projects.</div>
Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com2tag:blogger.com,1999:blog-5153017404988595328.post-61224102773992194202019-09-13T15:51:00.004-04:002020-07-31T12:16:58.106-04:00Can your ALM do that?Support for runtime crash reporting and analysis should be a part of the Application Lifecycle Management (ALM).<br />
<br />
Now, my exposure to the ALM landscape out there is limited. TFS/AzDevOps - I know it inside and out. Github (including the corporate edition) - moderate experience. GoCD, TeamCity, Jenkins - I have an idea what do they do.<span><a name='more'></a></span><br />
<br />
Here's what a good crash reporting framework should be doing:<br />
<ol>
<li>Gather crash reports from user devices or production servers</li>
<li>Interpret them in the best possible way - reconstruct the call stack, the variables</li>
<li>Identify repeated crashes, group them together</li>
<li>Bring up the line in the source where the crash was, and lines that led up to this one</li>
<li>Human triage - is this crash a software bug, or the fault of the platform?</li>
</ol>
<div>
I'm proud to say that in my two person software shop, this is (partially) a reality. On Android more so than on iOS. There's a nice Web UI where I can see the list of recent crash reports. Once inside, I see a call stack with function names and source lines. When I click on a function name in the stack, the source file pops up with the offending line highlighted, and side by side there's a disassembly of the function, with the crash line highlighted. No local variables though; that'd be cool, but I'm not that far yet. (<b>EDIT</b>: I <i>am</i> that far now, parameters and locals are parsed out of crash reports too, where possible.)<br />
<br />
This amazing capability, though, requires rich cooperation from other sides of the application lifecycle. In order to recover the call stack from the crash report, one needs a copy of the unstripped SO file that shipped with that particular version - so the build system should be aware, so that it stores a copy of the SO where the crash reporter can find it. Bringing up the source, in turn, requires tapping into the source control.<br />
<br />
Finally, once I decide the crash is mine to fix, a bug is created in the bug tracker. Once there's a bug for a crash, subsequent crashes in the same location are automatically assigned to the same bug. It's a circle of life, and I'm quite surprised big name vendors are not offering something like this.<br />
<br />
<br /></div>
Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-12056488230279753342019-08-21T13:27:00.004-04:002019-08-30T19:10:08.044-04:00Literacy is overratedImagine a table on a report with a boolean, yes/no column that indicates if the user presented a cookie during their web session. What would be a good column header for it?<br />
<br />
Why, this text string, naturally:<br />
<br />
<span style="font-weight: 700; text-align: center;"><span style="font-size: x-large;"><a href="https://emojipedia.org/cookie/" target="_blank">🍪</a></span></span>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-57860464087290281712019-06-19T11:01:00.000-04:002019-10-12T11:51:59.341-04:00Those are sixty fourAnswering to <a href="https://stackoverflow.com/questions/56532794/how-to-find-android-phone-running-64-bit-operating-system-for-software-testing-p/56570000#56570000" target="_blank">this StackOverflow question</a>, here's a list of Android device models that were seen supporting 64 bit code. No guarantee, though. The OS selection is up to the carrier; it could be the case that your carrier sells the same model with a 32-bit OS.<br />
<a name='more'></a><br />
<br />
<br />
<ul>
<li>404SC</li>
<li>4Good S450m 4G</li>
<li>4Good S550m 4G</li>
<li>4Good S555m 4G</li>
<li>501SO</li>
<li>502SO</li>
<li>503HW</li>
<li>503KC</li>
<li>5049W</li>
<li>506SH</li>
<li>5085D</li>
<li>5085Q</li>
<li>5090Y</li>
<li>5095K</li>
<li>5095Y</li>
<li>601HT</li>
<li>601SO</li>
<li>602KC</li>
<li>602LV</li>
<li>6045F</li>
<li>6045I</li>
<li>6045Y</li>
<li>6055K</li>
<li>605SH</li>
<li>6070K</li>
<li>608HW</li>
<li>701SO</li>
<li>702SO</li>
<li>704HW</li>
<li>7070X</li>
<li>758</li>
<li>801SO</li>
<li>803SH</li>
<li>98</li>
<li>A1 lite</li>
<li>A1601</li>
<li>A2015</li>
<li>A37f</li>
<li>A37fw</li>
<li>A3_Pro</li>
<li>A451</li>
<li>A500</li>
<li>A51f</li>
<li>A551 Sky 4G</li>
<li>A7Pro</li>
<li>A8</li>
<li>A8 MAX</li>
<li>A9_Pro</li>
<li>AGM A8 SE</li>
<li>AGM A9 ru</li>
<li>AGM X2</li>
<li>AGS-L09</li>
<li>AGS-W09</li>
<li>AGS2-L09</li>
<li>AGS2-W09</li>
<li>ALE-L02</li>
<li>ALE-L21</li>
<li>ALE-L23</li>
<li>ALP-L29</li>
<li>Alpha</li>
<li>Android SDK built for arm64</li>
<li>ANE-LX1</li>
<li>ANE-LX2</li>
<li>ANE-LX2J</li>
<li>ANE-LX3</li>
<li>aosonS7_Pro</li>
<li>Apollo Lite</li>
<li>Apollo_X25</li>
<li>Aqua S7</li>
<li>Aquaris V Plus</li>
<li>Aquaris X</li>
<li>Archos 101b Oxygen</li>
<li>Archos 50 Diamond</li>
<li>Archos 80 Oxygen</li>
<li>Archos 97c Platinum</li>
<li>ARE-AL00</li>
<li>ARE-AL10</li>
<li>ARK Benefit A3</li>
<li>ARK Benefit M501</li>
<li>ARK Benefit M7</li>
<li>Armor</li>
<li>Armor_2</li>
<li>Armor_6</li>
<li>arrowsM04</li>
<li>arrowsM04-PREMIUM</li>
<li>AS160</li>
<li>ASUS_A001</li>
<li>ASUS_P00I</li>
<li>ASUS_X005</li>
<li>ASUS_X007D</li>
<li>ASUS_X008D</li>
<li>ASUS_X008DB</li>
<li>ASUS_X00ADA</li>
<li>ASUS_X00DD</li>
<li>ASUS_X00DDA</li>
<li>ASUS_X00DDB</li>
<li>ASUS_X00GD</li>
<li>ASUS_X00HD</li>
<li>ASUS_X00ID</li>
<li>ASUS_X00LD</li>
<li>ASUS_X00LDA</li>
<li>ASUS_X00PD</li>
<li>ASUS_X00QD</li>
<li>ASUS_X00RD</li>
<li>ASUS_X00TD</li>
<li>ASUS_X017DA</li>
<li>ASUS_X018D</li>
<li>ASUS_X018DC</li>
<li>ASUS_Z00ED</li>
<li>ASUS_Z00LD</li>
<li>ASUS_Z00MD</li>
<li>ASUS_Z00RD</li>
<li>ASUS_Z00TD</li>
<li>ASUS_Z00UD</li>
<li>ASUS_Z00UDB</li>
<li>ASUS_Z010D</li>
<li>ASUS_Z010DA</li>
<li>ASUS_Z010DB</li>
<li>ASUS_Z010DD</li>
<li>ASUS_Z011D</li>
<li>ASUS_Z012D</li>
<li>ASUS_Z012DA</li>
<li>ASUS_Z012DE</li>
<li>ASUS_Z016D</li>
<li>ASUS_Z017DA</li>
<li>ASUS_Z01BD</li>
<li>ASUS_Z01BDA</li>
<li>ASUS_Z01BDB</li>
<li>ASUS_Z01FD</li>
<li>ASUS_Z01HD</li>
<li>ASUS_Z01HDA</li>
<li>ASUS_Z01KD</li>
<li>ASUS_Z01KDA</li>
<li>ASUS_Z01MD</li>
<li>ASUS_Z01RD</li>
<li>Atom</li>
<li>ATU-L21</li>
<li>ATU-L22</li>
<li>ATU-L31</li>
<li>ATU-L42</li>
<li>AUM-AL20</li>
<li>AUM-L29</li>
<li>AUM-L41</li>
<li>B3-A20</li>
<li>B3-A32</li>
<li>B5330</li>
<li>BAC-L21</li>
<li>BAC-L23</li>
<li>BAH-L09</li>
<li>BAH-W09</li>
<li>BAH2-L09</li>
<li>BAH2-W19</li>
<li>Bay</li>
<li>BBB100-1</li>
<li>BBB100-2</li>
<li>BBB100-7</li>
<li>BBD100-1</li>
<li>BBE100-4</li>
<li>BBF100-2</li>
<li>BBF100-6</li>
<li>Be Pro 2</li>
<li>Beeline Fast</li>
<li>benefit_m7</li>
<li>BKK-AL10</li>
<li>BKK-L21</li>
<li>BKL-AL00</li>
<li>BKL-L09</li>
<li>BL12000</li>
<li>BL12000 PRO</li>
<li>BL5000</li>
<li>BL7000</li>
<li>BL9000</li>
<li>BLA-L09</li>
<li>BLA-L29</li>
<li>Blade Q Lux 4G</li>
<li>Blade V580</li>
<li>Blade V6</li>
<li>Blade V6 Max</li>
<li>Blade_V6</li>
<li>BLL-L21</li>
<li>BLL-L22</li>
<li>BLN-AL10</li>
<li>BLN-AL20</li>
<li>BLN-AL30</li>
<li>BLN-AL40</li>
<li>BLN-L21</li>
<li>BLN-L22</li>
<li>BLN-L24</li>
<li>BLN-TL10</li>
<li>Bluboo Maya Max</li>
<li>Bluboo S1</li>
<li>Bluboo_S8_plus</li>
<li>BMM 541S</li>
<li>BMM-542S</li>
<li>BMM542D</li>
<li>BND-L21</li>
<li>BND-L24</li>
<li>Boost 3 Pro SE</li>
<li>Boost 3 SE</li>
<li>Boost3</li>
<li>BQ-5008L</li>
<li>BQ-5032</li>
<li>BQ-5201</li>
<li>BQ-5512L</li>
<li>BQ-5516L</li>
<li>BQ-5700L</li>
<li>BQ-5701L</li>
<li>BQ-6000L</li>
<li>BQru-5201</li>
<li>BQru-5202</li>
<li>BQru-5203</li>
<li>BQS-5040</li>
<li>BQS-5045</li>
<li>BQS-5070</li>
<li>BS109</li>
<li>BTV-DL09</li>
<li>BTV-W09</li>
<li>BV2000</li>
<li>BV5800</li>
<li>BV5800 PRO</li>
<li>BV5800_RU</li>
<li>BV6000</li>
<li>BV6000S</li>
<li>BV6000S_RU</li>
<li>BV6000_RU</li>
<li>BV6800Pro</li>
<li>BV7000</li>
<li>BV7000 PRO</li>
<li>BV8000Pro</li>
<li>BV8000Pro_RU</li>
<li>BV9000</li>
<li>BV9000Pro</li>
<li>BV9000Pro-F</li>
<li>BV9000Pro-RU</li>
<li>BV9500</li>
<li>BV9500-RU</li>
<li>BV9500Pro</li>
<li>C NOTE</li>
<li>C1-U02</li>
<li>C103</li>
<li>C106</li>
<li>C106-9</li>
<li>CAM-AL00</li>
<li>CAM-L21</li>
<li>CAM-L32</li>
<li>CHC-U01</li>
<li>Che2-L11</li>
<li>Che2-UL00</li>
<li>CHM-U01</li>
<li>CITI 1508 4G CS1114ML</li>
<li>CITI Z560 4G CS5021ML</li>
<li>CITI_8542_4G_CS8152ML</li>
<li>CLT-AL00</li>
<li>CLT-AL01</li>
<li>CLT-L29</li>
<li>CMR-AL09</li>
<li>CMR-AL19</li>
<li>CMR-W09</li>
<li>COL-AL10</li>
<li>COL-L29</li>
<li>conquest-S8</li>
<li>Coolpad E502</li>
<li>Coolpad R108</li>
<li>Coolpad R116</li>
<li>COR-L29</li>
<li>COR-TL10</li>
<li>CPH1605</li>
<li>CPH1607</li>
<li>CPH1609</li>
<li>CPH1613</li>
<li>CPH1701</li>
<li>CPH1717</li>
<li>CPH1719</li>
<li>CPH1723</li>
<li>CPH1725</li>
<li>CPH1727</li>
<li>CPH1729</li>
<li>CPH1801</li>
<li>CPH1803</li>
<li>CPH1809</li>
<li>CPH1819</li>
<li>CPH1821</li>
<li>CPH1851</li>
<li>CPH1853</li>
<li>CPH1859</li>
<li>CPH1877</li>
<li>CPH1893</li>
<li>CPH1901</li>
<li>CPH1911</li>
<li>CPH1969</li>
<li>CPN-L09</li>
<li>CUBOT CHEETAH 2</li>
<li>CUBOT DINOSAUR</li>
<li>CUBOT MAX</li>
<li>CUBOT_MANITO</li>
<li>CUBOT_P20</li>
<li>d-01J</li>
<li>d-02H</li>
<li>D1</li>
<li>DIG-AL00</li>
<li>DIG-L01</li>
<li>DIG-L21</li>
<li>DIG-L21HN</li>
<li>DIG-TL10</li>
<li>Discovery_XT</li>
<li>Doogee X5 Max Pro</li>
<li>Doogee X7 Pro</li>
<li>DP-CMX1</li>
<li>DRA-L21</li>
<li>DRA-LX2</li>
<li>dtacPhoneS3</li>
<li>DUA-L22</li>
<li>DUB-LX1</li>
<li>DUB-LX2</li>
<li>DUK-L09</li>
<li>E2303</li>
<li>E2312</li>
<li>E2333</li>
<li>E5303</li>
<li>E5333</li>
<li>E5506</li>
<li>E5533</li>
<li>E5553</li>
<li>E5563</li>
<li>E5603</li>
<li>E5633</li>
<li>E5653</li>
<li>E5663</li>
<li>E5803</li>
<li>E5823</li>
<li>E6533</li>
<li>E6553</li>
<li>E6603</li>
<li>E6633</li>
<li>E6653</li>
<li>E6683</li>
<li>E6810</li>
<li>E6833</li>
<li>E6853</li>
<li>E6883</li>
<li>E7</li>
<li>Ecoo E04</li>
<li>ECOO E04 3GB</li>
<li>EDI-AL10</li>
<li>ELE-L29</li>
<li>Elephone P8000</li>
<li>Elite 1</li>
<li>emcee</li>
<li>EML-L09</li>
<li>EML-L29</li>
<li>EP171DX</li>
<li>EP171EN</li>
<li>EP171PW</li>
<li>EVA-DL00</li>
<li>EVA-L09</li>
<li>EVA-L19</li>
<li>EVR-TL00</li>
<li>EXTREME</li>
<li>F-01H</li>
<li>F-01J</li>
<li>F-02H</li>
<li>F-02K</li>
<li>F-03H</li>
<li>F-04H</li>
<li>F-05J</li>
<li>F1f</li>
<li>F1w</li>
<li>F3111</li>
<li>F3112</li>
<li>F3113</li>
<li>F3115</li>
<li>F3116</li>
<li>F3211</li>
<li>F3212</li>
<li>F3216</li>
<li>F5121</li>
<li>F5122</li>
<li>F5321</li>
<li>F8131</li>
<li>F8132</li>
<li>F8331</li>
<li>F8332</li>
<li>FDR-A01L</li>
<li>FDR-A01w</li>
<li>Fest</li>
<li>Fest-Pro</li>
<li>FestXL</li>
<li>FIG-LA1</li>
<li>FIG-LX1</li>
<li>FL02</li>
<li>FLA-LX1</li>
<li>Flare_X_V2</li>
<li>FRD-AL00</li>
<li>FRD-AL10</li>
<li>FRD-L02</li>
<li>FRD-L09</li>
<li>FRD-L19</li>
<li>FREEDOM</li>
<li>FS455</li>
<li>FS511</li>
<li>FS518</li>
<li>FS520</li>
<li>FS522</li>
<li>FS554</li>
<li>FS8009</li>
<li>FS8010</li>
<li>FS8018</li>
<li>FS8032</li>
<li>FTJ152A</li>
<li>FTJ152B</li>
<li>FTJ161A</li>
<li>FTJ161B</li>
<li>FTJ162D</li>
<li>FTJ162E</li>
<li>FTJ17A00</li>
<li>Future</li>
<li>G3112</li>
<li>G3116</li>
<li>G3121</li>
<li>G3123</li>
<li>G3212</li>
<li>G3226</li>
<li>G3311</li>
<li>G3312</li>
<li>G3412</li>
<li>G3416</li>
<li>G3426</li>
<li>G553KL</li>
<li>G8141</li>
<li>G8142</li>
<li>G8231</li>
<li>G8232</li>
<li>G8341</li>
<li>G8342</li>
<li>G8441</li>
<li>GEM-701L</li>
<li>GEM-702L</li>
<li>GEM-703L</li>
<li>Ginzzu_RS81D</li>
<li>GM1910</li>
<li>GM1913</li>
<li>GS55-6</li>
<li>GT6000</li>
<li>H3113</li>
<li>H4113</li>
<li>H4133</li>
<li>H4213</li>
<li>H4233</li>
<li>H4311</li>
<li>H4331</li>
<li>H4413</li>
<li>H8</li>
<li>H8266</li>
<li>H8296</li>
<li>H8314</li>
<li>H8324</li>
<li>H9436</li>
<li>H9493</li>
<li>Hashtag</li>
<li>hi6210sft</li>
<li>Hi9Air</li>
<li>Hisense A2T</li>
<li>Hisense A6</li>
<li>HLA Note3</li>
<li>HMA-AL00</li>
<li>HMA-L29</li>
<li>HRY-LX1</li>
<li>HRY-LX1MEB</li>
<li>HRY-LX1T</li>
<li>HT10</li>
<li>HT16Pro</li>
<li>HT17</li>
<li>HT17Pro</li>
<li>HT20</li>
<li>HT20Pro</li>
<li>HT3 Pro</li>
<li>HT37Pro</li>
<li>HT50</li>
<li>HT7 Pro</li>
<li>HT70</li>
<li>HTC 10</li>
<li>HTC 2Q55100</li>
<li>HTC Desire 10 pro</li>
<li>HTC Desire 12</li>
<li>HTC Desire 626</li>
<li>HTC Desire 628</li>
<li>HTC Desire 628 dual sim</li>
<li>HTC Desire 728</li>
<li>HTC Desire 728G dual sim</li>
<li>HTC Desire 820</li>
<li>HTC Desire 828</li>
<li>HTC Desire 830 dual sim</li>
<li>HTC One A9</li>
<li>HTC One A9s</li>
<li>HTC One E9PLUS dual sim</li>
<li>HTC One E9s dual sim</li>
<li>HTC One M8s</li>
<li>HTC One M9</li>
<li>HTC One M9PLUS</li>
<li>HTC One X10</li>
<li>HTC One X9 dual sim</li>
<li>HTC U Play</li>
<li>HTC U Ultra</li>
<li>HTC U11</li>
<li>HTC U11 plus</li>
<li>HTC U12+</li>
<li>HTC6545LVW</li>
<li>HTC_A9u</li>
<li>HTC_D10i</li>
<li>HTC_D820ys</li>
<li>HTC_M10f</li>
<li>HTC_M10h</li>
<li>HTC_M9ew</li>
<li>HTC_U-1u</li>
<li>HTC_U-2u</li>
<li>HTV31</li>
<li>HTV32</li>
<li>HTV33</li>
<li>HUAWEI ATH-UL01</li>
<li>HUAWEI CAM-L23</li>
<li>HUAWEI CAN-L11</li>
<li>HUAWEI CAN-L12</li>
<li>HUAWEI CAZ-AL10</li>
<li>HUAWEI CAZ-TL10</li>
<li>HUAWEI CRR-L09</li>
<li>HUAWEI GRA-L09</li>
<li>HUAWEI GRA-UL00</li>
<li>HUAWEI KII-L21</li>
<li>HUAWEI KII-L22</li>
<li>HUAWEI M2-801L</li>
<li>HUAWEI M2-A01L</li>
<li>HUAWEI MLA-AL10</li>
<li>HUAWEI NMO-L31</li>
<li>HUAWEI NXT-AL10</li>
<li>HUAWEI NXT-DL00</li>
<li>HUAWEI NXT-L29</li>
<li>HUAWEI P8max</li>
<li>HUAWEI RIO-L01</li>
<li>HUAWEI RIO-UL00</li>
<li>HUAWEI TAG-L21</li>
<li>HUAWEI TAG-TL00</li>
<li>HUAWEI TIT-AL00</li>
<li>HUAWEI VNS-L21</li>
<li>HUAWEI VNS-L22</li>
<li>HUAWEI VNS-L31</li>
<li>HUAWEI VNS-L52</li>
<li>HUAWEI VNS-TL00</li>
<li>HWI-AL00</li>
<li>HWT31</li>
<li>HWV31</li>
<li>HWV32</li>
<li>hy_tough</li>
<li>i-mobile IQ XPRO2</li>
<li>I4113</li>
<li>I4213</li>
<li>I4312</li>
<li>i5050</li>
<li>i7</li>
<li>i8</li>
<li>ILA X2</li>
<li>iLA_Silk</li>
<li>Impress Cult</li>
<li>Impress_Grip</li>
<li>Impress_Noda</li>
<li>Impulse_P2</li>
<li>INE-LX1</li>
<li>INE-LX2</li>
<li>INE-LX2r</li>
<li>INE-TL00</li>
<li>Infinix X573</li>
<li>Infinix-X521</li>
<li>InFocus M808</li>
<li>Innos_D6000</li>
<li>iris 870</li>
<li>IRON Pro</li>
<li>Isprit U50 LTE</li>
<li>IUNI N1</li>
<li>Ixion ES250</li>
<li>Ixion M350</li>
<li>Ixion M450</li>
<li>Ixion ML150</li>
<li>Ixion ML250</li>
<li>Ixion MS350</li>
<li>Ixion X150</li>
<li>Ixion X245</li>
<li>Ixion X355</li>
<li>Ixion XL140</li>
<li>J9S</li>
<li>JDN-L01</li>
<li>JDN-W09</li>
<li>JKM-AL00</li>
<li>JKM-LX2</li>
<li>JMM-AL00</li>
<li>JMM-L22</li>
<li>JSN-AL00a</li>
<li>JSN-L21</li>
<li>JSN-L22</li>
<li>JY-S3</li>
<li>K10</li>
<li>K10000 Mix</li>
<li>K10000 Pro</li>
<li>K3</li>
<li>K4000 Plus</li>
<li>K6</li>
<li>K6000 Plus</li>
<li>K6000 Pro</li>
<li>K7 Power</li>
<li>K88</li>
<li>KIICAA MIX</li>
<li>KING 7</li>
<li>KING 7S</li>
<li>KIW-L21</li>
<li>KIW-L24</li>
<li>KOB-L09</li>
<li>KYT31</li>
<li>KYT32</li>
<li>KYV37</li>
<li>KYV42</li>
<li>L-01J</li>
<li>L4</li>
<li>LAVA A1</li>
<li>LDN-L21</li>
<li>LDN-LX2</li>
<li>Le 1 Pro</li>
<li>Le 2</li>
<li>Le X520</li>
<li>Le X522</li>
<li>Le X526</li>
<li>Le X527</li>
<li>Le X620</li>
<li>Le X622</li>
<li>Le X626</li>
<li>Le X820</li>
<li>Le X829</li>
<li>Le2 X527</li>
<li>Lenovo A5600</li>
<li>Lenovo A6000</li>
<li>Lenovo A6010</li>
<li>Lenovo A6020a40</li>
<li>Lenovo A6020a46</li>
<li>Lenovo A6020l36</li>
<li>Lenovo A7000-a</li>
<li>Lenovo A7010a48</li>
<li>Lenovo A7020a40</li>
<li>Lenovo A7020a48</li>
<li>Lenovo A7600</li>
<li>Lenovo A7600-m</li>
<li>Lenovo K3 Note</li>
<li>Lenovo K50-t5</li>
<li>Lenovo K50a40</li>
<li>Lenovo K52e78</li>
<li>Lenovo K53a48</li>
<li>Lenovo K8 Plus</li>
<li>Lenovo L18021</li>
<li>Lenovo L38011</li>
<li>Lenovo L38012</li>
<li>Lenovo L38041</li>
<li>Lenovo P1a42</li>
<li>Lenovo P1c58</li>
<li>Lenovo P1ma40</li>
<li>Lenovo P2a42</li>
<li>Lenovo p70</li>
<li>Lenovo P70-A</li>
<li>Lenovo PB1-770M</li>
<li>Lenovo PB2-650M</li>
<li>Lenovo PB2-670M</li>
<li>Lenovo PB2-690M</li>
<li>Lenovo S1a40</li>
<li>Lenovo S1La40</li>
<li>Lenovo S60-a</li>
<li>Lenovo S8 A7600</li>
<li>Lenovo S90-A</li>
<li>Lenovo S90-U</li>
<li>Lenovo TAB 2 A10-70F</li>
<li>Lenovo TAB 2 A10-70L</li>
<li>Lenovo TB-7304F</li>
<li>Lenovo TB-7304I</li>
<li>Lenovo TB-7304X</li>
<li>Lenovo TB-7504X</li>
<li>Lenovo TB-8504F</li>
<li>Lenovo TB-8504X</li>
<li>Lenovo TB-8703F</li>
<li>Lenovo TB-8703X</li>
<li>Lenovo TB-8704X</li>
<li>Lenovo TB-X304L</li>
<li>Lenovo TB-X704F</li>
<li>Lenovo TB-X704L</li>
<li>Lenovo TB3-730X</li>
<li>Lenovo TB3-850F</li>
<li>Lenovo TB3-850M</li>
<li>Lenovo TB3-X70F</li>
<li>Lenovo TB3-X70L</li>
<li>Lenovo X3a40</li>
<li>Lenovo YT-X703L</li>
<li>Lenovo Z2</li>
<li>Lenovo Z90-7</li>
<li>Lenovo Z90a40</li>
<li>Letv X500</li>
<li>Letv X501</li>
<li>LEX622</li>
<li>LEX626</li>
<li>LEX653</li>
<li>LEX657</li>
<li>LEX720</li>
<li>LEX722</li>
<li>LEX820</li>
<li>LG-F500K</li>
<li>LG-F500L</li>
<li>LG-F510L</li>
<li>LG-F600L</li>
<li>LG-F600S</li>
<li>LG-F700L</li>
<li>LG-F800L</li>
<li>LG-H811</li>
<li>LG-H815</li>
<li>LG-H818</li>
<li>LG-H820</li>
<li>LG-H831</li>
<li>LG-H850</li>
<li>LG-H860</li>
<li>LG-H870</li>
<li>LG-H870DS</li>
<li>LG-H870S</li>
<li>LG-H872</li>
<li>LG-H873</li>
<li>LG-H900PR</li>
<li>LG-H910</li>
<li>LG-H918</li>
<li>LG-H930</li>
<li>LG-H955</li>
<li>LG-H959</li>
<li>LG-H960</li>
<li>LG-H961N</li>
<li>LG-H990</li>
<li>LG-LS993</li>
<li>LG-X240</li>
<li>LGLS992</li>
<li>LGM-G600L</li>
<li>LGM-V300L</li>
<li>LGM-V300S</li>
<li>LGUS992</li>
<li>LGV34</li>
<li>LGV35</li>
<li>LLD-AL10</li>
<li>LLD-AL30</li>
<li>LLD-L21</li>
<li>LLD-L31</li>
<li>LM-G710</li>
<li>LM-G710N</li>
<li>LM-G820N</li>
<li>LM-V350</li>
<li>LND-AL30</li>
<li>LND-L29</li>
<li>LND-TL40</li>
<li>LON-AL00</li>
<li>LON-L29</li>
<li>London</li>
<li>LYA-L29</li>
<li>M1 E</li>
<li>m1 metal</li>
<li>m1 note</li>
<li>m2</li>
<li>m2 note</li>
<li>M2mini</li>
<li>m3</li>
<li>M3 Max</li>
<li>m3 note</li>
<li>M3E</li>
<li>M3s</li>
<li>M3X</li>
<li>M5</li>
<li>M5 Note</li>
<li>M500-1</li>
<li>M5c</li>
<li>M5s</li>
<li>M5_lite</li>
<li>M6</li>
<li>M6 Note</li>
<li>M653</li>
<li>M6T</li>
<li>MAL-FWTVTB</li>
<li>MAR-LX1M</li>
<li>MAR-LX2</li>
<li>MD-03P</li>
<li>MEIZU M6</li>
<li>Meizu M6s</li>
<li>Meizu M8c</li>
<li>meizu note8</li>
<li>Meizu S6</li>
<li>MEIZU_M5</li>
<li>Metal</li>
<li>MFLogin4</li>
<li>MHA-AL00</li>
<li>MHA-L09</li>
<li>MHA-L29</li>
<li>Mi 4i</li>
<li>MI 4S</li>
<li>MI 5</li>
<li>MI 5C</li>
<li>MI 5s</li>
<li>MI 5s Plus</li>
<li>MI 5X</li>
<li>MI 6</li>
<li>MI 6X</li>
<li>MI 8</li>
<li>MI 8 Lite</li>
<li>MI 8 Pro</li>
<li>MI 8 SE</li>
<li>MI 9</li>
<li>Mi 9 SE</li>
<li>Mi A1</li>
<li>Mi A2</li>
<li>Mi A2 Lite</li>
<li>MI MAX</li>
<li>MI MAX 2</li>
<li>MI MAX 3</li>
<li>MI MIX</li>
<li>Mi MIX 2</li>
<li>Mi MIX 2S</li>
<li>Mi MIX 3</li>
<li>Mi Note 2</li>
<li>Mi Note 3</li>
<li>MI NOTE Pro</li>
<li>MI PAD 3</li>
<li>MI PAD 4</li>
<li>MI PAD 4 PLUS</li>
<li>MI PLAY</li>
<li>Mi-4c</li>
<li>Mi5</li>
<li>Micromax Q480</li>
<li>MIX</li>
<li>MIX 2</li>
<li>MIX 2S</li>
<li>MIX2</li>
<li>MO-01J</li>
<li>MO-01K</li>
<li>MOS1</li>
<li>moto g(7)</li>
<li>moto g(7) plus</li>
<li>moto g(7) power</li>
<li>moto x4</li>
<li>Moto Z (2)</li>
<li>moto z3</li>
<li>motorola one</li>
<li>MTC SmartRun 4G</li>
<li>MTS x2605</li>
<li>MX5</li>
<li>MX6</li>
<li>MX_Base</li>
<li>MYA-L02</li>
<li>MYA-L22</li>
<li>MYA-L41</li>
<li>N570</li>
<li>NB1</li>
<li>Neffos C5</li>
<li>Neffos C5 Max</li>
<li>Neffos N1</li>
<li>Neffos X1</li>
<li>Neffos X1 Lite</li>
<li>Neffos X1 Max</li>
<li>Neffos_C7</li>
<li>Neffos_C9A</li>
<li>NEM-AL10</li>
<li>NEM-L21</li>
<li>NEM-L22</li>
<li>NEM-L51</li>
<li>Next Omega</li>
<li>NEXT PRO</li>
<li>NEXT PRO 6000</li>
<li>Next Pro Lite</li>
<li>NEXT_EXTREME</li>
<li>Nexus 5X</li>
<li>Nexus 6P</li>
<li>Nexus 9</li>
<li>Nokia 3.1</li>
<li>Nokia 3.1 Plus</li>
<li>Nokia 5.1</li>
<li>Nokia 5.1 Plus</li>
<li>Nokia 6.1</li>
<li>Nokia 6.1 Plus</li>
<li>Nokia 7 plus</li>
<li>Nokia 7.1</li>
<li>Nokia 8.1</li>
<li>NOVA CAN-L11</li>
<li>NS5006</li>
<li>NX16A8116KP</li>
<li>NX511J</li>
<li>NX512J</li>
<li>NX523J_V1</li>
<li>NX529J</li>
<li>NX531J</li>
<li>NX541J</li>
<li>NX549J</li>
<li>NX551J</li>
<li>NX563J</li>
<li>NX569J</li>
<li>NX573J</li>
<li>NX589J</li>
<li>NX591J</li>
<li>omega_pro</li>
<li>ONE A2001</li>
<li>ONE A2003</li>
<li>ONE A2005</li>
<li>One Max</li>
<li>ONEPLUS A3000</li>
<li>ONEPLUS A3003</li>
<li>ONEPLUS A3010</li>
<li>ONEPLUS A5000</li>
<li>ONEPLUS A5010</li>
<li>ONEPLUS A6000</li>
<li>ONEPLUS A6003</li>
<li>ONEPLUS A6010</li>
<li>ONEPLUS A6013</li>
<li>OPPO A33</li>
<li>OPPO A33m</li>
<li>OPPO A37m</li>
<li>OPPO A37t</li>
<li>OPPO A53</li>
<li>OPPO A53m</li>
<li>OPPO A57</li>
<li>OPPO A57t</li>
<li>OPPO A59m</li>
<li>OPPO A59s</li>
<li>OPPO A73</li>
<li>OPPO A73t</li>
<li>OPPO A77</li>
<li>OPPO A79k</li>
<li>OPPO A79kt</li>
<li>OPPO A79t</li>
<li>OPPO A83</li>
<li>OPPO A83t</li>
<li>OPPO R11</li>
<li>OPPO R11 Plus</li>
<li>OPPO R11s</li>
<li>OPPO R11s Plus</li>
<li>OPPO R11st</li>
<li>OPPO R11t</li>
<li>OPPO R7sm</li>
<li>OPPO R9 Plusm A</li>
<li>OPPO R9 Plustm A</li>
<li>OPPO R9km</li>
<li>OPPO R9m</li>
<li>OPPO R9s</li>
<li>OPPO R9s Plus</li>
<li>OPPO R9sk</li>
<li>OPPO R9st</li>
<li>OPPO R9tm</li>
<li>Optima 1315T 4G TT1108ML</li>
<li>Optima 8100R 4G TS8104ML</li>
<li>Orion M50L</li>
<li>P008</li>
<li>P00A</li>
<li>P00C</li>
<li>P00L</li>
<li>P027</li>
<li>P10000 Pro</li>
<li>P10000_Pro</li>
<li>P1X</li>
<li>P2</li>
<li>P5</li>
<li>P5L</li>
<li>P6000 Pro</li>
<li>P80 Pro</li>
<li>P80H(D5C9)</li>
<li>P80H(D7C9)</li>
<li>P9000</li>
<li>PAAM00</li>
<li>PACM00</li>
<li>PADM00</li>
<li>PAFM00</li>
<li>PAR-AL00</li>
<li>PAR-LX1</li>
<li>PAR-LX9</li>
<li>PBAM00</li>
<li>PBAT00</li>
<li>PBBM00</li>
<li>PBBM30</li>
<li>PBCM10</li>
<li>PBCM30</li>
<li>PBDM00</li>
<li>PBEM00</li>
<li>PBET00</li>
<li>PBFM00</li>
<li>PCAM00</li>
<li>PCCM00</li>
<li>PCDM10</li>
<li>PCT-AL10</li>
<li>PCT-L29</li>
<li>PH-1</li>
<li>Philips S395</li>
<li>Philips S616</li>
<li>Philips X588</li>
<li>Philips X818</li>
<li>Philips Xenium V787</li>
<li>Philips_S396</li>
<li>Philips_V526</li>
<li>Philips_Xenium_V787</li>
<li>Phone</li>
<li>PIC-LX9</li>
<li>Picasso 4G</li>
<li>Pixel</li>
<li>Pixel 2</li>
<li>Pixel 2 XL</li>
<li>Pixel 3</li>
<li>Pixel 3 XL</li>
<li>Pixel 3a</li>
<li>Pixel 3a XL</li>
<li>Pixel XL</li>
<li>Plane 1506 4G PS1084ML</li>
<li>Plane 1710T 4G PS1092ML</li>
<li>Plane 7006 4G PS7041ML</li>
<li>Platinum P6</li>
<li>PLE-701L</li>
<li>PLK-AL10</li>
<li>PLK-L01</li>
<li>PLK-TL01H</li>
<li>PLUS</li>
<li>PMT3418_4G</li>
<li>PMT3418_4GE</li>
<li>Poco F1</li>
<li>POCOPHONE F1</li>
<li>Polar3</li>
<li>POLYTRON_4G551</li>
<li>POT-LX1</li>
<li>POT-LX2J</li>
<li>Power</li>
<li>Power Five Evo</li>
<li>Power Five Max</li>
<li>Power Ice</li>
<li>Power Ice Evo</li>
<li>Power Ice Max</li>
<li>Power Rage Evo</li>
<li>PowerFive</li>
<li>PowerFiveMax2</li>
<li>PowerFivePro</li>
<li>PowerFour</li>
<li>Power_2</li>
<li>Power_3</li>
<li>Power_5</li>
<li>PRA-AL00</li>
<li>PRA-AL00X</li>
<li>PRA-LA1</li>
<li>PRA-LX1</li>
<li>PRA-LX2</li>
<li>PRA-TL10</li>
<li>Premium</li>
<li>Prime L</li>
<li>PRO 5</li>
<li>PRO 6</li>
<li>PRO 6 Plus</li>
<li>PRO 6s</li>
<li>PRO 7</li>
<li>PRO 7 Plus</li>
<li>PRO 7-H</li>
<li>PRO 7-S</li>
<li>Pro6000</li>
<li>PSP5551DUO</li>
<li>PSP7550DUO</li>
<li>PSP7551DUO</li>
<li>R7kf</li>
<li>R7plusf</li>
<li>R7Plusm</li>
<li>Razar</li>
<li>Razar_Pro</li>
<li>Redmi 3</li>
<li>Redmi 3S</li>
<li>Redmi 3X</li>
<li>Redmi 4</li>
<li>Redmi 4 Prime</li>
<li>Redmi 4A</li>
<li>Redmi 4X</li>
<li>Redmi 5</li>
<li>Redmi 5 Plus</li>
<li>Redmi 5A</li>
<li>Redmi 6 Pro</li>
<li>Redmi 7</li>
<li>Redmi Note 2</li>
<li>Redmi Note 3</li>
<li>Redmi Note 4</li>
<li>Redmi Note 4X</li>
<li>Redmi Note 5</li>
<li>Redmi Note 5 Pro</li>
<li>Redmi Note 5A</li>
<li>Redmi Note 5A Prime</li>
<li>Redmi Note 6 Pro</li>
<li>Redmi Note 7</li>
<li>Redmi Note 7 Pro</li>
<li>Redmi Pro</li>
<li>RedmiNote2</li>
<li>RM02</li>
<li>RNE-L21</li>
<li>RNE-L22</li>
<li>Robin</li>
<li>RS94D</li>
<li>RS97D</li>
<li>RS988</li>
<li>RVL-AL09</li>
<li>S1</li>
<li>S2</li>
<li>S2 LITE</li>
<li>S2_PRO</li>
<li>S3</li>
<li>S3-SH</li>
<li>S30</li>
<li>S4-KC</li>
<li>S41</li>
<li>S5040</li>
<li>S5050</li>
<li>S55</li>
<li>S60</li>
<li>S60 Lite</li>
<li>S61</li>
<li>S7</li>
<li>S8</li>
<li>S8_Pro</li>
<li>S9 Plus</li>
<li>S90</li>
<li>SAMSUNG-SM-G890A</li>
<li>SAMSUNG-SM-G891A</li>
<li>SAMSUNG-SM-G920A</li>
<li>SAMSUNG-SM-G930A</li>
<li>SAMSUNG-SM-G935A</li>
<li>SAMSUNG-SM-N920A</li>
<li>SANTIN #Marconi</li>
<li>SC-01K</li>
<li>SC-01L</li>
<li>SC-02H</li>
<li>SC-02J</li>
<li>SC-02K</li>
<li>SC-02L</li>
<li>SC-03J</li>
<li>SC-03K</li>
<li>SC-04G</li>
<li>SC-05G</li>
<li>SCV31</li>
<li>SCV33</li>
<li>SCV35</li>
<li>SCV36</li>
<li>SCV37</li>
<li>SCV38</li>
<li>SCV39</li>
<li>SCV40</li>
<li>sdm660 for arm64</li>
<li>SENSEIT E510</li>
<li>SGP712</li>
<li>SGP771</li>
<li>SH-01K</li>
<li>SH-03J</li>
<li>SH-03K</li>
<li>SH-04H</li>
<li>SH-D01</li>
<li>SH-M03</li>
<li>SH-M05</li>
<li>Shapka-Ushanka</li>
<li>SHT-AL09</li>
<li>SHV32</li>
<li>SHV34</li>
<li>SHV40</li>
<li>SHV40_u</li>
<li>SHV42</li>
<li>SHV43</li>
<li>SKR-A0</li>
<li>SM-A205F</li>
<li>SM-A205FN</li>
<li>SM-A305F</li>
<li>SM-A305FN</li>
<li>SM-A405FM</li>
<li>SM-A405FN</li>
<li>SM-A505F</li>
<li>SM-A505FM</li>
<li>SM-A505FN</li>
<li>SM-A520F</li>
<li>SM-A520K</li>
<li>SM-A520L</li>
<li>SM-A520S</li>
<li>SM-A520W</li>
<li>SM-A530F</li>
<li>SM-A6060</li>
<li>SM-A705FN</li>
<li>SM-A720F</li>
<li>SM-A720S</li>
<li>SM-A730F</li>
<li>SM-A750FN</li>
<li>SM-A750GN</li>
<li>SM-A810S</li>
<li>SM-A9000</li>
<li>SM-A9100</li>
<li>SM-A910F</li>
<li>SM-A920F</li>
<li>SM-C5010</li>
<li>SM-C7000</li>
<li>SM-C7010</li>
<li>SM-C9000</li>
<li>SM-C900F</li>
<li>SM-G885F</li>
<li>SM-G885S</li>
<li>SM-G892A</li>
<li>SM-G892U</li>
<li>SM-G920F</li>
<li>SM-G920I</li>
<li>SM-G920K</li>
<li>SM-G920L</li>
<li>SM-G920P</li>
<li>SM-G920S</li>
<li>SM-G9250</li>
<li>SM-G925F</li>
<li>SM-G925I</li>
<li>SM-G925L</li>
<li>SM-G925P</li>
<li>SM-G925S</li>
<li>SM-G925T</li>
<li>SM-G9280</li>
<li>SM-G9287</li>
<li>SM-G928C</li>
<li>SM-G928F</li>
<li>SM-G928K</li>
<li>SM-G928L</li>
<li>SM-G928P</li>
<li>SM-G928S</li>
<li>SM-G928V</li>
<li>SM-G930</li>
<li>SM-G9300</li>
<li>SM-G930F</li>
<li>SM-G930FD</li>
<li>SM-G930K</li>
<li>SM-G930L</li>
<li>SM-G930P</li>
<li>SM-G930S</li>
<li>SM-G930T</li>
<li>SM-G930V</li>
<li>SM-G930W8</li>
<li>SM-G9350</li>
<li>SM-G935F</li>
<li>SM-G935K</li>
<li>SM-G935L</li>
<li>SM-G935S</li>
<li>SM-G935U</li>
<li>SM-G935V</li>
<li>SM-G9500</li>
<li>SM-G950F</li>
<li>SM-G950N</li>
<li>SM-G950U</li>
<li>SM-G950U1</li>
<li>SM-G950W</li>
<li>SM-G9550</li>
<li>SM-G955F</li>
<li>SM-G955N</li>
<li>SM-G955U</li>
<li>SM-G955U1</li>
<li>SM-G955W</li>
<li>SM-G9600</li>
<li>SM-G960F</li>
<li>SM-G960N</li>
<li>SM-G960U</li>
<li>SM-G960U1</li>
<li>SM-G9650</li>
<li>SM-G965F</li>
<li>SM-G965N</li>
<li>SM-G965U</li>
<li>SM-G965U1</li>
<li>SM-G965W</li>
<li>SM-G970F</li>
<li>SM-G970U1</li>
<li>SM-G973F</li>
<li>SM-G975F</li>
<li>SM-G975U</li>
<li>SM-G975U1</li>
<li>SM-J720F</li>
<li>SM-J727V</li>
<li>SM-M205FN</li>
<li>SM-M205G</li>
<li>SM-N9200</li>
<li>SM-N9208</li>
<li>SM-N920A</li>
<li>SM-N920C</li>
<li>SM-N920F</li>
<li>SM-N920I</li>
<li>SM-N920L</li>
<li>SM-N920P</li>
<li>SM-N920R4</li>
<li>SM-N920S</li>
<li>SM-N920W8</li>
<li>SM-N935F</li>
<li>SM-N935K</li>
<li>SM-N935S</li>
<li>SM-N9500</li>
<li>SM-N950F</li>
<li>SM-N950N</li>
<li>SM-N950U</li>
<li>SM-N9600</li>
<li>SM-N960F</li>
<li>SM-N960N</li>
<li>SM-N960U</li>
<li>SM-P205</li>
<li>SM-T713</li>
<li>SM-T719</li>
<li>SM-T719C</li>
<li>SM-T725</li>
<li>SM-T813</li>
<li>SM-T819</li>
<li>SM-T820</li>
<li>SM-T825</li>
<li>SM-T825N0</li>
<li>SM-T825Y</li>
<li>SM-T830</li>
<li>SM-T835</li>
<li>SM-T835N</li>
<li>SMART Race 4G</li>
<li>Smart_Premium</li>
<li>SMART_Surf_4G</li>
<li>SNE-LX1</li>
<li>SNE-LX2</li>
<li>SO-01H</li>
<li>SO-01J</li>
<li>SO-01K</li>
<li>SO-01L</li>
<li>SO-02H</li>
<li>SO-02J</li>
<li>SO-02K</li>
<li>SO-03G</li>
<li>SO-03H</li>
<li>SO-03J</li>
<li>SO-04H</li>
<li>SO-04J</li>
<li>SO-04K</li>
<li>SO-05G</li>
<li>SO-05K</li>
<li>Soldier</li>
<li>SOV31</li>
<li>SOV32</li>
<li>SOV33</li>
<li>SOV34</li>
<li>SOV35</li>
<li>SOV36</li>
<li>SOV37</li>
<li>SOV38</li>
<li>SP551</li>
<li>SP57</li>
<li>SP571</li>
<li>STF-AL10</li>
<li>STF-L09</li>
<li>STH100-2</li>
<li>STV100-2</li>
<li>STV100-3</li>
<li>STV100-4</li>
<li>SUPER</li>
<li>SUPRA M14AG</li>
<li>SUPRA M74D 4G</li>
<li>Swift 2</li>
<li>Swift 2 Plus</li>
<li>Swift 2 X</li>
<li>T1</li>
<li>T10 PLUS</li>
<li>T11</li>
<li>T3</li>
<li>T5</li>
<li>T5SE</li>
<li>T6</li>
<li>T6pro</li>
<li>T74HMi_4G</li>
<li>T8</li>
<li>T8-PLUS</li>
<li>T8-PLUSM</li>
<li>T8-PLUSMS</li>
<li>T8PLUSML</li>
<li>T900</li>
<li>TA-1000</li>
<li>TA-1004</li>
<li>TA-1021</li>
<li>TA-1024</li>
<li>TA-1032</li>
<li>TA-1052</li>
<li>TA-1053</li>
<li>Tasty</li>
<li>Tele2_Maxi_LTE</li>
<li>Tele2_Midi_LTE</li>
<li>TERRA PAD 1004</li>
<li>Tesla Smartphone</li>
<li>thor</li>
<li>Three_Proofings_W8</li>
<li>Three_Proofings_W9</li>
<li>Thunder</li>
<li>Tiger</li>
<li>TIT-L01</li>
<li>TLE821L</li>
<li>TM-5017</li>
<li>Turbophone 4g 2209</li>
<li>TurboPhone4G</li>
<li>TurboPhone4G 05</li>
<li>TurboPhone4G 2209</li>
<li>TX76</li>
<li>U10</li>
<li>U100</li>
<li>U11 Plus</li>
<li>U11_Plus</li>
<li>U15 Pro</li>
<li>U16 Max</li>
<li>U20</li>
<li>U20 Plus</li>
<li>U20_Plus</li>
<li>U7 Plus</li>
<li>UMI_Diamond</li>
<li>UMI_MAX</li>
<li>UMI_SUPER</li>
<li>unknown</li>
<li>Ursus TS270</li>
<li>V10_Pro</li>
<li>V1731CA</li>
<li>V1732A</li>
<li>V1809A</li>
<li>V1816A</li>
<li>V1818CA</li>
<li>V1836A</li>
<li>V3</li>
<li>VCE-L22</li>
<li>VFD 900</li>
<li>Vibe K5</li>
<li>VIE-AL10</li>
<li>VIE-L09</li>
<li>VIE-L29</li>
<li>Vienna</li>
<li>Vision</li>
<li>vivo 1601</li>
<li>vivo 1609</li>
<li>vivo 1611</li>
<li>vivo 1612</li>
<li>vivo 1713</li>
<li>vivo 1714</li>
<li>vivo 1716</li>
<li>vivo 1718</li>
<li>vivo 1719</li>
<li>vivo 1723</li>
<li>vivo 1724</li>
<li>vivo 1726</li>
<li>vivo 1727</li>
<li>vivo 1801</li>
<li>vivo 1802</li>
<li>vivo 1804</li>
<li>vivo 1805</li>
<li>vivo 1806</li>
<li>vivo 1807</li>
<li>vivo 1808</li>
<li>vivo 1817</li>
<li>vivo 1819</li>
<li>VIVO 5</li>
<li>Vivo 5R</li>
<li>vivo NEX A</li>
<li>vivo V3L</li>
<li>vivo X20A</li>
<li>vivo X21A</li>
<li>vivo X7</li>
<li>vivo X7Plus</li>
<li>vivo X9</li>
<li>vivo X9Plus</li>
<li>vivo X9s Plus</li>
<li>vivo Xplay6</li>
<li>vivo Y35</li>
<li>vivo Y51</li>
<li>vivo Y51L</li>
<li>vivo Y66i A</li>
<li>vivo Y67L</li>
<li>vivo Y71</li>
<li>vivo Y75</li>
<li>vivo Y83</li>
<li>vivo Y83A</li>
<li>vivo Y85</li>
<li>vivo Y85A</li>
<li>vivo Z1</li>
<li>vivo Z1i</li>
<li>VKY-AL00</li>
<li>VKY-L09</li>
<li>VKY-L29</li>
<li>VS987</li>
<li>VS990</li>
<li>VTR-AL00</li>
<li>VTR-L09</li>
<li>VTR-L29</li>
<li>VZH</li>
<li>WAS-AL00</li>
<li>WAS-LX1</li>
<li>WAS-LX1A</li>
<li>WAS-LX2J</li>
<li>WAS-TL10</li>
<li>Waterproof</li>
<li>Wileyfox Spark</li>
<li>Wileyfox Spark +</li>
<li>Wileyfox Spark X</li>
<li>Wileyfox Storm</li>
<li>Wileyfox Swift</li>
<li>Wileyfox Swift 2 Plus</li>
<li>WP2</li>
<li>WP5000</li>
<li>X</li>
<li>X-treme_PQ31</li>
<li>X1</li>
<li>X15</li>
<li>X16</li>
<li>X16 S</li>
<li>X1S</li>
<li>X2</li>
<li>X20L</li>
<li>X4-SH</li>
<li>X520</li>
<li>X527</li>
<li>X52X</li>
<li>x5MaxPro</li>
<li>X5max_PRO</li>
<li>x600</li>
<li>X6pro</li>
<li>X7pro</li>
<li>X800+</li>
<li>X9009</li>
<li>X9pro</li>
<li>XP9800</li>
<li>XT1575</li>
<li>XT1580</li>
<li>XT1585</li>
<li>XT1650</li>
<li>XT1662</li>
<li>XT1663</li>
<li>XT1803</li>
<li>Y6</li>
<li>Y6 Max</li>
<li>Y6 MAX 3D</li>
<li>Y8 Plus</li>
<li>YNDX-000SB</li>
<li>YOTA 3+</li>
<li>Z1</li>
<li>Z155</li>
<li>Z2</li>
<li>Z2 Plus</li>
<li>Z2131</li>
<li>Z7</li>
<li>Z8</li>
<li>Z981</li>
<li>Z9MAX</li>
<li>ZA550KL</li>
<li>ZB500KL</li>
<li>ZB553KL</li>
<li>ZB555KL</li>
<li>ZB602KL</li>
<li>ZB631KL</li>
<li>ZB633KL</li>
<li>ZC520KL</li>
<li>ZC551KL</li>
<li>ZC553KL</li>
<li>ZC554KL</li>
<li>ZC600KL</li>
<li>ZD552KL</li>
<li>ZD553KL</li>
<li>ZE520KL</li>
<li>ZE552KL</li>
<li>ZE553KL</li>
<li>ZE554KL</li>
<li>ZE620KL</li>
<li>ZenFone Max Pro M1</li>
<li>ZS550KL</li>
<li>ZS620KL</li>
<li>ZTE A2017</li>
<li>ZTE A2017G</li>
<li>ZTE A2017U</li>
<li>ZTE Axon 7</li>
<li>ZTE B2016</li>
<li>ZTE B2017G</li>
<li>ZTE BLADE A0620</li>
<li>ZTE BLADE A210</li>
<li>ZTE Blade A465</li>
<li>ZTE Blade A476</li>
<li>ZTE BLADE A510</li>
<li>ZTE Blade A515</li>
<li>ZTE BLADE A530</li>
<li>ZTE BLADE A610</li>
<li>ZTE BLADE A910</li>
<li>ZTE Blade L4 Pro</li>
<li>ZTE BLADE V0710</li>
<li>ZTE BLADE V0730</li>
<li>ZTE BLADE V0800</li>
<li>ZTE BLADE V0840</li>
<li>ZTE BLADE V0850</li>
<li>ZTE BLADE V0920</li>
<li>ZTE BLADE V7</li>
<li>ZTE BLADE V9</li>
<li>ZTE Blade X9</li>
<li>ZTE BV0720</li>
<li>ZTE T620</li>
<li>ZTE T660</li>
<li>ZTE T663</li>
<li>ZTE Z10</li>
<li>ZTU31</li>
<li>ZUK Z2121</li>
<li>ZUK Z2131</li>
</ul>
<br />
<br />Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-84064683883769107842019-05-31T16:26:00.001-04:002020-04-15T15:08:14.024-04:00Internal extensions in TFSSome of the <strike>TFS</strike> Azure DevOps functionality that comes out of the box is internally organized the same way third party extensions are. You can even see their manifests:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">use </span><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">Tfs_Configuration;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">select p.DisplayName, p.PublisherName, e.ExtensionName,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> e.DisplayName, e.ShortDescription, cast(Content as varchar(max)) as Content</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> from Gallery.tbl_Asset a</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> inner join Gallery.tbl_Extension e on a.ReferenceID=e.ExtensionId</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> inner join Gallery.tbl_Publisher p on e.PublisherId = p.PublisherId</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> inner join tbl_FileReference r on a.FileId = r.FileId</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> inner join tbl_Content c on r.ResourceId = c.ResourceId</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> where AssetType = 'Microsoft.VisualStudio.Services.Manifest'</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> order by e.ExtensionName, a.Version desc</span><br />
<br />
I can see multiple versions of the same extension there, my TFS instance went through several version upgrades; on a freshly installed copy there would probably be only one.<br />
<br />
<a name='more'></a><br />
One of the nicer touches is how the very contribution <i>types</i> are somewhat documented in those manifests.<br />
<hr />
<br />
Not everything you see in user extensible lists is present there, though. Specifically, the built-in service hook consumers - Trello, Slack, and so on - don't seem to be listed there. The reason I was wondering, surely those third party sites don't expose TFS aware REST endpoints; there must be some layer of translating the payload from TFS' own format to the target's. I was rather hoping that the manifests would provide some guidance how. However, the manifest that describes the <b>consumer</b> contribution type (the one for <b>vss-servicehooks</b> extension) claims that only the following fields are supported under the <b>publishEvent</b>:<br />
<ul>
<li>url</li>
<li>headers</li>
<li>resourceDetailsToSend</li>
<li>messagesToSend</li>
<li>detailedMessagesToSend</li>
</ul>
<div>
With the exception of headers, those are all <a href="https://docs.microsoft.com/en-us/azure/devops/extend/develop/add-service-hook?view=azure-devops" target="_blank">kind of documented</a>., and <a href="https://docs.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops" target="_blank">the only options for the latter three</a> are All, Minimal, or None.<br />
<br />
There's a hint of a variable substitution functionality in the docs; in the sample hook consumer, they use {{{url}}} as the value of <b>publishEvent.url</b>, and there is also a user editable <b>url</b> input field listed under <b>inputDescriptors</b>. One presumes that {{{url}}} refers to the value of the latter. Can I similarly substitute properties of the original event?<br />
<br />
<hr />
<br />
UPDATE: looks the service hook consumers are baked into the C# code. There's an assembly <b>Microsoft.VisualStudio.Services.ServiceHooks.Consumers.dll</b> with namespaces exactly like those built-in service hooks - Slack, Trello, etc. Oh well. This particular avenue of extension is a private road.</div>
Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-28557116883299283742019-05-31T13:09:00.001-04:002020-07-31T12:16:39.301-04:00Let me know, TFSToday's obscure corner of the TFS REST API to explore would be - notifications. Some time ago, I've noticed that SOAP is no longer an option on the collection-level Notifications screen, but it's supported internally. If it's supported internally, then it must be supported by the API. Indeed it is, <a href="https://docs.microsoft.com/en-us/rest/api/azure/devops/notification/subscriptions/create?view=azure-devops-rest-5.0#isubscriptionchannel" target="_blank">there's a REST API endpoint</a> for subscription creation, and one of the parameters is called "channel", and it's supposed to be an instance of <span style="font-family: "courier new", courier, monospace;">ISubscriptionChannel</span>. That's where the docs go blank, except mentioning that it has a <span style="font-family: "courier new", courier, monospace;">type</span> property.<div><br /></div><span><a name='more'></a></span><div><br />
<br />
Pulling up a record for a legacy SOAP notification that existed since TFS2017, one can see an instance of the SOAP-type channel object; it goes:<br />
<br />
<span style="font-family: "courier new", courier, monospace;">"channel":</span><br />
<span style="font-family: "courier new", courier, monospace;">{</span><br />
<span style="font-family: "courier new", courier, monospace;"> "type": "Soap",</span><br />
<span style="font-family: "courier new", courier, monospace;"> "address": "http://www.acme.com/tfsutil/boo.svc",</span><br />
<span style="font-family: "courier new", courier, monospace;"> "useCustomAddress": true</span><br />
<span style="font-family: "courier new", courier, monospace;">}</span><br />
<br />
So there's definitely more to the channel object than the <span style="font-family: "courier new", courier, monospace;">type</span> property. Good job documenting the REST endpoint, Microsoft.<br />
<br />
Here's where we fall back to the C# API. Turns out, ISubscriptionChannel is a C# interface in the Microsoft.VisualStudio.Services.Notifications.WebApi namespace, and it is implemented by the following documented concrete classes:<br />
<br />
<ul>
<li>BlockSubscriptionChannel ("Block")</li>
<li>MessageQueueSubscriptionChannel ("MessageQueue")</li>
<li>ServiceBusSubscriptionChannel ("ServiceBus")</li>
<li>ServiceHooksSubscriptionChannel ("ServiceHooks")</li>
<li>UnsupportedSubscriptionChannel (no set type)</li>
<li><b>EmailHtmlSubscriptionChannel ("EmailHtml")</b></li>
<li><b>EmailPlaintextSubscriptionChannel ("EmailPlaintext")</b></li>
<li><b>GroupSubscriptionChannel ("Group")</b></li>
<li><b>SoapSubscriptionChannel ("Soap")</b></li>
<li><b>UserSubscriptionChannel ("User")</b></li>
<li><b>UserSystemSubscriptionChannel ("UserSystem")</b></li>
</ul>
<br />
<div>
The latter 6 have, in addition to Type, two more properties: string Address and boolean UseCustomAddress. The first 5 have no parameters. I'm not sure how/if they work at all.</div>
<div>
<br /></div>
</div>Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-44406984549485640722019-04-24T11:20:00.001-04:002019-04-24T11:20:37.192-04:00"Now" means last weekWhat the world needs is a dynamic database record/replay tool.<br />
<br />
Okay, maybe not the world. But for me and for my software shop, that would address a need.<br />
<br />
Migrating relational client-server databases from one version of the server software to another is a fact of life. So are breaking changes between versions.<br />
<br />
So here's the idea: we take a snapshot of the production database, then record everything that's happening in it for, say, a month. Then we restore the snapshot on another database server, one with version N+1, and replay the recorded activity log against it. If the final state of the database matches the final state in production, then we know, with a good degree of assurance, that the system won't be broken by the version upgrade.<br />
<br />
Nice vision. But there's a major monkey wrench in it - nondeterministic functions. If our goal is a database that's identical to the source, field for field, every input must exactly match, even the things that we don't usually consider input - the current time, the generated GUIDs, the numeric session IDs. That's why this vision is unlikely to come true without major support from the database vendor.<br />
<br />
<br />Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-62482549126062154432019-03-25T15:27:00.001-04:002019-10-12T11:52:26.602-04:00OAuth scopes in TFS 2019Now that I have a <strike>TFS</strike> Azure DevOps 2019 box, let's dump the scopes from that one, too.<br />
<br />
The same caveat applies: some of those might be cloud only.<br />
<a name='more'></a><br />
<br />
<b>preview_api_all</b><br />
<ul>
<li>/_apis#OPTIONS</li>
<li>/DefaultCollection/_apis#OPTIONS</li>
<li>/_apis/connectiondata#GET</li>
<li>/DefaultCollection/_apis/connectiondata#GET</li>
<li>/_apis/ServiceDefinitions#GET</li>
<li>/_apis/build/builds#GET+PATCH+DELETE</li>
<li>/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/_apis/build/definitions</li>
<li>/_apis/build/queues</li>
<li>/DefaultCollection/_apis/build/builds#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/DefaultCollection/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/build/definitions</li>
<li>/DefaultCollection/_apis/build/queues</li>
<li>/DefaultCollection/_apis/resources/Containers#GET</li>
<li>/DefaultCollection/*/_apis/build/builds#GET+PATCH+DELETE+PUT+POST</li>
<li>/DefaultCollection/*/_apis/build/folders#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/definitions#GET+POST+PUT+DELETE+PATCH</li>
<li>/DefaultCollection/*/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/tags#GET</li>
<li>/DefaultCollection/*/_apis/build/options#GET</li>
<li>/DefaultCollection/_apis/build/queues#GET</li>
<li>/DefaultCollection/_apis/build/options#GET</li>
<li>/DefaultCollection/_apis/build/controllers#GET</li>
<li>/_apis/accounts</li>
<li>/_apis/profile/profiles</li>
<li>/_apis/projectCollections</li>
<li>/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/projects#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/_apis/notifications/*/eventdefinitions</li>
<li>/_apis/hooks/consumers</li>
<li>/_apis/hooks/publishers</li>
<li>/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
<li>/_apis/hooks/inputValuesQuery#POST</li>
<li>/_apis/hooks/notificationsQuery#POST</li>
<li>/_apis/hooks/subscriptionsQuery#POST</li>
<li>/_apis/hooks/publishersQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/consumers</li>
<li>/DefaultCollection/_apis/hooks/publishers</li>
<li>/DefaultCollection/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/hooks/inputValuesQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/notificationsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/subscriptionsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/publishersQuery#POST</li>
<li>/_apis/chat/rooms/*/messages#GET+POST+PUT+PATCH+DELETE</li>
<li>/_apis/chat/rooms#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/chat/rooms/*/messages#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/chat/rooms#GET+POST+PUT+PATCH+DELETE</li>
<li>/_apis/tfvc/branches</li>
<li>/_apis/tfvc/changesets</li>
<li>/_apis/tfvc/labels</li>
<li>/_apis/tfvc/shelvesets</li>
<li>/_apis/tfvc/workspaces#GET+POST</li>
<li>/_apis/tfvc/changesetsBatch#POST</li>
<li>/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/_apis/tfvc/branches</li>
<li>/DefaultCollection/_apis/tfvc/changesets</li>
<li>/DefaultCollection/_apis/tfvc/items</li>
<li>/DefaultCollection/_apis/tfvc/labels</li>
<li>/DefaultCollection/_apis/tfvc/shelvesets</li>
<li>/DefaultCollection/_apis/tfvc/workspaces#GET+POST</li>
<li>/DefaultCollection/_apis/tfvc/changesetsBatch#POST</li>
<li>/DefaultCollection/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/*/_apis/tfvc#GET+POST</li>
<li>/_apis/git/repositories#GET+POST</li>
<li>/_apis/git/repositories/*/commits</li>
<li>/_apis/git/*/repositories/*/commits</li>
<li>/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/_apis/git/repositories/*/forks/*#GET</li>
<li>/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/_apis/git/repositories/*/forkSyncRequests#GET+POST</li>
<li>/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/_apis/git/*/repositories/*/forkSyncRequests#GET+POST</li>
<li>/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/_apis/git/repositories/*/pushes#GET+POST</li>
<li>/_apis/git/*/repositories/*/pushes#GET+POST</li>
<li>/_apis/git/repositories/*/pushes/*</li>
<li>/_apis/git/*/repositories/*/pushes/*</li>
<li>/_apis/git/repositories/*#GET+PATCH+DELETE</li>
<li>/_apis/git/*/repositories/*#GET+PATCH+DELETE</li>
<li>/_apis/git/*/repositories#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes/*</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes/*</li>
<li>/DefaultCollection/_apis/git/repositories/*#GET+PATCH+DELETE+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*#GET+PATCH+DELETE+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequests#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/codereview/reviews#GET</li>
<li>/DefaultCollection/*/_apis/codereview/reviews#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/codereview/reviewsbatch#POST</li>
<li>/DefaultCollection/*/_apis/codereview/settings#GET+POST+PUT</li>
<li>/DefaultCollection/_apis/visits/artifactVisits#PUT</li>
<li>/DefaultCollection/_apis/visits/artifactVisitsBatch#POST</li>
<li>/DefaultCollection/_apis/visits/artifactStatsBatch#POST</li>
<li>/DefaultCollection/*/_apis/policy/Evaluations#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/policy/configurations</li>
<li>/DefaultCollection/*/_apis/policy/configurations/*/revisions</li>
<li>/DefaultCollection/*/_apis/policy/types</li>
<li>/DefaultCollection/*/_apis/git/policy/configurations</li>
<li>/_apis/wit/attachments#GET+POST</li>
<li>/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/attachments#GET+POST</li>
<li>/DefaultCollection/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/_apis/wit/fields#GET+POST</li>
<li>/_apis/wit/wiql#GET+POST</li>
<li>/_apis/wit/workitemrelationtypes#GET</li>
<li>/_apis/wit/workitems#GET+POST+PATCH</li>
<li>/_apis/wit/workitemtypecategories#GET</li>
<li>/_apis/wit/workitemtypes#GET</li>
<li>/_apis/wit/$ruleEngine#POST</li>
<li>/_apis/wit/$batch#POST</li>
<li>/_apis/wit/artifactlinktypes#GET</li>
<li>/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/_apis/wit/artifactlinktypes#GET</li>
<li>/DefaultCollection/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/_apis/wit/fields#GET+POST</li>
<li>/DefaultCollection/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/_apis/wit/workitemrelationtypes#GET</li>
<li>/DefaultCollection/_apis/wit/workitems#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/$ruleEngine#POST</li>
<li>/DefaultCollection/_apis/wit/$batch#POST</li>
<li>/DefaultCollection/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/_apis/work/processes#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/work/processdefinitions#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/fields#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/classificationnodes#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypecategories#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypes#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/*/*/_apis/wit/templates#GET+PUT+POST+DELETE</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/_apis/resources/Containers/*</li>
<li>/_apis/resources/Containers/*</li>
<li>/_api/_wit/teamProjects</li>
<li>/DefaultCollection/_api/_wit/teamProjects</li>
<li>/DefaultCollection/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/_apis/work/processconfiguration#GET</li>
<li>/DefaultCollection/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogs#GET</li>
<li>/DefaultCollection/*/_apis/boards/boards#GET+PUT+POST+DELETE</li>
<li>/_apis/clt/testdrops#GET+POST</li>
<li>/_apis/clt/testruns#GET+POST+PATCH</li>
<li>/_apis/clt/testruns/*/errors</li>
<li>/_apis/clt/testruns/*/messages</li>
<li>/_apis/clt/testruns/*/results</li>
<li>/_apis/clt/testruns/*/counterinstances</li>
<li>/_apis/clt/testruns/*/countersamples</li>
<li>/_apis/clt/apm</li>
<li>/_apis/clt/configuration</li>
<li>/_apis/clt/agentgroups#GET+POST+PATCH+DELETE</li>
<li>/_apis/clt/agentgroups/*/agents#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test#GET+POST+PATCH+DELETE</li>
<li>/_apis/test/suites</li>
<li>/_apis/Identities#GET+PUT+DELETE</li>
<li>/_apis/IdentityBatch#POST</li>
<li>/_apis/Groups#GET+DELETE+POST</li>
<li>/_apis/Scopes#GET+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/discussion/threads#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/discussion/threadsBatch#POST</li>
<li>/DefaultCollection/_apis/discussion/comments#PATCH</li>
<li>/_apis/Commerce/*#GET</li>
<li>/_apis/Commerce/Subscription/*/*#GET+PUT</li>
<li>/_apis/gallery/*#GET</li>
<li>/_apis/gallery/acquisitionrequests/*#POST</li>
</ul>
<b>vso.base</b><br />
<ul>
<li>/_apis#OPTIONS</li>
<li>/DefaultCollection/_apis#OPTIONS</li>
<li>/_apis/connectiondata#GET</li>
<li>/_apis/servicelevel#GET</li>
<li>/DefaultCollection/_apis/connectiondata#GET</li>
<li>/_apis/ServiceDefinitions#GET</li>
<li>/_apis/resourceareas#GET</li>
<li>/DefaultCollection/_apis/resourceareas#GET</li>
<li>/_apis/operations#GET</li>
<li>/DefaultCollection/_apis/operations#GET</li>
<li>/_apis/permissions#GET</li>
<li>/_apis/SecurityNamespaces#GET</li>
<li>/_apis/AccessControlLists#GET</li>
<li>/_apis/security/permissionEvaluationBatch#POST</li>
<li>/DefaultCollection/_apis/permissions#GET</li>
<li>/DefaultCollection/_apis/SecurityNamespaces#GET</li>
<li>/DefaultCollection/_apis/AccessControlLists#GET</li>
<li>/DefaultCollection/_apis/security/permissionEvaluationBatch#POST</li>
<li>/_apis/securityroles/scopes/*/roledefinitions#GET</li>
<li>/_apis/securityroles/scopes/*/roleassignments/resources/*#GET</li>
<li>/DefaultCollection/_apis/securityroles/scopes/*/roledefinitions#GET</li>
<li>/DefaultCollection/_apis/securityroles/scopes/*/roleassignments/resources/*#GET</li>
</ul>
<b>vso.profile</b><br />
<ul>
<li>/_apis/account#GET</li>
<li>/_apis/account/regions#GET</li>
<li>/_apis/accounts#GET</li>
<li>/_apis/projectCollections#GET</li>
<li>/_apis/profile/profiles#GET</li>
<li>/_apis/profile/UserDefaults#GET</li>
<li>/_apis/profile/regions#GET</li>
<li>/_apis/profile/georegion#GET</li>
<li>/_apis/profile/Locations#GET</li>
<li>/_apis/profile/Settings#GET</li>
<li>/_apis/profile/Attributes#GET+PATCH</li>
<li>/_apis/ClientNotification/Subscriptions#GET</li>
<li>/_apis/process/processes#GET</li>
<li>/DefaultCollection/_apis/projects#GET</li>
<li>/DefaultCollection/_apis#OPTIONS</li>
<li>/_apis/Organization/Regions#GET</li>
</ul>
<b>vso.profile_write</b><br />
<ul>
<li>/_apis/profile/profiles#PATCH+PUT</li>
</ul>
<b>vso.acquisition_write</b><br />
<ul>
<li>/*/_apis/ServiceDefinitions#GET</li>
<li>/*/_apis/projectCollections#GET</li>
<li>/*/_apis/projects#GET+POST</li>
<li>/*/_apis/operations#GET</li>
<li>/_apis/ServiceDefinitions#GET</li>
<li>/_apis/projects#GET+POST</li>
<li>/_apis/operations#GET</li>
<li>/_apis/profile/avatar#GET+POST+DELETE+PUT</li>
<li>/_apis/profile/profiles#GET+POST+PATCH</li>
<li>/_apis/profile/UserDefaults#GET+PUT</li>
<li>/_apis/accounts#GET+POST</li>
<li>/api/account#GET+POST</li>
<li>/_apis/delegatedauth/registration#GET</li>
<li>/_apis/delegatedauth/registrationsecret#GET</li>
<li>/_apis/delegatedauth/authorizations#GET</li>
<li>/_apis/UserMapping/UserAccountMappings#GET</li>
<li>/_apis/user/attributes#GET+PATCH+DELETE</li>
<li>/_apis/user/avatar#GET+PUT+DELETE</li>
<li>/_apis/user/avatarPreview#POST</li>
<li>/_apis/user/contactWithOffers#GET+PUT</li>
<li>/_apis/user/userDefaults#GET</li>
<li>/_apis/user/user#GET+POST+PATCH</li>
<li>/_apis/UserEntitlements/*#DELETE</li>
<li>/_apis/useraad/aadMembership#GET</li>
<li>/_apis/Pipelines/Connections#POST</li>
<li>/_apis/Contribution/dataProviders/query#POST</li>
<li>/_apis/Contribution/nodes/query#POST</li>
<li>/_apis/OrganizationPolicy/Policies#GET</li>
<li>/_apis/HostAcquisition/Regions#GET</li>
</ul>
<b>vso.identity</b><br />
<ul>
<li>/*/_apis/identities#GET</li>
<li>/*/_apis/groups#GET</li>
<li>/*/_apis/scopes#GET</li>
<li>/*/_apis/identitybatch#POST</li>
<li>/_apis/identities#GET</li>
<li>/_apis/groups#GET</li>
<li>/_apis/scopes#GET</li>
<li>/_apis/identitybatch#POST</li>
<li>/DefaultCollection/_apis/identities#GET</li>
<li>/DefaultCollection/_apis/groups#GET</li>
<li>/DefaultCollection/_apis/scopes#GET</li>
<li>/DefaultCollection/_apis/identitybatch#POST</li>
</ul>
<b>vso.identity_manage</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/_apis/identities#GET+POST+PUT+DELETE</li>
<li>/_apis/groups#GET+POST+PUT+DELETE</li>
<li>/_apis/scopes#GET+POST+PUT+DELETE+PATCH</li>
<li>/DefaultCollection/_apis/identities#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/groups#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/scopes#GET+POST+PUT+DELETE+PATCH</li>
<li>/Services/*/IdentityManagementService.asmx#POST</li>
<li>/*/Services/*/IdentityManagementService.asmx#POST</li>
<li>/Services/*/IdentityManagementService2.asmx#POST</li>
<li>/*/Services/*/IdentityManagementService2.asmx#POST</li>
</ul>
<b>vso.hooks</b><br />
<ul>
<li>/_apis/hooks/consumers#GET</li>
<li>/_apis/hooks/inputValuesQuery#POST</li>
<li>/_apis/hooks/notificationsQuery#POST</li>
<li>/_apis/hooks/publishers#GET</li>
<li>/_apis/hooks/publishersQuery#POST</li>
<li>/_apis/hooks/subscriptions#GET</li>
<li>/_apis/hooks/subscriptionsQuery#POST</li>
<li>/_apis/hooks/testNotifications#POST</li>
<li>/DefaultCollection/_apis/hooks/consumers#GET</li>
<li>/DefaultCollection/_apis/hooks/inputValuesQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/notificationsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/publishers#GET</li>
<li>/DefaultCollection/_apis/hooks/publishersQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/subscriptions#GET</li>
<li>/DefaultCollection/_apis/hooks/subscriptionsQuery#POST</li>
<li>/DefaultCollection/_apis/hooks/testNotifications#POST</li>
</ul>
<b>vso.hooks_write</b><br />
<ul>
<li>/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/hooks/subscriptions#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.hooks_interact</b><br />
<ul>
<li>/DefaultCollection/_apis/wit/workitems#PATCH</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypes/*/states#GET</li>
</ul>
<b>vso.work</b><br />
<ul>
<li>/_apis/tagging#GET</li>
<li>/DefaultCollection/_apis/tagging#GET</li>
<li>/DefaultCollection/_apis/wit/attachments#GET</li>
<li>/DefaultCollection/_apis/wit/fields#GET</li>
<li>/DefaultCollection/_apis/wit/workitemrelationtypes#GET</li>
<li>/DefaultCollection/_apis/wit/queries#GET</li>
<li>/DefaultCollection/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/_apis/wit/workitems#GET</li>
<li>/DefaultCollection/_apis/wit/workitemsbatch#POST</li>
<li>/DefaultCollection/*/_apis/wit/attachments#GET</li>
<li>/DefaultCollection/*/_apis/wit/revisions#GET</li>
<li>/DefaultCollection/*/_apis/wit/fields#GET</li>
<li>/DefaultCollection/*/_apis/wit/classificationnodes#GET</li>
<li>/DefaultCollection/*/_apis/wit/queries#GET</li>
<li>/DefaultCollection/*/_apis/wit/queriesbatch#POST</li>
<li>/DefaultCollection/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypecategories#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypes#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypetemplate#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET</li>
<li>/DefaultCollection/*/_apis/wit/workitemsbatch#POST</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET</li>
<li>/DefaultCollection/*/*/_apis/wit/wiql#GET+POST</li>
<li>/DefaultCollection/*/*/_apis/wit/templates#GET</li>
<li>/DefaultCollection/_apis/wit/workitemtypetemplate#GET</li>
<li>/DefaultCollection/_apis/wit/$ruleEngine#POST</li>
<li>/DefaultCollection/*/_apis/work/boards#GET</li>
<li>/DefaultCollection/*/*/_apis/work/boards#GET</li>
<li>/DefaultCollection/*/_apis/work/teamsettings#GET</li>
<li>/DefaultCollection/*/*/_apis/work/teamsettings#GET</li>
<li>/DefaultCollection/*/_apis/work/processconfiguration#GET</li>
<li>/DefaultCollection/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogconfiguration#GET</li>
<li>/DefaultCollection/*/*/_apis/work/backlogs#GET</li>
<li>/DefaultCollection/_apis/work/boardcolumns#GET</li>
<li>/DefaultCollection/*/_apis/work/boardcolumns#GET</li>
<li>/DefaultCollection/_apis/work/boardrows#GET</li>
<li>/DefaultCollection/*/_apis/work/boardrows#GET</li>
<li>/DefaultCollection/*/_apis/boards/boards#GET</li>
<li>/DefaultCollection/_apis/wit/reporting/workItemRevisions#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/reporting/workItemRevisions#GET+POST</li>
<li>/DefaultCollection/_apis/wit/reporting/workItemLinks#GET</li>
<li>/DefaultCollection/*/_apis/wit/reporting/workItemLinks#GET</li>
<li>/DefaultCollection/_apis/process/processes#GET</li>
<li>/DefaultCollection/_apis/wit/artifactlinktypes#GET</li>
<li>/DefaultCollection/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/*/_apis/wit/artifacturiquery#POST</li>
<li>/DefaultCollection/_apis/work/processes#GET</li>
<li>/DefaultCollection/_apis/work/processdefinitions#GET</li>
<li>/_apis/search/workItemSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/workItemSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/workItemSearchResults#POST</li>
</ul>
<b>vso.work_write</b><br />
<ul>
<li>/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/attachments#GET+POST+PUT</li>
<li>/DefaultCollection/*/_apis/wit/attachments#GET+POST+PUT</li>
<li>/DefaultCollection/*/_apis/wit/classificationnodes#GET+POST+DELETE+PATCH</li>
<li>/DefaultCollection/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_apis/wit/queries#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/workitems#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/recyclebin#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/workitems#PATCH</li>
<li>/DefaultCollection/_apis/tagging#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/*/_apis/work/boards#GET+PUT+PATCH</li>
<li>/DefaultCollection/*/_apis/boards/boards#GET+PUT+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/workitems#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wit/recyclebin#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/$batch#POST</li>
<li>/DefaultCollection/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/*/_apis/work/teamsettings#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/*/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/_apis/wit/workitemtypetemplate#GET+POST</li>
<li>/DefaultCollection/*/*/_apis/wit/templates#GET+PUT+POST+DELETE</li>
<li>/DefaultCollection/_apis/work/processes#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/work/processdefinitions#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/wit/fields#GET+POST</li>
<li>/DefaultCollection/*/_apis/wit/fields#GET+POST</li>
</ul>
<b>vso.work_full</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/WorkItemTracking/*/ClientService.asmx#POST</li>
<li>/WorkItemTracking/*/ConfigurationSettingsService.asmx#POST</li>
<li>/WorkItemTracking/*/Integration.asmx#POST</li>
<li>/*/WorkItemTracking/*/ClientService.asmx#POST</li>
<li>/*/WorkItemTracking/*/ConfigurationSettingsService.asmx#POST</li>
<li>/*/WorkItemTracking/*/Integration.asmx#POST</li>
<li>/Services/*/ProcessTemplate.asmx#POST</li>
<li>/*/Services/*/ProcessTemplate.asmx#POST</li>
<li>/Services/*/TeamConfigurationService.asmx#POST</li>
<li>/*/Services/*/TeamConfigurationService.asmx#POST</li>
<li>/WorkItemTracking/*/AttachFileHandler.ashx#POST</li>
<li>/*/WorkItemTracking/*/AttachFileHandler.ashx#POST</li>
</ul>
<b>vso.build</b><br />
<ul>
<li>/DefaultCollection/_apis/resources/Containers#GET</li>
<li>/DefaultCollection/*/_apis/build/builds#GET</li>
<li>/DefaultCollection/*/_apis/build/changes#GET</li>
<li>/DefaultCollection/*/_apis/build/folders#GET</li>
<li>/DefaultCollection/*/_apis/build/definitions#GET</li>
<li>/DefaultCollection/*/_apis/build/requests#GET</li>
<li>/DefaultCollection/*/_apis/build/qualities#GET</li>
<li>/DefaultCollection/*/_apis/build/tags#GET</li>
<li>/DefaultCollection/*/_apis/build/options#GET</li>
<li>/DefaultCollection/*/_apis/build/repos#GET</li>
<li>/DefaultCollection/_apis/build/builds#GET</li>
<li>/DefaultCollection/_apis/build/queues#GET</li>
<li>/DefaultCollection/_apis/build/options#GET</li>
<li>/DefaultCollection/_apis/build/controllers#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/hubs/build/plans#GET</li>
</ul>
<b>vso.build_execute</b><br />
<ul>
<li>/DefaultCollection/*/_apis/build/builds#GET+PATCH+DELETE+PUT+POST</li>
<li>/DefaultCollection/*/_apis/build/requests#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/build/qualities#GET+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/folders#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/build/definitions#GET+POST+PUT+DELETE+PATCH</li>
<li>/DefaultCollection/_apis/build/builds#GET+PATCH+DELETE+PUT+POST</li>
<li>/DefaultCollection/_apis/build/queues#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/distributedtask/hubs/build/plans#GET+PUT+POST+PATCH</li>
</ul>
<b>vso.build_fork</b><br />
<ul>
<li>/_apis/distributedtask/tasks#GET</li>
<li>/_apis/CustomerIntelligence/Events#POST</li>
<li>/DefaultCollection/_apis/distributedtask/tasks#GET</li>
<li>/DefaultCollection/_apis/distributedtask/securefiles#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/securefiles#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/hubs/build/plans#POST+PATCH+PUT</li>
<li>/DefaultCollection/*/_apis/test/runs#POST+PATCH</li>
<li>/DefaultCollection/*/_apis/test/codeCoverage#GET+POST</li>
</ul>
<b>vso.build_fork_with_artifacts</b><br />
<ul>
<li>/_apis/resources/Containers/*#PUT</li>
<li>/DefaultCollection/_apis/build/builds/*/artifacts#POST</li>
<li>/DefaultCollection/_apis/resources/Containers/*#PUT</li>
<li>/DefaultCollection/*/_apis/build/builds/*/artifacts#POST</li>
</ul>
<b>vso.code</b><br />
<ul>
<li>/DefaultCollection/_apis/tfvc/branches#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/branches#GET</li>
<li>/DefaultCollection/_apis/tfvc/changesets#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/changesets#GET</li>
<li>/DefaultCollection/_apis/tfvc/changesetsBatch#POST</li>
<li>/DefaultCollection/_apis/tfvc/labels#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/labels#GET</li>
<li>/DefaultCollection/_apis/tfvc/labelItems#GET</li>
<li>/DefaultCollection/_apis/tfvc/shelvesets#GET</li>
<li>/DefaultCollection/_apis/tfvc/items#GET</li>
<li>/DefaultCollection/*/_apis/tfvc/items#GET</li>
<li>/DefaultCollection/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/*/_apis/tfvc/itemBatch#POST</li>
<li>/DefaultCollection/*/*/_git/*#GET</li>
<li>/DefaultCollection/*/_git/*#GET</li>
<li>/DefaultCollection/_git/*#GET</li>
<li>/DefaultCollection/*/*/_git/_full/*#GET</li>
<li>/DefaultCollection/*/_git/_full/*#GET</li>
<li>/DefaultCollection/_git/_full/*#GET</li>
<li>/DefaultCollection/*/*/_git/_optimized/*#GET</li>
<li>/DefaultCollection/*/_git/_optimized/*#GET</li>
<li>/DefaultCollection/_git/_optimized/*#GET</li>
<li>/DefaultCollection/*/*/_git/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/_git/*/git-upload-pack#POST</li>
<li>/DefaultCollection/_git/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/*/_git/_full/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/_git/_full/*/git-upload-pack#POST</li>
<li>/DefaultCollection/_git/_full/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/*/_git/_optimized/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/_git/_optimized/*/git-upload-pack#POST</li>
<li>/DefaultCollection/_git/_optimized/*/git-upload-pack#POST</li>
<li>/DefaultCollection/*/*/_git/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/_git/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/_git/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/*/_git/_full/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/_git/_full/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/_git/_full/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/*/_git/_optimized/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/_git/_optimized/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/_git/_optimized/*/info/lfs/objects#POST</li>
<li>/DefaultCollection/*/*/_git/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_git/*/gvfs/*#POST</li>
<li>/DefaultCollection/_git/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/*/_git/_full/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_git/_full/*/gvfs/*#POST</li>
<li>/DefaultCollection/_git/_full/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/*/_git/_optimized/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_git/_optimized/*/gvfs/*#POST</li>
<li>/DefaultCollection/_git/_optimized/*/gvfs/*#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/blobs#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commits</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/items#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pushes#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/refs#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/trees#GET</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/*/_apis/git/favorites/refs#GET</li>
<li>/DefaultCollection/*/_apis/git/favorites/refs#POST</li>
<li>/DefaultCollection/*/_apis/git/favorites/refs#PUT</li>
<li>/DefaultCollection/*/_apis/git/repositories#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/blobs#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/items#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/fileDiffs#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/conflicts#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pushes#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/refs#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/trees#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/limitedRefCriteria#GET</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/blobs#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/items#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/merges/*#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/refs#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/trees#GET</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/_apis/git/repositories#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/blobs#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/commitsBatch#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/diffs/commits#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/items#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/itemsBatch#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/filepaths#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forks/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests/*#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/conflicts#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequestquery#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/refs#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/stats/branches#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/trees#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/limitedRefCriteria#GET</li>
<li>/DefaultCollection/_apis/git/repositories/*/mergeBases#GET</li>
<li>/DefaultCollection/*/_apis/git/pullRequests#GET</li>
<li>/DefaultCollection/_apis/git/pullRequests#GET</li>
<li>/DefaultCollection/_apis/codereview/reviews#GET</li>
<li>/DefaultCollection/*/_apis/codereview/reviews#GET</li>
<li>/DefaultCollection/*/_apis/codereview/reviewsbatch#POST</li>
<li>/DefaultCollection/*/_apis/codereview/settings#GET</li>
<li>/DefaultCollection/_apis/visits/artifactVisitsBatch#POST</li>
<li>/DefaultCollection/_apis/visits/artifactStatsBatch#POST</li>
<li>/DefaultCollection/*/_apis/policy/Evaluations#GET</li>
<li>/DefaultCollection/*/_apis/policy/configurations#GET</li>
<li>/DefaultCollection/*/_apis/policy/types#GET</li>
<li>/DefaultCollection/*/_apis/policy/configurations/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/git/policy/configurations#GET</li>
<li>/_apis/search/codeSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/codeSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/codeSearchResults#POST</li>
</ul>
<b>vso.code_write</b><br />
<ul>
<li>/DefaultCollection/_apis/tfvc/changesets#GET+POST</li>
<li>/DefaultCollection/*/_apis/tfvc/changesets#GET+POST</li>
<li>/DefaultCollection/*/*/_git/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_git/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_git/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_git/_full/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_git/_full/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_git/_full/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/*/_git/_optimized/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_git/_optimized/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_git/_optimized/*#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/pushes#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/conflicts#PATCH</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pushes#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/*/_apis/git/*/repositories/*/objects#PUT</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/objects#PUT</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/pushes#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/conflicts#PATCH</li>
<li>/DefaultCollection/_apis/git/repositories/*/pushes#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/refs#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/forkSyncRequests/*#POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/merges#POST</li>
<li>/DefaultCollection/_apis/git/*/repositories/*/objects#PUT</li>
<li>/DefaultCollection/_apis/git/repositories/*/objects#PUT</li>
<li>/DefaultCollection/*/_apis/codereview/reviews#POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/codereview/settings#POST+PUT</li>
<li>/DefaultCollection/_apis/visits/artifactVisits#PUT</li>
<li>/DefaultCollection/*/_apis/policy/Evaluations#PATCH</li>
<li>/DefaultCollection/*/_apis/policy/configurations#POST+PUT+DELETE</li>
</ul>
<b>vso.code_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/git/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/*/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/limitedRefCriteria#PUT</li>
<li>/DefaultCollection/_apis/git/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/*/repositories#POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/limitedRefCriteria#PUT</li>
</ul>
<b>vso.code_full</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/v4.0/item.ashx</li>
<li>/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/DefaultCollection/Services/v4.0/item.ashx</li>
<li>/DefaultCollection/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/VersionControl/*/integration.asmx#POST</li>
<li>/VersionControl/*/repository.asmx#POST</li>
<li>/*/VersionControl/*/integration.asmx#POST</li>
<li>/*/VersionControl/*/repository.asmx#POST</li>
<li>/VersionControl/*/item.ashx#POST</li>
<li>/VersionControl/*/upload.ashx#POST</li>
<li>/*/VersionControl/*/item.ashx#POST</li>
<li>/*/VersionControl/*/upload.ashx#POST</li>
</ul>
<b>vso.code_status</b><br />
<ul>
<li>/DefaultCollection/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/commits/*/statuses#GET+POST</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/statuses#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/statuses#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/git/repositories/*/pullrequests/*/iterations/*/statuses#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/git/repositories/*/pullrequests/*/iterations/*/statuses#GET+POST+PATCH+DELETE</li>
</ul>
<b>vso.chat_write</b><br />
<ul>
<li>/DefaultCollection/_apis/chat/rooms#GET</li>
<li>/DefaultCollection/_apis/chat/rooms/*/messages#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/chat/rooms/*/users#GET+PUT+DELETE</li>
</ul>
<b>vso.chat_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/chat/rooms#GET+POST+PATCH+PUT+DELETE</li>
</ul>
<b>vso.agentpools</b><br />
<ul>
<li>/_apis/distributedtask/packages/agent#GET</li>
<li>/_apis/distributedtask/pools#GET</li>
<li>/_apis/distributedtask/pools/*/agents#GET</li>
<li>/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/_apis/distributedtask/queues#GET</li>
<li>/_apis/distributedtask/tasks#GET</li>
<li>/DefaultCollection/_apis/distributedtask/packages/agent#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/agents#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/DefaultCollection/_apis/distributedtask/queues#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/queues#GET</li>
<li>/DefaultCollection/_apis/distributedtask/tasks#GET</li>
</ul>
<b>vso.agentpools_manage</b><br />
<ul>
<li>/_apis/distributedtask/packages/agent#GET</li>
<li>/_apis/distributedtask/pools#DELETE+GET+PATCH+POST</li>
<li>/_apis/distributedtask/pools/*/agents#DELETE+GET+PATCH+POST+PUT</li>
<li>/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/_apis/distributedtask/queues#DELETE+GET+PATCH+POST+PUT</li>
<li>/_apis/distributedtask/tasks#DELETE+GET+PATCH+POST+PUT</li>
<li>/DefaultCollection/_apis/distributedtask/packages/agent#GET</li>
<li>/DefaultCollection/_apis/distributedtask/pools#DELETE+GET+PATCH+POST</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/agents#DELETE+GET+PATCH+POST+PUT</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/jobrequests#GET</li>
<li>/DefaultCollection/_apis/distributedtask/queues#DELETE+GET+PATCH+POST</li>
<li>/DefaultCollection/*/_apis/distributedtask/queues#DELETE+GET+PATCH+POST+PUT</li>
<li>/DefaultCollection/_apis/distributedtask/tasks#DELETE+GET+PATCH+POST+PUT</li>
</ul>
<b>vso.agentpools_listen</b><br />
<ul>
<li>/_apis/distributedtask/pools/*/jobrequests#GET+PATCH+DELETE</li>
<li>/_apis/distributedtask/pools/*/messages#GET+DELETE</li>
<li>/_apis/distributedtask/pools/*/sessions#GET+POST+DELETE</li>
<li>/_apis/distributedtask/pools/*/agents/*/updates#PUT</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/jobrequests#GET+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/messages#GET+DELETE</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/sessions#GET+POST+DELETE</li>
<li>/DefaultCollection/_apis/distributedtask/pools/*/agents/*/updates#PUT</li>
</ul>
<b>vso.governance.extension_write</b><br />
<ul>
<li>/_apis/governance/components#GET</li>
<li>/_apis/governance/products#GET</li>
<li>/_apis/governance/products/*/registrations/*/policyStatuses#PUT</li>
<li>/_apis/Governance/componentknowledgequeries#POST</li>
<li>/*/_apis/ComponentGovernance/components#GET</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories#GET</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policyStatuses#PUT</li>
<li>/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policyStatuses#PUT</li>
<li>/*/_apis/ComponentGovernance/componentknowledgequeries#POST</li>
<li>/_apis/ComponentGovernance/componentknowledgequeries#POST</li>
</ul>
<b>vso.governance</b><br />
<ul>
<li>/_apis/governance/*#GET</li>
<li>/_apis/governance/products/*/registrationcomponentQueries#POST</li>
<li>/*/_apis/ComponentGovernance/*#GET</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrationcomponentQueries#POST</li>
</ul>
<b>vso.governance_write</b><br />
<ul>
<li>/_apis/governance/products/*/snapshots#PATCH</li>
<li>/_apis/governance/products/*/registrationrequests#POST</li>
<li>/_apis/governance/products/*/registrations#PATCH</li>
<li>/_apis/governance/products/*/registrationbatch#POST+PATCH</li>
<li>/_apis/governance/products/*/registrations/*/policystatuses/*/retryrequest#POST</li>
<li>/_apis/governance/products/*/registrations/*/policystatuses#PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/snapshots#PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrationrequests#POST</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations#PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrationbatch#POST+PATCH</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policystatuses/*/retryrequest#POST</li>
<li>/*/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policystatuses#PATCH</li>
<li>/_apis/ComponentGovernance/GovernedRepositories/*/registrations/*/policystatuses#PATCH</li>
</ul>
<b>vso.governance_manage</b><br />
<ul>
<li>/_apis/governance/*#POST+PATCH+PUT+DELETE</li>
<li>/*/_apis/ComponentGovernance/*#POST+PATCH+PUT+DELETE</li>
<li>/_apis/ComponentGovernance/*#POST+PATCH+PUT+DELETE</li>
</ul>
<b>vso.packaging</b><br />
<ul>
<li>/DefaultCollection/_apis/clienttools/artifacttool/release#GET</li>
<li>/DefaultCollection/_apis/dedup/chunks/*#GET</li>
<li>/DefaultCollection/_apis/dedup/nodes/*#GET</li>
<li>/DefaultCollection/_apis/dedup/urls/*#POST</li>
<li>/DefaultCollection/_apis/packaging#HEAD+GET</li>
<li>/DefaultCollection/_packaging#HEAD+GET</li>
</ul>
<b>vso.packaging_write</b><br />
<ul>
<li>/DefaultCollection/_apis/dedup/chunks/*#PUT+POST</li>
<li>/DefaultCollection/_apis/dedup/nodes/*#PUT+POST</li>
<li>/DefaultCollection/_apis/packaging#HEAD+GET+POST+PUT</li>
<li>/DefaultCollection/_packaging#HEAD+GET+POST+PUT</li>
<li>/DefaultCollection/_packaging/*/nuget/v2#DELETE</li>
<li>/DefaultCollection/_packaging/*/npm#DELETE</li>
<li>/DefaultCollection/_apis/packaging/feeds/*/maven/groups/*/artifacts/*/versions#DELETE</li>
<li>/DefaultCollection/_apis/packaging/*/packages/*/versions#DELETE</li>
</ul>
<b>vso.packaging_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/packaging#HEAD+GET+PATCH+POST+PUT+DELETE</li>
<li>/DefaultCollection/_packaging#HEAD+GET+PATCH+POST+PUT+DELETE</li>
</ul>
<b>vso.oss</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/*#GET</li>
</ul>
<b>vso.oss_write</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/Requests#POST+PUT+PATCH</li>
<li>/DefaultCollection/_apis/oss/Versions#PATCH</li>
<li>/DefaultCollection/_apis/oss/Validation#POST</li>
</ul>
<b>vso.oss_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/*#POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.oss.extension_read</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/ExtensionData/*#GET</li>
</ul>
<b>vso.oss.extension_write</b><br />
<ul>
<li>/DefaultCollection/_apis/oss/ExtensionData/*#POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.test</b><br />
<ul>
<li>/DefaultCollection/_apis/test/suites#GET</li>
<li>/DefaultCollection/_apis/testplan/suites#GET</li>
<li>/DefaultCollection/*/_apis/test/plans#GET</li>
<li>/DefaultCollection/*/_apis/test/runs#GET</li>
<li>/DefaultCollection/*/_apis/test/extensionFields#GET</li>
<li>/DefaultCollection/*/_apis/test/suites#GET</li>
<li>/DefaultCollection/*/_apis/test/results#GET</li>
<li>/DefaultCollection/*/_apis/test/testSettings#GET</li>
<li>/DefaultCollection/*/_apis/test/codeCoverage#GET</li>
<li>/DefaultCollection/*/_apis/test/configurations#GET</li>
<li>/DefaultCollection/*/_apis/test/variables#GET</li>
<li>/DefaultCollection/*/_apis/test/cloneOperation#GET</li>
<li>/DefaultCollection/*/_apis/test/session#GET</li>
<li>/DefaultCollection/*/_apis/test/suiteEntry#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultRetentionSettings#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRelease#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByBuild#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRequirement#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultDetailsByRelease#GET</li>
<li>/DefaultCollection/*/_apis/test/ResultDetailsByBuild#GET</li>
<li>/DefaultCollection/*/_apis/test/TestMethods#GET</li>
<li>/DefaultCollection/*/_apis/test/Points#GET</li>
<li>/DefaultCollection/*/_apis/testresults/runs#GET</li>
<li>/DefaultCollection/*/_apis/testresults/extensionFields#GET</li>
<li>/DefaultCollection/*/_apis/testresults/results#GET</li>
<li>/DefaultCollection/*/_apis/testresults/testSettings#GET</li>
<li>/DefaultCollection/*/_apis/testresults/codeCoverage#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultRetentionSettings#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRelease#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByBuild#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRequirement#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultDetailsByRelease#GET</li>
<li>/DefaultCollection/*/_apis/testresults/ResultDetailsByBuild#GET</li>
<li>/DefaultCollection/*/_apis/testresults/TestMethods#GET</li>
<li>/DefaultCollection/*/_apis/testplan/plans#GET</li>
<li>/DefaultCollection/*/_apis/testplan/suites#GET</li>
<li>/DefaultCollection/*/_apis/testplan/configurations#GET</li>
<li>/DefaultCollection/*/_apis/testplan/variables#GET</li>
<li>/DefaultCollection/*/_apis/testplan/suiteEntry#GET</li>
<li>/DefaultCollection/*/*/_apis/test/session#GET</li>
</ul>
<b>vso.test_write</b><br />
<ul>
<li>/DefaultCollection/*/_apis/test/plans#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/suites#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/runs#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/results#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/extensionFields#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/testSettings#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/test/codeCoverage#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/configurations#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/variables#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/test/cloneOperation#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/session#GET+POST+PATCH</li>
<li>/DefaultCollection/*/_apis/test/suiteEntry#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/test/ResultRetentionSettings#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRelease#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/ResultSummaryByRequirement#GET+POST</li>
<li>/DefaultCollection/*/_apis/test/TestMethods#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/test/Points#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testresults/runs#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testresults/results#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/extensionFields#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/testSettings#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/testresults/codeCoverage#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/ResultRetentionSettings#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRelease#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/ResultSummaryByRequirement#GET+POST</li>
<li>/DefaultCollection/*/_apis/testresults/TestMethods#GET+POST+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/plans#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/suites#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/configurations#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/variables#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/testplan/suiteEntry#GET+PATCH</li>
<li>/DefaultCollection/*/*/_apis/test/session#GET+POST+PATCH</li>
</ul>
<b>vso.loadtest</b><br />
<ul>
<li>/_apis/clt/testdrops</li>
<li>/_apis/clt/testruns</li>
<li>/_apis/clt/testruns/*/errors</li>
<li>/_apis/clt/testruns/*/messages</li>
<li>/_apis/clt/testruns/*/results</li>
<li>/_apis/clt/testruns/*/counterinstances</li>
<li>/_apis/clt/testruns/*/countersamples</li>
<li>/_apis/clt/apm</li>
<li>/_apis/clt/configuration</li>
<li>/_apis/clt/agentgroups</li>
<li>/_apis/clt/agentgroups/*/agents</li>
</ul>
<b>vso.loadtest_write</b><br />
<ul>
<li>/_apis/clt/testdrops#GET+POST</li>
<li>/_apis/clt/testruns#GET+POST+PATCH</li>
<li>/_apis/clt/agentgroups#GET+POST+PATCH+DELETE</li>
<li>/_apis/clt/agentgroups/*/agents#GET+POST+PATCH+DELETE</li>
</ul>
<b>vso.licensing</b><br />
<ul>
<li>/_apis/licensing/clientrights</li>
<li>/_apis/licensing/ExtensionEntitlements/*/*#GET</li>
<li>/_apis/licensing/Usage#GET</li>
<li>/_apis/licensing/AccountAssignedExtensions#GET</li>
</ul>
<b>vso.extension</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions#GET</li>
</ul>
<b>vso.extension_manage</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/InstalledExtensionsByName#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensionsByName#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/RequestedExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/RequestedExtensions#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/AcquisitionOptions#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/AcquisitionOptions#GET</li>
<li>/_apis/ExtensionManagement/AcquisitionRequests#POST</li>
<li>/DefaultCollection/_apis/ExtensionManagement/AcquisitionRequests#POST</li>
</ul>
<b>vso.extension.data</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET</li>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET</li>
<li>/_apis/Contribution/InstalledApps#GET</li>
<li>/DefaultCollection/_apis/Contribution/InstalledApps#GET</li>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/*/ExtensionDataCollectionQuery#POST</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/*/ExtensionDataCollectionQuery#POST</li>
</ul>
<b>vso.extension.data_write</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/*/Data#GET+POST+PATCH+DELETE+PUT</li>
</ul>
<b>vso.extension.default</b><br />
<ul>
<li>/_apis/Contribution/InstalledApps#GET</li>
<li>/DefaultCollection/_apis/Contribution/InstalledApps#GET</li>
<li>/_apis/Contribution/nodes/query#POST</li>
<li>/DefaultCollection/_apis/Contribution/nodes/query#POST</li>
</ul>
<b>vso.extension.preview</b><br />
<ul>
<li>/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
<li>/DefaultCollection/_apis/ExtensionManagement/InstalledExtensions/*/Data#GET+POST+PATCH+DELETE+PUT</li>
</ul>
<b>vso.commerce.write</b><br />
<ul>
<li>/_apis/Commerce/*#GET+POST+PATCH+PUT</li>
<li>/_apis/Commerce/Subscription/*/*#GET+PUT+POST</li>
<li>/_apis/OfferMeter/*#GET+POST</li>
<li>/_apis/OfferMeter/OfferMeter/*#GET+POST</li>
<li>/_apis/OfferMeter/OfferMeterPrice/*#GET+PUT</li>
<li>/_apis/Meters/*#GET+PATCH</li>
<li>/_apis/Meters/Meters/*#GET+PATCH</li>
<li>/_apis/OfferSubscription/*#GET+POST+PATCH+PUT</li>
<li>/_apis/OfferSubscription/OfferSubscription/*#GET+POST+PATCH+PUT</li>
<li>/_apis/Subscription/Subscription/*/*#GET+PUT+POST+PATCH</li>
<li>/_apis/PurchaseRequest/PurchaseRequest/*#PUT+PATCH</li>
</ul>
<b>vso.gallery</b><br />
<ul>
<li>/_apis/gallery/publishers#GET</li>
<li>/_apis/gallery/extensions#GET</li>
</ul>
<b>vso.gallery_acquire</b><br />
<ul>
<li>/_apis/gallery/acquisitionrequests#POST</li>
<li>/_apis/gallery/acquisitionoptions#GET+POST</li>
</ul>
<b>vso.gallery_publish</b><br />
<ul>
<li>/_apis/gallery/publishers/*/extensions#POST+PUT+DELETE</li>
<li>/_apis/gallery/publisher/*/extension/*/accountsbyname#POST+DELETE</li>
<li>/_apis/gallery/extensions#POST+PUT+DELETE</li>
<li>/_apis/gallery/extensions/*/accounts#POST+DELETE</li>
</ul>
<b>vso.gallery_manage</b><br />
<ul>
<li>/_apis/gallery/publishers#POST+PUT+DELETE</li>
</ul>
<b>vso.entitlements</b><br />
<ul>
<li>/_apis/licensing/entitlements#GET</li>
</ul>
<b>preview_msdn_licensing</b><br />
<ul>
<li>/_apis/licensing/msdn/me</li>
</ul>
<b>user_impersonation</b><br />
<ul>
<li>/_signedin#GET+POST</li>
</ul>
<b>signout</b><br />
<ul>
<li>/_signout</li>
</ul>
<b>app_token</b><br />
<ul>
<li>/*#*</li>
</ul>
<b>vso.release</b><br />
<ul>
<li>/DefaultCollection/*/_apis/release/definitions#GET</li>
<li>/DefaultCollection/*/_apis/release/definitions/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/release/releases#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/workitems#GET</li>
<li>/DefaultCollection/*/_apis/release/approvals#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/manualInterventions#GET</li>
<li>/DefaultCollection/*/_apis/release/deployments#GET+POST</li>
<li>/DefaultCollection/*/_apis/release/artifacts/versions#GET</li>
<li>/DefaultCollection/*/_apis/release/environmenttemplates#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/hubs/release/plans#GET</li>
<li>/DefaultCollection/*/_apis/release/artifacts/inputvaluesquery#POST</li>
</ul>
<b>vso.release_execute</b><br />
<ul>
<li>/DefaultCollection/*/_apis/release/definitions#GET+POST+PUT</li>
<li>/DefaultCollection/*/_apis/release/definitions/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/release/releases#GET+POST+PATCH+PUT</li>
<li>/DefaultCollection/*/_apis/release/releases/*/workitems#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments#PATCH</li>
<li>/DefaultCollection/*/_apis/release/approvals#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/manualInterventions#GET</li>
<li>/DefaultCollection/*/_apis/release/environmenttemplates#GET+POST+PATCH</li>
<li>/DefaultCollection/*/_apis/release/gates#PATCH</li>
<li>/DefaultCollection/*/_apis/release/deployments#GET+POST</li>
<li>/DefaultCollection/*/_apis/release/artifacts/versions#GET+POST</li>
</ul>
<b>vso.release_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/release/definitions#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/release/definitions/*/revisions#GET</li>
<li>/DefaultCollection/*/_apis/release/releases#GET+POST+PATCH+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/release/releases/*/workitems#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments#PATCH</li>
<li>/DefaultCollection/*/_apis/release/approvals#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/release/releases/*/manualInterventions#GET+PATCH</li>
<li>/DefaultCollection/*/_apis/release/environmenttemplates#GET+POST+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/release/deployments#GET+POST</li>
</ul>
<b>vso.release_logs</b><br />
<ul>
<li>/DefaultCollection/*/_apis/release/releases/*/logs#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments/*/tasks/*/logs#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments/*/gates/*/tasks/*/logs#GET</li>
<li>/DefaultCollection/*/_apis/release/releases/*/environments/*/deployPhases/*/tasks/*/logs#GET</li>
</ul>
<b>vso.machinegroup_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/machinegroups/*#GET+POST+DELETE+PATCH</li>
<li>/DefaultCollection/*/_apis/distributedtask/deploymentgroups/*#GET+POST+DELETE+PATCH+PUT</li>
</ul>
<b>vso.live_updates</b><br />
<ul>
<li>/signalr#GET+POST</li>
<li>/_apis/*/signalr#GET+POST</li>
</ul>
<b>vso.taskgroups</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups/*/revisions#GET</li>
</ul>
<b>vso.taskgroups_add</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#POST</li>
</ul>
<b>vso.taskgroups_read</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#GET</li>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups/*/revisions#GET</li>
</ul>
<b>vso.taskgroups_write</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#POST</li>
</ul>
<b>vso.taskgroups_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/taskgroups#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.variablegroups_read</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/variablegroups#GET</li>
</ul>
<b>vso.variablegroups_write</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/variablegroups#POST</li>
</ul>
<b>vso.variablegroups_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/variablegroups#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.serviceendpoint</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/serviceendpoints#GET</li>
<li>/DefaultCollection/_apis/distributedtask/serviceendpointtypes#GET</li>
<li>/DefaultCollection/*/_apis/serviceendpoint/endpoints#GET</li>
<li>/DefaultCollection/_apis/serviceendpoint/types#GET</li>
</ul>
<b>vso.serviceendpoint_query</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/serviceendpointproxy#POST</li>
<li>/DefaultCollection/*/_apis/serviceendpoint/endpointproxy#POST</li>
</ul>
<b>vso.serviceendpoint_manage</b><br />
<ul>
<li>/DefaultCollection/*/_apis/distributedtask/serviceendpoints#GET+POST+PUT+DELETE</li>
<li>/DefaultCollection/*/_apis/serviceendpoint/endpoints#GET+POST+PUT+DELETE</li>
</ul>
<b>vso.drop</b><br />
<ul>
<li>/DefaultCollection/_apis/drop/client#HEAD</li>
<li>/DefaultCollection/_apis/blob/blobs/*#GET</li>
<li>/DefaultCollection/_apis/blob/blobsbatch#POST</li>
<li>/DefaultCollection/_apis/dedup/chunks/*#GET</li>
<li>/DefaultCollection/_apis/dedup/nodes/*#GET</li>
<li>/DefaultCollection/_apis/dedup/urls/*#POST</li>
<li>/DefaultCollection/_apis/drop/drop#OPTIONS</li>
<li>/DefaultCollection/_apis/drop/drop/*#GET</li>
<li>/DefaultCollection/_apis/drop/fetch/*#GET+POST</li>
<li>/DefaultCollection/_apis/drop/drops/*#OPTIONS+GET</li>
<li>/DefaultCollection/_apis/drop/manifests/*#OPTIONS+GET</li>
</ul>
<b>vso.drop_write</b><br />
<ul>
<li>/DefaultCollection/_apis/blob/blobs#OPTIONS</li>
<li>/DefaultCollection/_apis/blob/blobs/*#POST</li>
<li>/DefaultCollection/_apis/dedup/chunks/*#PUT+POST</li>
<li>/DefaultCollection/_apis/dedup/nodes/*#PUT+POST</li>
<li>/DefaultCollection/_apis/drop/drop/*#PUT+POST+PATCH</li>
<li>/DefaultCollection/_apis/drop/drops/*#OPTIONS+PUT+POST+PATCH</li>
<li>/DefaultCollection/_apis/drop/manifests/*#OPTIONS+POST</li>
</ul>
<b>vso.drop_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/drop/drop/*#DELETE</li>
<li>/DefaultCollection/_apis/drop/drops/*#DELETE</li>
</ul>
<b>vso.buildcache</b><br />
<ul>
<li>/_apis/buildcache/cachedeterminismguid/*#GET</li>
<li>/_apis/buildcache/contenthashlist#OPTIONS</li>
<li>/_apis/buildcache/contenthashlist/*#GET</li>
<li>/_apis/buildcache/selector#OPTIONS</li>
<li>/_apis/buildcache/selector/*#GET</li>
<li>/_apis/blob/blob/referencesbatch#POST</li>
</ul>
<b>vso.buildcache_write</b><br />
<ul>
<li>/_apis/buildcache/contenthashlist/*#POST</li>
<li>/_apis/buildcache/incorporateStrongFingeprint/*#PUT</li>
<li>/_apis/blob/blobs#OPTIONS</li>
<li>/_apis/blob/blobs/*#POST</li>
</ul>
<b>vso.authorization_grant</b><br />
<ul>
<li></li>
</ul>
<b>vso.project</b><br />
<ul>
<li>/DefaultCollection/_apis/projects#GET</li>
<li>/DefaultCollection/_apis/teams#GET</li>
</ul>
<b>vso.project_write</b><br />
<ul>
<li>/DefaultCollection/_apis/projects#PATCH</li>
</ul>
<b>vso.project_manage</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/_apis/projects#POST+DELETE</li>
<li>/Services/*/CommonStructureService.asmx#POST</li>
<li>/*/Services/*/CommonStructureService.asmx#POST</li>
<li>/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
<li>/*/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
<li>/*/*/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
<li>/*/*/*/TeamFoundation/Administration/*/CatalogService.asmx#POST</li>
</ul>
<b>vso.symbols</b><br />
<ul>
<li>/DefaultCollection/_apis/symbol/symsrv#OPTIONS</li>
<li>/DefaultCollection/_apis/symbol/symsrv/*#GET</li>
<li>/DefaultCollection/_apis/symbol/debugentries#OPTIONS</li>
<li>/DefaultCollection/_apis/symbol/debugentries/*#GET</li>
<li>/DefaultCollection/_apis/symbol/requests#OPTIONS+GET</li>
</ul>
<b>vso.symbols_write</b><br />
<ul>
<li>/DefaultCollection/_apis/symbol/requests#POST</li>
<li>/DefaultCollection/_apis/symbol/requests/*#POST+PATCH</li>
<li>/DefaultCollection/_apis/blob/blobs#OPTIONS</li>
<li>/DefaultCollection/_apis/blob/blobs/*#POST</li>
</ul>
<b>vso.symbols_manage</b><br />
<ul>
<li>/DefaultCollection/_apis/symbol/requests/*#DELETE</li>
</ul>
<b>vso.analytics</b><br />
<ul>
<li>/DefaultCollection/_odata/*#GET</li>
<li>/DefaultCollection/*/_odata/*#GET</li>
<li>/_odata/*/$batch#POST</li>
<li>/_odata/$batch#POST</li>
<li>/DefaultCollection/*/_apis/analytics/views#GET</li>
<li>/DefaultCollection/_apis/Favorite/Favorites#GET</li>
</ul>
<b>vso.identitypicker</b><br />
<ul>
<li>/_apis/IdentityPicker/identities#POST</li>
<li>/_apis/IdentityPicker/identities/*/avatar#GET</li>
<li>/DefaultCollection/_apis/IdentityPicker/identities#POST</li>
<li>/DefaultCollection/_apis/IdentityPicker/identities/*/avatar#GET</li>
</ul>
<b>vso.dashboards</b><br />
<ul>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards#HEAD+GET</li>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards/*/widgets#HEAD+GET</li>
</ul>
<b>vso.dashboards_manage</b><br />
<ul>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards#HEAD+GET+POST+DELETE</li>
<li>/DefaultCollection/*/*/_apis/dashboard/dashboards/*/widgets#HEAD+GET+POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.connected_server</b><br />
<ul>
<li>/_apis/Commerce/CommercePackage#GET</li>
<li>/_apis/Commerce/CommercePackage/*#GET</li>
</ul>
<b>vso.notification</b><br />
<ul>
<li>/_apis/notification/EventTypes#GET</li>
<li>/_apis/notification/EventTypes/*/fieldValuesQuery#POST</li>
<li>/_apis/notification/Subscriptions#GET</li>
<li>/_apis/notification/SubscriptionQuery#POST</li>
<li>/_apis/notification/Follows#GET</li>
<li>/_apis/notification/SubscriptionTemplates#GET</li>
<li>/_apis/notification/StatisticsQuery#POST</li>
<li>/_apis/notification/subscribers#GET</li>
<li>/_apis/notification/EventTransforms#POST</li>
<li>/DefaultCollection/_apis/notification/EventTypes#GET</li>
<li>/DefaultCollection/_apis/notification/EventTypes/*/fieldValuesQuery#POST</li>
<li>/DefaultCollection/_apis/notification/Subscriptions#GET</li>
<li>/DefaultCollection/_apis/notification/SubscriptionQuery#POST</li>
<li>/DefaultCollection/_apis/notification/Follows#GET</li>
<li>/DefaultCollection/_apis/notification/SubscriptionTemplates#GET</li>
<li>/DefaultCollection/_apis/notification/StatisticsQuery#POST</li>
<li>/DefaultCollection/_apis/notification/subscribers#GET</li>
<li>/DefaultCollection/_apis/notification/EventTransforms#POST</li>
</ul>
<b>vso.notification_write</b><br />
<ul>
<li>/_apis/notification/Subscriptions#GET+PATCH+POST+DELETE+PUT</li>
<li>/DefaultCollection/_apis/notification/Subscriptions#GET+PATCH+POST+DELETE+PUT</li>
<li>/_apis/notification/SubscriptionEvaluationRequests#GET+POST</li>
<li>/DefaultCollection/_apis/notification/SubscriptionEvaluationRequests#GET+POST</li>
<li>/_apis/notification/Follows#GET+POST+DELETE</li>
<li>/DefaultCollection/_apis/notification/Follows#GET+POST+DELETE</li>
<li>/_apis/notification/subscribers#GET+PATCH</li>
<li>/DefaultCollection/_apis/notification/subscribers#GET+PATCH</li>
</ul>
<b>vso.notification_manage</b><br />
<ul>
<li>/_apis/notification/BatchNotificationOperations#POST</li>
<li>/DefaultCollection/_apis/notification/BatchNotificationOperations#POST</li>
</ul>
<b>vso.notification_publish</b><br />
<ul>
<li>/_apis/notification/Events#POST</li>
<li>/DefaultCollection/_apis/notification/Events#POST</li>
</ul>
<b>vso.settings</b><br />
<ul>
<li>/_apis/Settings/*#GET</li>
<li>/DefaultCollection/_apis/Settings/*#GET</li>
</ul>
<b>vso.settings_write</b><br />
<ul>
<li>/_apis/Settings/*#GET+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/Settings/*#GET+PUT+PATCH+DELETE</li>
</ul>
<b>vso.features</b><br />
<ul>
<li>/_apis/FeatureManagement/*#GET</li>
<li>/DefaultCollection/_apis/FeatureManagement/*#GET</li>
<li>/_apis/FeatureManagement/FeatureStatesQuery/*#POST</li>
<li>/DefaultCollection/_apis/FeatureManagement/FeatureStatesQuery/*#POST</li>
</ul>
<b>vso.features_write</b><br />
<ul>
<li>/_apis/FeatureManagement/*#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/_apis/FeatureManagement/*#GET+POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.proxy</b><br />
<ul>
<li>/Services/v4.0/item.ashx</li>
<li>/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/TeamFoundation/Administration/v3.0/LocationService.asmx#POST</li>
<li>/Services/v3.0/LocationService.asmx#POST</li>
<li>/DefaultCollection/Services/v4.0/item.ashx</li>
<li>/DefaultCollection/Services/v4.0/FileHandlerService.asmx#POST</li>
<li>/DefaultCollection/Services/v3.0/LocationService.asmx#POST</li>
<li>/*/*/*/_git/*#GET</li>
<li>/*/*/_git/*#GET</li>
<li>/*/_git/*#GET</li>
<li>/*/*/*/_git/_full/*#GET</li>
<li>/*/*/_git/_full/*#GET</li>
<li>/*/_git/_full/*#GET</li>
<li>/*/*/*/_git/*/git-upload-pack#POST</li>
<li>/*/*/_git/*/git-upload-pack#POST</li>
<li>/*/_git/*/git-upload-pack#POST</li>
<li>/*/*/*/_git/_full/*/git-upload-pack#POST</li>
<li>/*/*/_git/_full/*/git-upload-pack#POST</li>
<li>/*/_git/_full/*/git-upload-pack#POST</li>
<li>/*/*/*/_git/*/gvfs/*#POST</li>
<li>/*/*/_git/*/gvfs/*#POST</li>
<li>/*/_git/*/gvfs/*#POST</li>
<li>/*/*/*/_git/_full/*/gvfs/*#POST</li>
<li>/*/*/_git/_full/*/gvfs/*#POST</li>
<li>/*/_git/_full/*/gvfs/*#POST</li>
</ul>
<b>vso.graph</b><br />
<ul>
<li>/_apis/graph/descriptors/*#GET</li>
<li>/_apis/graph/groups/*#GET</li>
<li>/_apis/graph/subjectlookup#POST</li>
<li>/_apis/graph/memberships/*#GET</li>
<li>/_apis/graph/memberships/*/*#GET+HEAD</li>
<li>/_apis/graph/membershipstates/*#GET</li>
<li>/_apis/graph/storagekeys/*#GET</li>
<li>/_apis/graph/scopes/*#GET</li>
<li>/_apis/graph/subjects/*#GET</li>
<li>/_apis/graph/users/*#GET</li>
<li>/*/_apis/graph/descriptors/*#GET</li>
<li>/*/_apis/graph/groups/*#GET</li>
<li>/*/_apis/graph/subjectlookup#POST</li>
<li>/*/_apis/graph/memberships/*#GET</li>
<li>/*/_apis/graph/memberships/*/*#GET+HEAD</li>
<li>/*/_apis/graph/membershipstates/*#GET</li>
<li>/*/_apis/graph/storagekeys/*#GET</li>
<li>/*/_apis/graph/scopes/*#GET</li>
<li>/*/_apis/graph/subjects/*#GET</li>
<li>/*/_apis/graph/users/*#GET</li>
</ul>
<b>vso.graph_manage</b><br />
<ul>
<li>/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/users/*#POST+DELETE</li>
<li>/*/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/*/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/users/*#POST+DELETE</li>
</ul>
<b>vso.graph_write</b><br />
<ul>
<li>/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/_apis/graph/users/*#POST+DELETE</li>
<li>/*/_apis/graph/groups/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/memberships/*/*#PUT+DELETE</li>
<li>/*/_apis/graph/scopes/*#POST+PATCH+DELETE</li>
<li>/*/_apis/graph/users/*#POST+DELETE</li>
</ul>
<b>vso.security_manage</b><br />
<ul>
<li>/Services/*/LocationService.asmx#POST</li>
<li>/*/Services/*/LocationService.asmx#POST</li>
<li>/DefaultCollection/*/Services/*/LocationService.asmx#POST</li>
<li>/*/Administration/*/LocationService.asmx#POST</li>
<li>/Services/*/Registration.asmx#POST</li>
<li>/*/Services/*/Registration.asmx#POST</li>
<li>/*/*/Administration/*/LocationService.asmx#POST</li>
<li>/_apis/SecurityNamespaces#POST</li>
<li>/_apis/AccessControlLists#POST+DELETE</li>
<li>/_apis/AccessControlEntries#POST+DELETE</li>
<li>/_apis/Permissions#DELETE</li>
<li>/DefaultCollection/_apis/SecurityNamespaces#POST</li>
<li>/DefaultCollection/_apis/AccessControlLists#POST+DELETE</li>
<li>/DefaultCollection/_apis/AccessControlEntries#POST+DELETE</li>
<li>/DefaultCollection/_apis/Permissions#DELETE</li>
<li>/_apis/securityroles/scopes/*/roleassignments/resources/*#POST+PUT+DELETE</li>
<li>/DefaultCollection/_apis/securityroles/scopes/*/roleassignments/resources/*#POST+PUT+DELETE</li>
<li>/Services/*/SecurityService.asmx#POST</li>
<li>/*/Services/*/SecurityService.asmx#POST</li>
<li>/Services/*/GroupSecurityService.asmx#POST</li>
<li>/*/Services/*/GroupSecurityService.asmx#POST</li>
</ul>
<b>vso.memberentitlementmanagement</b><br />
<ul>
<li>/_apis/MemberEntitlements/*#GET</li>
<li>/_apis/MemberEntitlements#GET</li>
<li>/_apis/GroupEntitlements/*#GET</li>
<li>/_apis/GroupEntitlements#GET</li>
<li>/_apis/UserEntitlements/*#GET</li>
<li>/_apis/UserEntitlements#GET</li>
<li>/_apis/UserEntitlementSummary#GET</li>
<li>/DefaultCollection/_apis/MemberEntitlements/*#GET</li>
<li>/DefaultCollection/_apis/MemberEntitlements#GET</li>
<li>/DefaultCollection/_apis/GroupEntitlements/*#GET</li>
<li>/DefaultCollection/_apis/GroupEntitlements#GET</li>
<li>/DefaultCollection/_apis/UserEntitlements/*#GET</li>
<li>/DefaultCollection/_apis/UserEntitlements#GET</li>
<li>/DefaultCollection/_apis/UserEntitlementSummary#GET</li>
</ul>
<b>vso.memberentitlementmanagement_write</b><br />
<ul>
<li>/_apis/MemberEntitlements/*#PATCH+DELETE</li>
<li>/_apis/MemberEntitlements#POST</li>
<li>/_apis/GroupEntitlements/*#PATCH+DELETE</li>
<li>/_apis/GroupEntitlements#POST</li>
<li>/_apis/UserEntitlements/*#PATCH+DELETE</li>
<li>/_apis/UserEntitlements#PATCH+POST</li>
<li>/DefaultCollection/_apis/MemberEntitlements/*#PATCH+DELETE</li>
<li>/DefaultCollection/_apis/MemberEntitlements#POST</li>
<li>/DefaultCollection/_apis/GroupEntitlements/*#PATCH+DELETE</li>
<li>/DefaultCollection/_apis/GroupEntitlements#POST</li>
<li>/DefaultCollection/_apis/UserEntitlements/*#PATCH+DELETE</li>
<li>/DefaultCollection/_apis/UserEntitlements#PATCH+POST</li>
</ul>
<b>vso.wiki</b><br />
<ul>
<li>/DefaultCollection/_apis/wiki/wikis#GET</li>
<li>/DefaultCollection/*/_apis/wiki/wikis#GET</li>
<li>/_apis/search/wikiSearchResults#POST</li>
<li>/DefaultCollection/_apis/search/wikiSearchResults#POST</li>
<li>/DefaultCollection/*/_apis/search/wikiSearchResults#POST</li>
</ul>
<b>vso.wiki_write</b><br />
<ul>
<li>/DefaultCollection/_apis/wiki/wikis#GET+POST+PUT+PATCH+DELETE</li>
<li>/DefaultCollection/*/_apis/wiki/wikis#GET+POST+PUT+PATCH+DELETE</li>
</ul>
<b>vso.teams_integration</b><br />
<ul>
<li>/_teams/configure#GET</li>
<li>/_teams/configure#POST</li>
</ul>
<b>vso.notification_diagnostics</b><br />
<ul>
<li>/_apis/notification/subscriptions/*/diagnostics#GET+PUT</li>
<li>/DefaultCollection/_apis/notification/subscriptions/*/diagnostics#GET+PUT</li>
<li>/_apis/notification/DiagnosticLogs#GET</li>
<li>/DefaultCollection/_apis/notification/DiagnosticLogs#GET</li>
</ul>
<b>vso.workitemsearch</b><br />
<ul>
<li>/_apis/search/workItemQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/workItemQueryResults#POST</li>
</ul>
<b>vso.codesearch</b><br />
<ul>
<li>/_apis/search/codeQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/codeQueryResults#POST</li>
<li>/_apis/search/codeAdvancedQueryResults#POST</li>
<li>/DefaultCollection/_apis/search/codeAdvancedQueryResults#POST</li>
</ul>
<b>vso.tokenadministration</b><br />
<ul>
<li>/DefaultCollection/_apis/tokenadmin/revocations#POST</li>
<li>/DefaultCollection/_apis/tokenadmin/revocationrules#POST</li>
<li>/DefaultCollection/_apis/tokenadmin/personalaccesstokens/*#GET</li>
<li>/_apis/tokenadministration/tokenrevocations#POST</li>
<li>/_apis/tokenadministration/tokenlistglobalidentities#POST</li>
<li>/_apis/tokenadministration/tokenpersonalaccesstokens/*#POST</li>
</ul>
<b>vso.tokens</b><br />
<ul>
<li>/_apis/token/AppTokenPairs#POST</li>
<li>/_apis/token/AadUserTokens#POST</li>
<li>/_apis/token/AccessTokens/*#POST+GET</li>
<li>/_apis/token/AppSessionTokens#POST</li>
<li>/_apis/token/SessionTokens#GET+POST+DELETE</li>
<li>/_apis/token/AadAppTokens#GET</li>
<li>/_apis/delegatedauth/Registration#GET+PUT+POST+DELETE</li>
<li>/_apis/delegatedauth/RegistrationSecret/*#GET</li>
<li>/_apis/delegatedauth/Authorizations#GET+POST</li>
<li>/_apis/delegatedauth/HostAuthorization#GET+DELETE+POST</li>
<li>/_apis/oauth2/token#POST</li>
<li>/_apis/tokenissue/AppTokenPairs#POST</li>
<li>/_apis/tokenissue/AadUserTokens#POST</li>
<li>/_apis/tokenissue/AccessTokens/*#POST</li>
<li>/_apis/tokenissue/AppSessionTokens#POST</li>
<li>/_apis/tokenissue/SessionTokens#GET+PUT+POST+DELETE</li>
<li>/_apis/tokenissue/AadAppTokens#GET</li>
<li>/_apis/tokenauth/Registration#GET+PUT+POST+DELETE</li>
<li>/_apis/tokenauth/RegistrationSecret/*#GET</li>
<li>/_apis/tokenauth/Authorizations#GET+POST+DELETE</li>
<li>/_apis/tokenauth/HostAuthorization#GET+DELETE+PATCH</li>
<li>/_apis/tokenoauth2/token#POST</li>
</ul>
<b>vso.auditlog</b><br />
<ul>
<li>/_apis/audit/auditlog#GET</li>
<li>/_apis/audit/downloadlog#GET</li>
</ul>
Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0tag:blogger.com,1999:blog-5153017404988595328.post-40391967780949271722019-03-25T10:56:00.001-04:002020-07-31T12:18:19.977-04:00TFS 2019 and commitment issuesMy JavaScript TFS extensions broke in <strike>TFS</strike> Azure DevOps 2019. All my complaints about TFS API surface being underdocumented came to their logical conclusion: no docs means no API commitment, no commitment means the team behind the API gets to make breaking changes with no guilt.<br />
<br />
Let me count the ways things broke:<span><a name='more'></a></span><br />
<h3>
Uncategorised extensions</h3>
<span style="font-family: "courier new", courier, monospace;">Categories</span> used to be an optional field in the manifest. It's required now.<br />
<h3>
Registering context menu commands</h3>
It used to be that the first argument of <span style="font-family: "courier new", courier, monospace;">VSS.register()</span> had to match the contribution ID. Now it has to match a brand new contribution property from the manifest, <span style="font-family: "courier new", courier, monospace;">registeredObjectId</span>.<br />
<h3>
jQuery</h3>
Used to be that jQuery's $ global object was available to JavaScript extension code from the get-go. Now you have to call <span style="font-family: "courier new", courier, monospace;">VSS.require()</span> for it to become available. In my case, I require VSS/Service, that's apparently sufficient.<br />
<h3>
CORS</h3>
Used to be that jQuery AJAX calls to non-TFS REST services from the extension would have an Origin header for CORS compliance. Not anymore. Tested on Chrome and MSIE.<br />
<h3>
Page refresh</h3>
<div>
Used to be that the argument to the custom context menu command implementation would have a <span style="font-family: "courier new", courier, monospace;">view</span> property with a <span style="font-family: "courier new", courier, monospace;">refresh()</span> method. Not anymore. You can refresh the page by calling <span style="font-family: "courier new", courier, monospace;">reload()</span> on the navigation service object, which can be obtained asynchronously via <span style="font-family: "courier new", courier, monospace;">VSS.getService(VSS.ServiceIds.Navigation).</span><br />
<span style="font-family: "courier new", courier, monospace;"><br /></span></div>
<hr />
Some features didn't break per se:<br />
<h3>
Custom release summary sections</h3>
The release summary screen as we know it is gone, but there's still a release summary UI in the right-hand panel, it opens up once you click on a release box. The custom sections, as provided by extensions, are there and open up once you click them. In other words, they didn't disappear altogether, but they're two clicks away now.<br />
<br />
Despite the claims in <a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/preview/new-release-summary?view=azure-devops&viewFallbackFrom=vsts">this document from October 2018</a>, the legacy contributions of type "release summary section" don't need any re-engineering. They work like they used to, modulo the placement.<br />
<h3>
SOAP notifications</h3>
Not JavaScript extension related, but it's a part of my tooling, too. For collection-level notification subscriptions, the SOAP option is quietly gone. The subscription records that existed before the upgrade do show up and are delivered, but for new subscriptions, the SOAP option is no longer available.<br />
<br />
There's a REST API for creating subscriptions programmatically, and there are several options for the delivery channel there, <a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.services.notifications.webapi.soapsubscriptionchannel?view=azure-devops-dotnet">SOAP included</a>, so chances are, it's not entirely out.<br />
<br />Seva Alekseyevhttp://www.blogger.com/profile/09837468549743030153noreply@blogger.com0