[{"data":1,"prerenderedAt":4866},["ShallowReactive",2],{"navigation_docs":3,"-sdks-server-dotnet":148,"-sdks-server-dotnet-surround":4090,"sdks\u002Fdotnet\u002Finstall":4093,"sdks\u002Fdotnet\u002Fconfigure":4179,"sdks\u002Fdotnet\u002Fsimple-usage":4284,"sdks\u002Fdotnet\u002Fuser-context":4560},[4,30,138],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":16,"path":17,"stem":18,"icon":19},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":21,"path":22,"stem":23,"icon":24},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":26,"path":27,"stem":28,"icon":29},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":31,"defaultOpen":32,"path":33,"stem":34,"children":35,"page":6},"SDKs",true,"\u002Fsdks","2.sdks",[36,41,67,92,108],{"title":37,"path":38,"stem":39,"icon":40},"Available SDKs","\u002Fsdks\u002Favailable-sdks","2.sdks\u002F1.available-sdks","i-lucide-list",{"title":42,"icon":43,"defaultOpen":32,"path":44,"stem":45,"children":46,"page":6},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","2.sdks\u002F2.browser",[47,52,57,62],{"title":48,"path":49,"stem":50,"icon":51},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","2.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":53,"path":54,"stem":55,"icon":56},"React","\u002Fsdks\u002Fbrowser\u002Freact","2.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":58,"path":59,"stem":60,"icon":61},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","2.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":63,"path":64,"stem":65,"icon":66},"OpenFeature Web","\u002Fsdks\u002Fbrowser\u002Fopenfeature-web","2.sdks\u002F2.browser\u002F4.openfeature-web","cd-logos-openfeature",{"title":68,"icon":69,"defaultOpen":32,"path":70,"stem":71,"children":72,"page":6},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","2.sdks\u002F3.mobile",[73,77,82,87],{"title":74,"path":75,"stem":76,"icon":56},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","2.sdks\u002F3.mobile\u002F1.react-native",{"title":78,"path":79,"stem":80,"icon":81},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","2.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":83,"path":84,"stem":85,"icon":86},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","2.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":88,"path":89,"stem":90,"icon":91},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","2.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":93,"icon":94,"defaultOpen":32,"path":95,"stem":96,"children":97,"page":6},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","2.sdks\u002F4.meta",[98,103],{"title":99,"path":100,"stem":101,"icon":102},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","2.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":104,"path":105,"stem":106,"icon":107},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","2.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":109,"icon":110,"defaultOpen":32,"path":111,"stem":112,"children":113,"page":6},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","2.sdks\u002F5.server",[114,119,123,128,133],{"title":115,"path":116,"stem":117,"icon":118},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","2.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":120,"path":121,"stem":122,"icon":66},"OpenFeature Node.js","\u002Fsdks\u002Fserver\u002Fopenfeature-node","2.sdks\u002F5.server\u002F2.openfeature-node",{"title":124,"path":125,"stem":126,"icon":127},"Python","\u002Fsdks\u002Fserver\u002Fpython","2.sdks\u002F5.server\u002F3.python","cd-logos-python",{"title":129,"path":130,"stem":131,"icon":132},"Java","\u002Fsdks\u002Fserver\u002Fjava","2.sdks\u002F5.server\u002F4.java","cd-logos-java",{"title":134,"path":135,"stem":136,"icon":137},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","2.sdks\u002F5.server\u002F5.dotnet","cd-logos-dotnet",{"title":139,"defaultOpen":32,"path":140,"stem":141,"children":142,"page":6},"Integrations","\u002Fintegrations","3.integrations",[143],{"title":144,"path":145,"stem":146,"icon":147},"Terraform","\u002Fintegrations\u002Fterraform","3.integrations\u002F1.terraform","cd-logos-terraform",{"id":149,"title":150,"body":151,"description":262,"extension":4084,"links":4085,"meta":4086,"navigation":4087,"path":135,"seo":4088,"stem":136,"__hash__":4089},"docs\u002F2.sdks\u002F5.server\u002F5.dotnet.md",".NET Server SDK",{"type":152,"value":153,"toc":4055},"minimark",[154,158,164,169,173,185,188,201,205,212,216,220,234,237,241,255,294,299,313,328,335,341,482,488,503,555,562,642,647,650,747,878,883,886,889,892,926,1012,1016,1026,1148,1151,1320,1324,1327,1330,1372,1375,1420,1424,1438,1611,1627,1633,1637,1640,1647,1650,1655,1707,1881,1885,1899,1905,2071,2080,2084,2087,2092,2101,2107,2110,2116,2126,2129,2135,2138,2144,2147,2151,2154,2167,2170,2372,2384,2387,2390,2395,2401,2411,2415,2422,2516,2522,2526,2607,2610,2690,2693,2726,2747,2754,2760,2766,2811,2817,2858,2865,2875,2879,2885,2978,2985,3184,3187,3212,3215,3219,3222,3231,3273,3276,3401,3405,3414,3570,3580,3816,3828,3836,3840,3909,3924,3927,4032,4051],[155,156],"div",{"hidden":32,"dataTitleIcon":157},"dotnet",[159,160],"external-badges",{"package-url":161,"registry":162,"repo":163},"https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FConfigDirector.ServerSdk","nuget","dotnet-sdks",[165,166,168],"h2",{"id":167},"introduction","Introduction",[170,171,172],"p",{},"The .NET Server SDK is a server-side SDK that evaluates configs and their targeting rules. Upon initialization, it retrieves configs and targeting rules from ConfigDirector services. From that point on, it evaluates configs locally for any user context, and receives updates via server sent events (SSE) when configs are updated on the dashboard or via the admin API.",[170,174,175,176,180,181,184],{},"The SDK targets ",[177,178,179],"code",{},"net8.0"," and ",[177,182,183],{},"netstandard2.0",", so it runs on .NET 8 and later as well as on .NET Framework 4.6.2 and later.",[170,186,187],{},"The client is thread safe. Create one instance when your application starts, share it for the lifetime of the process, and dispose it on shutdown. Evaluations read config state the client already holds in memory, so they make no network calls on the request path.",[170,189,190,191,194,195,200],{},"In an ASP.NET Core application, the companion ",[177,192,193],{},"ConfigDirector.ServerSdk.AspNetCore"," package does that wiring for you: registration, configuration binding, startup initialization, and disposal. Everything on this page applies either way, see ",[196,197,199],"a",{"href":198},"#aspnet-core","ASP.NET Core"," further below.",[165,202,204],{"id":203},"installation","Installation",[170,206,207,208],{},"The SDK can be installed from NuGet: ",[196,209,161],{"href":161,"rel":210},[211],"nofollow",[213,214],"content-partial",{"name":215},"sdks\u002Fdotnet\u002Finstall",[165,217,219],{"id":218},"configure-and-initialize-the-client","Configure and initialize the client",[221,222,223,231],"ol",{},[224,225,226,227,230],"li",{},"Create an instance of the client providing your server SDK key. You can retrieve a server SDK key under your project settings in the ",[177,228,229],{},"Environments & SDK Keys"," tab.",[224,232,233],{},"Initialize the client to initiate its connection lifecycle.",[213,235],{"name":236},"sdks\u002Fdotnet\u002Fconfigure",[238,239,240],"warning",{},"Server SDK keys are secret values. Do not commit them to your source code repository. Provide them at runtime via environment variables instead.",[170,242,243,246,247,250,251,254],{},[177,244,245],{},"InitializeAsync"," completes when the initial config state arrives or the configured timeout elapses, and it never throws on a connection failure. Check ",[177,248,249],{},"IsReady"," to find out whether config state actually arrived. It also accepts a ",[177,252,253],{},"CancellationToken"," to abandon the wait:",[256,257,263],"pre",{"className":258,"code":259,"filename":260,"language":261,"meta":262,"style":262},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","await client.InitializeAsync(cancellationToken);\n","ConfigDirectorSetup.cs","csharp","",[177,264,265],{"__ignoreMap":262},[266,267,270,274,278,282,285,288,291],"span",{"class":268,"line":269},"line",1,[266,271,273],{"class":272},"smGrS","await",[266,275,277],{"class":276},"su5hD"," client",[266,279,281],{"class":280},"sP7_E",".",[266,283,245],{"class":284},"sGLFI",[266,286,287],{"class":280},"(",[266,289,290],{"class":276},"cancellationToken",[266,292,293],{"class":280},");\n",[295,296,298],"h3",{"id":297},"additional-configuration-options","Additional configuration options",[170,300,301,302,305,306,180,309,312],{},"Options are supplied through a ",[177,303,304],{},"ConfigDirectorClientOptions"," passed to the constructor. ",[177,307,308],{},"Connection",[177,310,311],{},"Telemetry"," are get-only, so they are populated with a nested object initializer. Options are read once when the client is built; changing them afterwards has no effect.",[170,314,315,316,319,320,323,324,327],{},"Each setting is validated as it is assigned, so an unusable value throws an ",[177,317,318],{},"ArgumentOutOfRangeException"," (or an ",[177,321,322],{},"ArgumentException"," for a relative ",[177,325,326],{},"Url",") at the line that wrote it rather than as a client that quietly never updates.",[329,330,332],"h4",{"id":331},"metadata",[177,333,334],{},"Metadata",[170,336,337,338,340],{},"The ",[177,339,334],{}," option allows you to provide your application's name and version. These values can be used in targeting rules conditionals. For example, if a certain feature should only be enabled starting with a certain version of your application.",[256,342,344],{"className":258,"code":343,"filename":260,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nvar client = new ConfigDirectorClient(\"YOUR-SERVER-SDK-KEY\", new ConfigDirectorClientOptions\n{\n    Metadata = new Metadata { AppName = \"YOUR-APP-NAME\", AppVersion = \"1.0.2\" },\n});\n\nawait client.InitializeAsync();\n",[177,345,346,359,365,404,410,457,463,468],{"__ignoreMap":262},[266,347,348,352,356],{"class":268,"line":269},[266,349,351],{"class":350},"sw1J6","using",[266,353,355],{"class":354},"sfCm-"," ConfigDirector",[266,357,358],{"class":280},";\n",[266,360,362],{"class":268,"line":361},2,[266,363,364],{"emptyLinePlaceholder":32},"\n",[266,366,368,372,375,378,381,384,386,390,394,396,399,401],{"class":268,"line":367},3,[266,369,371],{"class":370},"sG8yY","var",[266,373,277],{"class":374},"sbgvK",[266,376,377],{"class":272}," =",[266,379,380],{"class":272}," new",[266,382,383],{"class":374}," ConfigDirectorClient",[266,385,287],{"class":280},[266,387,389],{"class":388},"sjJ54","\"",[266,391,393],{"class":392},"s_sjI","YOUR-SERVER-SDK-KEY",[266,395,389],{"class":388},[266,397,398],{"class":280},",",[266,400,380],{"class":272},[266,402,403],{"class":374}," ConfigDirectorClientOptions\n",[266,405,407],{"class":268,"line":406},4,[266,408,409],{"class":280},"{\n",[266,411,413,416,419,421,424,427,430,432,435,438,440,442,445,447,449,452,454],{"class":268,"line":412},5,[266,414,415],{"class":276},"    Metadata ",[266,417,418],{"class":272},"=",[266,420,380],{"class":272},[266,422,423],{"class":374}," Metadata",[266,425,426],{"class":280}," {",[266,428,429],{"class":276}," AppName ",[266,431,418],{"class":272},[266,433,434],{"class":388}," \"",[266,436,437],{"class":392},"YOUR-APP-NAME",[266,439,389],{"class":388},[266,441,398],{"class":280},[266,443,444],{"class":276}," AppVersion ",[266,446,418],{"class":272},[266,448,434],{"class":388},[266,450,451],{"class":392},"1.0.2",[266,453,389],{"class":388},[266,455,456],{"class":280}," },\n",[266,458,460],{"class":268,"line":459},6,[266,461,462],{"class":280},"});\n",[266,464,466],{"class":268,"line":465},7,[266,467,364],{"emptyLinePlaceholder":32},[266,469,471,473,475,477,479],{"class":268,"line":470},8,[266,472,273],{"class":272},[266,474,277],{"class":276},[266,476,281],{"class":280},[266,478,245],{"class":284},[266,480,481],{"class":280},"();\n",[329,483,485],{"id":484},"loggerfactory",[177,486,487],{},"LoggerFactory",[170,489,490,491,494,495,498,499,502],{},"The SDK logs through ",[177,492,493],{},"Microsoft.Extensions.Logging",". It defaults to ",[177,496,497],{},"NullLoggerFactory",", which discards everything, so pass your application's own ",[177,500,501],{},"ILoggerFactory"," to route the SDK's output through your logging pipeline:",[256,504,506],{"className":258,"code":505,"filename":260,"language":261,"meta":262,"style":262},"var client = new ConfigDirectorClient(\"YOUR-SERVER-SDK-KEY\", new ConfigDirectorClientOptions\n{\n    LoggerFactory = loggerFactory,\n});\n",[177,507,508,534,538,551],{"__ignoreMap":262},[266,509,510,512,514,516,518,520,522,524,526,528,530,532],{"class":268,"line":269},[266,511,371],{"class":370},[266,513,277],{"class":374},[266,515,377],{"class":272},[266,517,380],{"class":272},[266,519,383],{"class":374},[266,521,287],{"class":280},[266,523,389],{"class":388},[266,525,393],{"class":392},[266,527,389],{"class":388},[266,529,398],{"class":280},[266,531,380],{"class":272},[266,533,403],{"class":374},[266,535,536],{"class":268,"line":361},[266,537,409],{"class":280},[266,539,540,543,545,548],{"class":268,"line":367},[266,541,542],{"class":276},"    LoggerFactory ",[266,544,418],{"class":272},[266,546,547],{"class":276}," loggerFactory",[266,549,550],{"class":280},",\n",[266,552,553],{"class":268,"line":406},[266,554,462],{"class":280},[170,556,557,558,561],{},"Categories are namespaced under ",[177,559,560],{},"ConfigDirector",", so levels, formatting, and destinations are controlled through your usual logging configuration:",[256,563,568],{"className":564,"code":565,"filename":566,"language":567,"meta":262,"style":262},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"ConfigDirector\": \"Debug\"\n    }\n  }\n}\n","appsettings.json","json",[177,569,570,574,592,607,627,632,637],{"__ignoreMap":262},[266,571,572],{"class":268,"line":269},[266,573,409],{"class":280},[266,575,576,580,584,586,589],{"class":268,"line":361},[266,577,579],{"class":578},"s39Yj","  \"",[266,581,583],{"class":582},"sseR_","Logging",[266,585,389],{"class":578},[266,587,588],{"class":280},":",[266,590,591],{"class":280}," {\n",[266,593,594,597,601,603,605],{"class":268,"line":367},[266,595,596],{"class":578},"    \"",[266,598,600],{"class":599},"sZMiF","LogLevel",[266,602,389],{"class":578},[266,604,588],{"class":280},[266,606,591],{"class":280},[266,608,609,612,615,617,619,621,624],{"class":268,"line":406},[266,610,611],{"class":578},"      \"",[266,613,560],{"class":614},"srdBf",[266,616,389],{"class":578},[266,618,588],{"class":280},[266,620,434],{"class":388},[266,622,623],{"class":392},"Debug",[266,625,626],{"class":388},"\"\n",[266,628,629],{"class":268,"line":412},[266,630,631],{"class":280},"    }\n",[266,633,634],{"class":268,"line":459},[266,635,636],{"class":280},"  }\n",[266,638,639],{"class":268,"line":465},[266,640,641],{"class":280},"}\n",[329,643,645],{"id":644},"connection",[177,646,308],{},[170,648,649],{},"The connection options have the following optional values:",[651,652,653,684,710,732],"ul",{},[224,654,655,658],{},[177,656,657],{},"Mode",[651,659,660,679],{},[224,661,662,663,666,667,670,671,674,675,678],{},"The connection mode, which can be ",[177,664,665],{},"ConnectionMode.Streaming"," or ",[177,668,669],{},"ConnectionMode.Polling",". It is recommended to use the default of ",[177,672,673],{},"Streaming"," unless you have a specific need to use ",[177,676,677],{},"Polling"," instead.",[224,680,681,682],{},"Defaults to ",[177,683,665],{},[224,685,686,689],{},[177,687,688],{},"PollingInterval",[651,690,691,704],{},[224,692,693,694,696,697,700,701,703],{},"Only used in ",[177,695,677],{}," mode. The interval to poll ConfigDirector services for updates. Setting an interval shorter than ",[177,698,699],{},"1"," minute throws an ",[177,702,318],{},", including when it is bound from configuration.",[224,705,681,706,709],{},[177,707,708],{},"5"," minutes",[224,711,712,715],{},[177,713,714],{},"Timeout",[651,716,717,726],{},[224,718,719,720,722,723,725],{},"The timeout to be used in initialization, and the limit on any single request to ConfigDirector services. This is how long ",[177,721,245],{}," will wait for data from ConfigDirector services. If the timeout is reached, ",[177,724,245],{}," will return but the client will still be in an unready status and returning default values. While streaming, the client will continue to attempt to connect and retrieve config values in the background.",[224,727,681,728,731],{},[177,729,730],{},"3"," seconds",[224,733,734,736],{},[177,735,326],{},[651,737,738,744],{},[224,739,740,741,281],{},"The base URL used to connect to ConfigDirector services. Must be an absolute ",[177,742,743],{},"Uri",[224,745,746],{},"This should only be provided if your environment requires you to configure a proxy server in order to connect to ConfigDirector services",[256,748,750],{"className":258,"code":749,"filename":260,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nvar client = new ConfigDirectorClient(\"YOUR-SERVER-SDK-KEY\", new ConfigDirectorClientOptions\n{\n    Connection =\n    {\n        Mode = ConnectionMode.Polling,\n        PollingInterval = TimeSpan.FromMinutes(10),\n        Timeout = TimeSpan.FromSeconds(5),\n    },\n});\n",[177,751,752,760,764,790,794,802,807,823,846,867,873],{"__ignoreMap":262},[266,753,754,756,758],{"class":268,"line":269},[266,755,351],{"class":350},[266,757,355],{"class":354},[266,759,358],{"class":280},[266,761,762],{"class":268,"line":361},[266,763,364],{"emptyLinePlaceholder":32},[266,765,766,768,770,772,774,776,778,780,782,784,786,788],{"class":268,"line":367},[266,767,371],{"class":370},[266,769,277],{"class":374},[266,771,377],{"class":272},[266,773,380],{"class":272},[266,775,383],{"class":374},[266,777,287],{"class":280},[266,779,389],{"class":388},[266,781,393],{"class":392},[266,783,389],{"class":388},[266,785,398],{"class":280},[266,787,380],{"class":272},[266,789,403],{"class":374},[266,791,792],{"class":268,"line":406},[266,793,409],{"class":280},[266,795,796,799],{"class":268,"line":412},[266,797,798],{"class":276},"    Connection ",[266,800,801],{"class":272},"=\n",[266,803,804],{"class":268,"line":459},[266,805,806],{"class":280},"    {\n",[266,808,809,812,814,817,819,821],{"class":268,"line":465},[266,810,811],{"class":276},"        Mode ",[266,813,418],{"class":272},[266,815,816],{"class":276}," ConnectionMode",[266,818,281],{"class":280},[266,820,677],{"class":276},[266,822,550],{"class":280},[266,824,825,828,830,833,835,838,840,843],{"class":268,"line":470},[266,826,827],{"class":276},"        PollingInterval ",[266,829,418],{"class":272},[266,831,832],{"class":276}," TimeSpan",[266,834,281],{"class":280},[266,836,837],{"class":284},"FromMinutes",[266,839,287],{"class":280},[266,841,842],{"class":614},"10",[266,844,845],{"class":280},"),\n",[266,847,849,852,854,856,858,861,863,865],{"class":268,"line":848},9,[266,850,851],{"class":276},"        Timeout ",[266,853,418],{"class":272},[266,855,832],{"class":276},[266,857,281],{"class":280},[266,859,860],{"class":284},"FromSeconds",[266,862,287],{"class":280},[266,864,708],{"class":614},[266,866,845],{"class":280},[266,868,870],{"class":268,"line":869},10,[266,871,872],{"class":280},"    },\n",[266,874,876],{"class":268,"line":875},11,[266,877,462],{"class":280},[329,879,881],{"id":880},"telemetry",[177,882,311],{},[170,884,885],{},"Telemetry tuning. It is unlikely these settings need to be adjusted. However, in cases where your application has a large number of evaluations per second, you can adjust these settings to tune the memory footprint and frequency of telemetry requests.",[170,887,888],{},"Keep in mind that ConfigDirector relies on these telemetry events to provide insights and features related to the configs being used.",[170,890,891],{},"The telemetry options have the following optional values:",[651,893,894,910],{},[224,895,896,899],{},[177,897,898],{},"EventQueueLimit",[651,900,901,904,907],{},[224,902,903],{},"The size limit of telemetry event queues. If the size limit is reached before the events are flushed to the network, older events will be dropped.",[224,905,906],{},"ConfigDirector keeps a count of dropped events. If the number of dropped events is higher than 50% of the total events, ConfigDirector will issue a notification alert in the dashboard.",[224,908,909],{},"A number between 100 and 100,000. Defaults to 5,000.",[224,911,912,915],{},[177,913,914],{},"FlushInterval",[651,916,917,920,923],{},[224,918,919],{},"How often events are flushed and sent over the network.",[224,921,922],{},"Decrease this number if your application consistently captures a large number of events in short periods of time in order to reduce memory footprint from a large event queue.",[224,924,925],{},"Defaults to 30 seconds.",[256,927,929],{"className":258,"code":928,"filename":260,"language":261,"meta":262,"style":262},"var client = new ConfigDirectorClient(\"YOUR-SERVER-SDK-KEY\", new ConfigDirectorClientOptions\n{\n    Telemetry =\n    {\n        EventQueueLimit = 10_000,\n        FlushInterval = TimeSpan.FromSeconds(15),\n    },\n});\n",[177,930,931,957,961,968,972,984,1004,1008],{"__ignoreMap":262},[266,932,933,935,937,939,941,943,945,947,949,951,953,955],{"class":268,"line":269},[266,934,371],{"class":370},[266,936,277],{"class":374},[266,938,377],{"class":272},[266,940,380],{"class":272},[266,942,383],{"class":374},[266,944,287],{"class":280},[266,946,389],{"class":388},[266,948,393],{"class":392},[266,950,389],{"class":388},[266,952,398],{"class":280},[266,954,380],{"class":272},[266,956,403],{"class":374},[266,958,959],{"class":268,"line":361},[266,960,409],{"class":280},[266,962,963,966],{"class":268,"line":367},[266,964,965],{"class":276},"    Telemetry ",[266,967,801],{"class":272},[266,969,970],{"class":268,"line":406},[266,971,806],{"class":280},[266,973,974,977,979,982],{"class":268,"line":412},[266,975,976],{"class":276},"        EventQueueLimit ",[266,978,418],{"class":272},[266,980,981],{"class":614}," 10_000",[266,983,550],{"class":280},[266,985,986,989,991,993,995,997,999,1002],{"class":268,"line":459},[266,987,988],{"class":276},"        FlushInterval ",[266,990,418],{"class":272},[266,992,832],{"class":276},[266,994,281],{"class":280},[266,996,860],{"class":284},[266,998,287],{"class":280},[266,1000,1001],{"class":614},"15",[266,1003,845],{"class":280},[266,1005,1006],{"class":268,"line":465},[266,1007,872],{"class":280},[266,1009,1010],{"class":268,"line":470},[266,1011,462],{"class":280},[295,1013,1015],{"id":1014},"hooks","Hooks",[170,1017,1018,1019,1022,1023,588],{},"Hooks are .NET events you can subscribe to in order to be notified of some key actions from the client. Subscribe with ",[177,1020,1021],{},"+="," and unsubscribe with ",[177,1024,1025],{},"-=",[256,1027,1029],{"className":258,"code":1028,"filename":260,"language":261,"meta":262,"style":262},"void OnConfigsUpdated(object? sender, ConfigsUpdatedEventArgs e) =>\n    Console.WriteLine(string.Join(\", \", e.Keys));\n\nclient.ConfigsUpdated += OnConfigsUpdated;\n\nclient.ConfigsUpdated -= OnConfigsUpdated; \u002F\u002F Cancels the registration\n",[177,1030,1031,1064,1105,1109,1125,1129],{"__ignoreMap":262},[266,1032,1033,1036,1039,1041,1044,1047,1050,1052,1055,1058,1061],{"class":268,"line":269},[266,1034,1035],{"class":272},"void",[266,1037,1038],{"class":284}," OnConfigsUpdated",[266,1040,287],{"class":280},[266,1042,1043],{"class":272},"object",[266,1045,1046],{"class":280},"?",[266,1048,1049],{"class":374}," sender",[266,1051,398],{"class":280},[266,1053,1054],{"class":374}," ConfigsUpdatedEventArgs",[266,1056,1057],{"class":374}," e",[266,1059,1060],{"class":280},")",[266,1062,1063],{"class":272}," =>\n",[266,1065,1066,1069,1071,1074,1076,1079,1081,1084,1086,1088,1091,1093,1095,1097,1099,1102],{"class":268,"line":361},[266,1067,1068],{"class":276},"    Console",[266,1070,281],{"class":280},[266,1072,1073],{"class":284},"WriteLine",[266,1075,287],{"class":280},[266,1077,1078],{"class":272},"string",[266,1080,281],{"class":280},[266,1082,1083],{"class":284},"Join",[266,1085,287],{"class":280},[266,1087,389],{"class":388},[266,1089,1090],{"class":392},", ",[266,1092,389],{"class":388},[266,1094,398],{"class":280},[266,1096,1057],{"class":276},[266,1098,281],{"class":280},[266,1100,1101],{"class":276},"Keys",[266,1103,1104],{"class":280},"));\n",[266,1106,1107],{"class":268,"line":367},[266,1108,364],{"emptyLinePlaceholder":32},[266,1110,1111,1114,1116,1119,1121,1123],{"class":268,"line":406},[266,1112,1113],{"class":276},"client",[266,1115,281],{"class":280},[266,1117,1118],{"class":276},"ConfigsUpdated ",[266,1120,1021],{"class":272},[266,1122,1038],{"class":276},[266,1124,358],{"class":280},[266,1126,1127],{"class":268,"line":412},[266,1128,364],{"emptyLinePlaceholder":32},[266,1130,1131,1133,1135,1137,1139,1141,1144],{"class":268,"line":459},[266,1132,1113],{"class":276},[266,1134,281],{"class":280},[266,1136,1118],{"class":276},[266,1138,1025],{"class":272},[266,1140,1038],{"class":276},[266,1142,1143],{"class":280},";",[266,1145,1147],{"class":1146},"sutJx"," \u002F\u002F Cancels the registration\n",[170,1149,1150],{},"The following hooks are available:",[651,1152,1153,1168,1188],{},[224,1154,1155,1160],{},[177,1156,1159],{"className":1157},[1158],"font-semibold","ClientReady: ClientReadyEventArgs",[651,1161,1162],{},[224,1163,1164,1165,1167],{},"Emitted when the client is initialized. When this event is emitted it means the client has received a payload from the ConfigDirector servers and is ready to evaluate configs. It is emitted once, and a handler registered after that point is never called — check ",[177,1166,249],{}," for that.",[224,1169,1170,1174],{},[177,1171,1173],{"className":1172},[1158],"ConfigsUpdated: ConfigsUpdatedEventArgs",[651,1175,1176,1179,1185],{},[224,1177,1178],{},"Emitted when a payload is received from the ConfigDirector servers with config data. It is emitted during initialization when an entire config payload is received. After initialization, it is emitted when updates are pushed from the server (or discovered via polling if that connection mode is used).",[224,1180,1181,1184],{},[177,1182,1183],{},"Keys: IReadOnlyList\u003Cstring>"," - The config keys that were included in the payload from the server, sorted.",[224,1186,1187],{},"Handlers run on the thread the update arrived on, so one that blocks delays later updates.",[224,1189,1190,1194],{},[177,1191,1193],{"className":1192},[1158],"ConfigEvaluated: ConfigEvaluatedEventArgs",[651,1195,1196,1202,1317],{},[224,1197,1198,1199,281],{},"Emitted whenever a config is evaluated. This includes calls to the getters and evaluations delivered to watchers via ",[177,1200,1201],{},"Watch",[224,1203,1204,1207,1208,1211,1212],{},[177,1205,1206],{},"Evaluation: ConfigEvaluation"," - A ",[177,1209,1210],{},"ConfigEvaluation"," record containing the details of the evaluation:\n",[651,1213,1214,1220,1229,1243,1249,1308],{},[224,1215,1216,1219],{},[177,1217,1218],{},"Key: string"," - The config key that was evaluated",[224,1221,1222,1225,1226,1228],{},[177,1223,1224],{},"Value: object"," - The value the config evaluated to, in the type the caller's default asked for. It can be the default value provided to the getter or to ",[177,1227,1201],{},". For example, if the config was evaluated before the client was initialized.",[224,1230,1231,1234,1235,1238,1239,1242],{},[177,1232,1233],{},"ValueId: string?"," - The value ID, which is a stable hash of the value that can be used for analytics or other third parties rather than sending the ",[177,1236,1237],{},"Value",". This can be useful for large values, like a JSON config, or to avoid disclosing the values themselves to third parties. It is ",[177,1240,1241],{},"null"," when the evaluation fell back to the default value.",[224,1244,1245,1248],{},[177,1246,1247],{},"IsDefault: bool"," - Whether or not the evaluation fell back to the default value provided in code.",[224,1250,1251,1254,1255,1258,1259,1262,1263],{},[177,1252,1253],{},"Reason: EvaluationReason"," - The reason for the evaluation resolution. In the case the config successfully evaluated based on server-provided targeting rules, it will be ",[177,1256,1257],{},"FoundMatch",". If the evaluation had to fall back to the default value, the ",[177,1260,1261],{},"Reason"," will encode why the fallback was required:\n",[651,1264,1265,1271,1277,1283,1296,1302],{},[224,1266,1267,1270],{},[177,1268,1269],{},"ClientNotReady"," - The evaluation happened before the client finished initialization",[224,1272,1273,1276],{},[177,1274,1275],{},"ConfigStateMissing"," - The requested config key was not present in the payload received from the server. This could be due to an incorrect config key, or a config that was not enabled to be available to client SDKs.",[224,1278,1279,1282],{},[177,1280,1281],{},"InvalidNumber"," - The config was requested as a number but the value received from the server could not be read as that number type.",[224,1284,1285,1288,1289,1292,1293,281],{},[177,1286,1287],{},"InvalidBoolean"," - The config was requested as a boolean but the value received from the server was neither ",[177,1290,1291],{},"true"," nor ",[177,1294,1295],{},"false",[224,1297,1298,1301],{},[177,1299,1300],{},"InvalidJson"," - The config was requested as JSON but the value received from the server could not be read as the JSON shape asked for.",[224,1303,1304,1307],{},[177,1305,1306],{},"ValueMissing"," - The config key was present in the payload received from the server, but it carried no value.",[224,1309,1310,1313,1314,1316],{},[177,1311,1312],{},"Context: Context?"," - The user context that was provided to the evaluation function, or ",[177,1315,1241],{}," if no context was provided.",[224,1318,1319],{},"Handlers run on the calling thread, so one that blocks delays the getter that triggered it.",[165,1321,1323],{"id":1322},"retrieve-config-values","Retrieve config values",[213,1325],{"name":1326},"sdks\u002Fdotnet\u002Fsimple-usage",[170,1328,1329],{},"The type a config is read as is decided by the overload you call, not by how the config was declared in the dashboard. There is one overload per type the SDK can read exactly, so a type it cannot fill is a compile error rather than a surprise at runtime. Each one takes the value to return when the config is missing, the service is unreachable, or the value will not read as the requested type — so the default should always be the safe choice:",[651,1331,1332,1337,1342,1347,1352,1357,1362,1367],{},[224,1333,1334],{},[177,1335,1336],{},"GetValue(string configKey, bool defaultValue, Context? context = null)",[224,1338,1339],{},[177,1340,1341],{},"GetValue(string configKey, string defaultValue, Context? context = null)",[224,1343,1344],{},[177,1345,1346],{},"GetValue(string configKey, int defaultValue, Context? context = null)",[224,1348,1349],{},[177,1350,1351],{},"GetValue(string configKey, long defaultValue, Context? context = null)",[224,1353,1354],{},[177,1355,1356],{},"GetValue(string configKey, double defaultValue, Context? context = null)",[224,1358,1359],{},[177,1360,1361],{},"GetValue(string configKey, float defaultValue, Context? context = null)",[224,1363,1364],{},[177,1365,1366],{},"GetValue(string configKey, decimal defaultValue, Context? context = null)",[224,1368,1369],{},[177,1370,1371],{},"GetValue(string configKey, JsonElement defaultValue, Context? context = null)",[170,1373,1374],{},"A few of those are worth calling out:",[651,1376,1377,1387,1398],{},[224,1378,1379,1380,1382,1383,1386],{},"Reading as ",[177,1381,1078],{}," returns the value as the server spelled it, with no parsing, so any config reads as text: a boolean config gives ",[177,1384,1385],{},"\"true\"",", and a JSON config gives its JSON.",[224,1388,1389,1390,180,1392,1394,1395,1397],{},"Only ",[177,1391,1291],{},[177,1393,1295],{}," read as a boolean, in either casing. A config holding ",[177,1396,699],{}," yields the default.",[224,1399,1400,1401,666,1404,1407,1408,1411,1412,1415,1416,1419],{},"A whole number the server wrote as ",[177,1402,1403],{},"26.0",[177,1405,1406],{},"2.6e1"," still reads as ",[177,1409,1410],{},"26",". A value a ",[177,1413,1414],{},"float"," cannot hold, such as ",[177,1417,1418],{},"1e300",", yields the default rather than an infinity.",[295,1421,1423],{"id":1422},"json-configs","JSON configs",[170,1425,1426,1429,1430,1433,1434,1437],{},[177,1427,1428],{},"GetValue"," with a ",[177,1431,1432],{},"JsonElement"," default returns the config's JSON whole, whatever shape it is. ",[177,1435,1436],{},"GetJsonValue\u003CT>"," binds it to a type of your own instead:",[256,1439,1442],{"className":258,"code":1440,"filename":1441,"language":261,"meta":262,"style":262},"using System.Text.Json;\n\n\u002F\u002F The shape lives in the dashboard, so read it as it stands\nvar raw = client.GetValue(\"rate-limits\", default(JsonElement));\n\n\u002F\u002F The shape belongs to this application, so bind it\nvar limits = client.GetJsonValue(\"rate-limits\", new RateLimits());\n\npublic sealed record RateLimits\n{\n    public int PerMinute { get; init; } = 60;\n}\n","Program.cs",[177,1443,1444,1463,1467,1472,1507,1511,1516,1550,1554,1569,1573,1606],{"__ignoreMap":262},[266,1445,1446,1448,1451,1453,1456,1458,1461],{"class":268,"line":269},[266,1447,351],{"class":350},[266,1449,1450],{"class":354}," System",[266,1452,281],{"class":280},[266,1454,1455],{"class":354},"Text",[266,1457,281],{"class":280},[266,1459,1460],{"class":354},"Json",[266,1462,358],{"class":280},[266,1464,1465],{"class":268,"line":361},[266,1466,364],{"emptyLinePlaceholder":32},[266,1468,1469],{"class":268,"line":367},[266,1470,1471],{"class":1146},"\u002F\u002F The shape lives in the dashboard, so read it as it stands\n",[266,1473,1474,1476,1479,1481,1483,1485,1487,1489,1491,1494,1496,1498,1501,1503,1505],{"class":268,"line":406},[266,1475,371],{"class":370},[266,1477,1478],{"class":374}," raw",[266,1480,377],{"class":272},[266,1482,277],{"class":276},[266,1484,281],{"class":280},[266,1486,1428],{"class":284},[266,1488,287],{"class":280},[266,1490,389],{"class":388},[266,1492,1493],{"class":392},"rate-limits",[266,1495,389],{"class":388},[266,1497,398],{"class":280},[266,1499,1500],{"class":272}," default",[266,1502,287],{"class":280},[266,1504,1432],{"class":374},[266,1506,1104],{"class":280},[266,1508,1509],{"class":268,"line":412},[266,1510,364],{"emptyLinePlaceholder":32},[266,1512,1513],{"class":268,"line":459},[266,1514,1515],{"class":1146},"\u002F\u002F The shape belongs to this application, so bind it\n",[266,1517,1518,1520,1523,1525,1527,1529,1532,1534,1536,1538,1540,1542,1544,1547],{"class":268,"line":465},[266,1519,371],{"class":370},[266,1521,1522],{"class":374}," limits",[266,1524,377],{"class":272},[266,1526,277],{"class":276},[266,1528,281],{"class":280},[266,1530,1531],{"class":284},"GetJsonValue",[266,1533,287],{"class":280},[266,1535,389],{"class":388},[266,1537,1493],{"class":392},[266,1539,389],{"class":388},[266,1541,398],{"class":280},[266,1543,380],{"class":272},[266,1545,1546],{"class":374}," RateLimits",[266,1548,1549],{"class":280},"());\n",[266,1551,1552],{"class":268,"line":470},[266,1553,364],{"emptyLinePlaceholder":32},[266,1555,1556,1560,1563,1566],{"class":268,"line":848},[266,1557,1559],{"class":1558},"sbsja","public",[266,1561,1562],{"class":1558}," sealed",[266,1564,1565],{"class":370}," record",[266,1567,1568],{"class":374}," RateLimits\n",[266,1570,1571],{"class":268,"line":869},[266,1572,409],{"class":280},[266,1574,1575,1578,1581,1584,1586,1589,1591,1594,1596,1599,1601,1604],{"class":268,"line":875},[266,1576,1577],{"class":1558},"    public",[266,1579,1580],{"class":272}," int",[266,1582,1583],{"class":374}," PerMinute",[266,1585,426],{"class":280},[266,1587,1588],{"class":370}," get",[266,1590,1143],{"class":280},[266,1592,1593],{"class":370}," init",[266,1595,1143],{"class":280},[266,1597,1598],{"class":280}," }",[266,1600,377],{"class":272},[266,1602,1603],{"class":614}," 60",[266,1605,358],{"class":280},[266,1607,1609],{"class":268,"line":1608},12,[266,1610,641],{"class":280},[1612,1613,1614,1616,1617,1620,1621,1623,1624,1626],"note",{},[177,1615,1436],{}," binds by System.Text.Json's rules, so any property ",[177,1618,1619],{},"T"," does not declare is dropped. A config whose shape has moved on binds to ",[177,1622,1619],{},"'s own defaults and cannot be told apart from the default value you passed. Read the config as a ",[177,1625,1432],{}," when that matters.",[1612,1628,1629,1630,281],{},"Getters never throw when a config is missing or a value will not read as the requested type — they return your default instead. Which of those happened is reported through ",[177,1631,1632],{},"ConfigEvaluated",[295,1634,1636],{"id":1635},"evaluate-config-values-with-a-user-context","Evaluate config values with a user context",[1612,1638,1639],{},"Unlike client SDKs, the server SDKs are able to evaluate targeting rules for the given user context locally without additional network calls.",[170,1641,1642,1643,1646],{},"Every getter takes an optional ",[177,1644,1645],{},"Context"," as its last argument, which is what targeting rules are evaluated against. The same key can therefore resolve differently per user:",[213,1648],{"name":1649},"sdks\u002Fdotnet\u002Fuser-context",[170,1651,1652,1654],{},[177,1653,1645],{}," is a record and accepts the following:",[651,1656,1657,1667,1677,1697],{},[224,1658,1659,1662],{},[177,1660,1661],{},"Id",[651,1663,1664],{},[224,1665,1666],{},"The user's identifier. It decides their bucket in a percentage rollout, so changing it can move a user into a different percentile. If it is not provided, a percentage rollout assigns an unstable bucket.",[224,1668,1669,1672],{},[177,1670,1671],{},"Name",[651,1673,1674],{},[224,1675,1676],{},"The user's display name.",[224,1678,1679,1682],{},[177,1680,1681],{},"Traits",[651,1683,1684,1694],{},[224,1685,1686,1687,180,1690,1693],{},"Arbitrary traits which can be referenced in targeting rules, keyed by the name the rule references. Names are matched exactly, as JSON member names are. Values are JSON-shaped: strings, numbers, and booleans convert implicitly, and arrays of those convert too. Nested shapes are built with ",[177,1688,1689],{},"TraitValue.FromArray",[177,1691,1692],{},"TraitValue.FromObject",". A value with no text form — null, a list, a nested object — will not match a targeting rule that compares text.",[224,1695,1696],{},"It is never null: a context with no traits carries an empty collection, and assigning a collection copies it.",[224,1698,1699,1702],{},[177,1700,1701],{},"Anonymous",[651,1703,1704],{},[224,1705,1706],{},"Keeps the context out of the dashboard: it is evaluated but never persisted, and telemetry reports neither the context nor its id.",[256,1708,1710],{"className":258,"code":1709,"filename":1441,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nvar context = new Context\n{\n    Id = \"user-id\",\n    Name = \"Example User\",\n    Traits =\n    {\n        [\"region\"] = \"North America\",\n        [\"age\"] = 26,\n        [\"tags\"] = new[] { \"beta\", \"internal\" },\n    },\n};\n",[177,1711,1712,1720,1724,1738,1742,1758,1774,1781,1785,1811,1831,1871,1875],{"__ignoreMap":262},[266,1713,1714,1716,1718],{"class":268,"line":269},[266,1715,351],{"class":350},[266,1717,355],{"class":354},[266,1719,358],{"class":280},[266,1721,1722],{"class":268,"line":361},[266,1723,364],{"emptyLinePlaceholder":32},[266,1725,1726,1728,1731,1733,1735],{"class":268,"line":367},[266,1727,371],{"class":370},[266,1729,1730],{"class":374}," context",[266,1732,377],{"class":272},[266,1734,380],{"class":272},[266,1736,1737],{"class":374}," Context\n",[266,1739,1740],{"class":268,"line":406},[266,1741,409],{"class":280},[266,1743,1744,1747,1749,1751,1754,1756],{"class":268,"line":412},[266,1745,1746],{"class":276},"    Id ",[266,1748,418],{"class":272},[266,1750,434],{"class":388},[266,1752,1753],{"class":392},"user-id",[266,1755,389],{"class":388},[266,1757,550],{"class":280},[266,1759,1760,1763,1765,1767,1770,1772],{"class":268,"line":459},[266,1761,1762],{"class":276},"    Name ",[266,1764,418],{"class":272},[266,1766,434],{"class":388},[266,1768,1769],{"class":392},"Example User",[266,1771,389],{"class":388},[266,1773,550],{"class":280},[266,1775,1776,1779],{"class":268,"line":465},[266,1777,1778],{"class":276},"    Traits ",[266,1780,801],{"class":272},[266,1782,1783],{"class":268,"line":470},[266,1784,806],{"class":280},[266,1786,1787,1790,1792,1795,1797,1800,1802,1804,1807,1809],{"class":268,"line":848},[266,1788,1789],{"class":280},"        [",[266,1791,389],{"class":388},[266,1793,1794],{"class":392},"region",[266,1796,389],{"class":388},[266,1798,1799],{"class":280},"]",[266,1801,377],{"class":272},[266,1803,434],{"class":388},[266,1805,1806],{"class":392},"North America",[266,1808,389],{"class":388},[266,1810,550],{"class":280},[266,1812,1813,1815,1817,1820,1822,1824,1826,1829],{"class":268,"line":869},[266,1814,1789],{"class":280},[266,1816,389],{"class":388},[266,1818,1819],{"class":392},"age",[266,1821,389],{"class":388},[266,1823,1799],{"class":280},[266,1825,377],{"class":272},[266,1827,1828],{"class":614}," 26",[266,1830,550],{"class":280},[266,1832,1833,1835,1837,1840,1842,1844,1846,1848,1851,1853,1855,1858,1860,1862,1864,1867,1869],{"class":268,"line":875},[266,1834,1789],{"class":280},[266,1836,389],{"class":388},[266,1838,1839],{"class":392},"tags",[266,1841,389],{"class":388},[266,1843,1799],{"class":280},[266,1845,377],{"class":272},[266,1847,380],{"class":272},[266,1849,1850],{"class":280},"[]",[266,1852,426],{"class":280},[266,1854,434],{"class":388},[266,1856,1857],{"class":392},"beta",[266,1859,389],{"class":388},[266,1861,398],{"class":280},[266,1863,434],{"class":388},[266,1865,1866],{"class":392},"internal",[266,1868,389],{"class":388},[266,1870,456],{"class":280},[266,1872,1873],{"class":268,"line":1608},[266,1874,872],{"class":280},[266,1876,1878],{"class":268,"line":1877},13,[266,1879,1880],{"class":280},"};\n",[295,1882,1884],{"id":1883},"watch-for-updates","Watch for updates",[170,1886,1887,1889,1890,1892,1893,1896,1897,281],{},[177,1888,1201],{}," accepts four arguments, the first is the config key, the second argument is the default value, the third argument is a handler that will be executed when the config value is updated, and the fourth and optional argument is a user context. It has the same set of typed overloads as ",[177,1891,1428],{},", plus ",[177,1894,1895],{},"WatchJson\u003CT>"," as the counterpart to ",[177,1898,1436],{},[170,1900,1901,1902,1904],{},"Registering a watch before ",[177,1903,245],{}," means it is called for the first config state as well; one registered afterwards only sees later updates. Handlers run on the thread the update arrived on, so one that blocks delays later updates.",[256,1906,1908],{"className":258,"code":1907,"filename":1441,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nvar subscription = client.Watch(\n    \"new-checkout\",\n    false,\n    value => Console.WriteLine($\"new-checkout is now {value}\"),\n    new Context\n    {\n        Id = \"user-id\",\n        Name = \"Example User\",\n        Traits = { [\"region\"] = \"North America\" },\n    });\n",[177,1909,1910,1918,1922,1940,1951,1959,1995,2002,2006,2021,2036,2066],{"__ignoreMap":262},[266,1911,1912,1914,1916],{"class":268,"line":269},[266,1913,351],{"class":350},[266,1915,355],{"class":354},[266,1917,358],{"class":280},[266,1919,1920],{"class":268,"line":361},[266,1921,364],{"emptyLinePlaceholder":32},[266,1923,1924,1926,1929,1931,1933,1935,1937],{"class":268,"line":367},[266,1925,371],{"class":370},[266,1927,1928],{"class":374}," subscription",[266,1930,377],{"class":272},[266,1932,277],{"class":276},[266,1934,281],{"class":280},[266,1936,1201],{"class":284},[266,1938,1939],{"class":280},"(\n",[266,1941,1942,1944,1947,1949],{"class":268,"line":406},[266,1943,596],{"class":388},[266,1945,1946],{"class":392},"new-checkout",[266,1948,389],{"class":388},[266,1950,550],{"class":280},[266,1952,1953,1957],{"class":268,"line":412},[266,1954,1956],{"class":1955},"syTEX","    false",[266,1958,550],{"class":280},[266,1960,1961,1964,1967,1970,1972,1974,1976,1979,1982,1985,1988,1991,1993],{"class":268,"line":459},[266,1962,1963],{"class":276},"    value =",[266,1965,1966],{"class":272},">",[266,1968,1969],{"class":276}," Console",[266,1971,281],{"class":280},[266,1973,1073],{"class":284},[266,1975,287],{"class":280},[266,1977,1978],{"class":388},"$\"",[266,1980,1981],{"class":392},"new-checkout is now ",[266,1983,1984],{"class":388},"{",[266,1986,1987],{"class":276},"value",[266,1989,1990],{"class":388},"}",[266,1992,389],{"class":388},[266,1994,845],{"class":280},[266,1996,1997,2000],{"class":268,"line":465},[266,1998,1999],{"class":272},"    new",[266,2001,1737],{"class":374},[266,2003,2004],{"class":268,"line":470},[266,2005,806],{"class":280},[266,2007,2008,2011,2013,2015,2017,2019],{"class":268,"line":848},[266,2009,2010],{"class":276},"        Id ",[266,2012,418],{"class":272},[266,2014,434],{"class":388},[266,2016,1753],{"class":392},[266,2018,389],{"class":388},[266,2020,550],{"class":280},[266,2022,2023,2026,2028,2030,2032,2034],{"class":268,"line":869},[266,2024,2025],{"class":276},"        Name ",[266,2027,418],{"class":272},[266,2029,434],{"class":388},[266,2031,1769],{"class":392},[266,2033,389],{"class":388},[266,2035,550],{"class":280},[266,2037,2038,2041,2043,2045,2048,2050,2052,2054,2056,2058,2060,2062,2064],{"class":268,"line":875},[266,2039,2040],{"class":276},"        Traits ",[266,2042,418],{"class":272},[266,2044,426],{"class":280},[266,2046,2047],{"class":280}," [",[266,2049,389],{"class":388},[266,2051,1794],{"class":392},[266,2053,389],{"class":388},[266,2055,1799],{"class":280},[266,2057,377],{"class":272},[266,2059,434],{"class":388},[266,2061,1806],{"class":392},[266,2063,389],{"class":388},[266,2065,456],{"class":280},[266,2067,2068],{"class":268,"line":1608},[266,2069,2070],{"class":280},"    });\n",[170,2072,2073,2075,2076,2079],{},[177,2074,1201],{}," returns an ",[177,2077,2078],{},"IDisposable"," that cancels the watch when disposed. Disposing it twice is harmless.",[165,2081,2083],{"id":2082},"other-useful-client-features","Other useful client features",[170,2085,2086],{},"The client provides additional members.",[295,2088,2090],{"id":2089},"isready",[177,2091,249],{},[170,2093,2094,2095,2097,2098,2100],{},"Returns a boolean indicating if the client has received config state and is ready to evaluate configs. It is initially ",[177,2096,1295],{}," and becomes ",[177,2099,1291],{}," once the first config state arrives. Until it does, every getter returns its default.",[295,2102,2104],{"id":2103},"isclosed",[177,2105,2106],{},"IsClosed",[170,2108,2109],{},"Returns a boolean indicating if the client has been disposed. A disposed client cannot be reopened.",[295,2111,2113],{"id":2112},"getallconfigs",[177,2114,2115],{},"GetAllConfigs",[170,2117,2118,2119,2122,2123,2125],{},"Returns every config the client currently holds as an ",[177,2120,2121],{},"IReadOnlyDictionary\u003Cstring, ConfigState>",", evaluated but before type parsing. It optionally accepts a ",[177,2124,1645],{}," and a collection of config keys to restrict the result to.",[170,2127,2128],{},"This is intended for handing state to a client SDK to hydrate with. It records no telemetry, since the SDK that receives the state reports its own evaluations.",[295,2130,2132],{"id":2131},"unwatch",[177,2133,2134],{},"Unwatch",[170,2136,2137],{},"Cancels every watch on one config key.",[295,2139,2141],{"id":2140},"unwatchall",[177,2142,2143],{},"UnwatchAll",[170,2145,2146],{},"Cancels every watch on every config key.",[295,2148,2150],{"id":2149},"disposing-the-client","Disposing the client",[170,2152,2153],{},"Disposing closes all connections to ConfigDirector services, reports whatever telemetry is pending, and cancels every watch and event handler. Disposing twice is harmless.",[170,2155,2156,2157,2160,2161,180,2163,2166],{},"Only dispose when your application shuts down and it will no longer make use of the client instance. ",[177,2158,2159],{},"ConfigDirectorClient"," implements both ",[177,2162,2078],{},[177,2164,2165],{},"IAsyncDisposable","; prefer the asynchronous one, which lets the final telemetry flush complete without blocking a thread.",[170,2168,2169],{},"In an ASP.NET Core application, register the client as a singleton and let the host own the lifecycle — it disposes singletons on shutdown:",[256,2171,2173],{"className":258,"code":2172,"filename":1441,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nbuilder.Services.AddSingleton\u003CIConfigDirectorClient>(services =>\n    new ConfigDirectorClient(\n        builder.Configuration[\"ConfigDirector:ServerSdkKey\"]!,\n        new ConfigDirectorClientOptions\n        {\n            LoggerFactory = services.GetRequiredService\u003CILoggerFactory>(),\n        }));\n\nvar app = builder.Build();\n\n\u002F\u002F Awaited before the server starts listening, so requests are not served config\n\u002F\u002F defaults while the first config state is still in flight.\nawait app.Services.GetRequiredService\u003CIConfigDirectorClient>().InitializeAsync();\n\napp.Run();\n",[177,2174,2175,2183,2187,2216,2224,2251,2258,2263,2285,2290,2294,2313,2317,2322,2328,2354,2359],{"__ignoreMap":262},[266,2176,2177,2179,2181],{"class":268,"line":269},[266,2178,351],{"class":350},[266,2180,355],{"class":354},[266,2182,358],{"class":280},[266,2184,2185],{"class":268,"line":361},[266,2186,364],{"emptyLinePlaceholder":32},[266,2188,2189,2192,2194,2197,2199,2202,2205,2208,2211,2214],{"class":268,"line":367},[266,2190,2191],{"class":276},"builder",[266,2193,281],{"class":280},[266,2195,2196],{"class":276},"Services",[266,2198,281],{"class":280},[266,2200,2201],{"class":284},"AddSingleton",[266,2203,2204],{"class":280},"\u003C",[266,2206,2207],{"class":374},"IConfigDirectorClient",[266,2209,2210],{"class":280},">(",[266,2212,2213],{"class":374},"services",[266,2215,1063],{"class":272},[266,2217,2218,2220,2222],{"class":268,"line":406},[266,2219,1999],{"class":272},[266,2221,383],{"class":374},[266,2223,1939],{"class":280},[266,2225,2226,2229,2231,2234,2237,2239,2242,2244,2246,2249],{"class":268,"line":412},[266,2227,2228],{"class":276},"        builder",[266,2230,281],{"class":280},[266,2232,2233],{"class":276},"Configuration",[266,2235,2236],{"class":280},"[",[266,2238,389],{"class":388},[266,2240,2241],{"class":392},"ConfigDirector:ServerSdkKey",[266,2243,389],{"class":388},[266,2245,1799],{"class":280},[266,2247,2248],{"class":272},"!",[266,2250,550],{"class":280},[266,2252,2253,2256],{"class":268,"line":459},[266,2254,2255],{"class":272},"        new",[266,2257,403],{"class":374},[266,2259,2260],{"class":268,"line":465},[266,2261,2262],{"class":280},"        {\n",[266,2264,2265,2268,2270,2273,2275,2278,2280,2282],{"class":268,"line":470},[266,2266,2267],{"class":276},"            LoggerFactory ",[266,2269,418],{"class":272},[266,2271,2272],{"class":276}," services",[266,2274,281],{"class":280},[266,2276,2277],{"class":284},"GetRequiredService",[266,2279,2204],{"class":280},[266,2281,501],{"class":374},[266,2283,2284],{"class":280},">(),\n",[266,2286,2287],{"class":268,"line":848},[266,2288,2289],{"class":280},"        }));\n",[266,2291,2292],{"class":268,"line":869},[266,2293,364],{"emptyLinePlaceholder":32},[266,2295,2296,2298,2301,2303,2306,2308,2311],{"class":268,"line":875},[266,2297,371],{"class":370},[266,2299,2300],{"class":374}," app",[266,2302,377],{"class":272},[266,2304,2305],{"class":276}," builder",[266,2307,281],{"class":280},[266,2309,2310],{"class":284},"Build",[266,2312,481],{"class":280},[266,2314,2315],{"class":268,"line":1608},[266,2316,364],{"emptyLinePlaceholder":32},[266,2318,2319],{"class":268,"line":1877},[266,2320,2321],{"class":1146},"\u002F\u002F Awaited before the server starts listening, so requests are not served config\n",[266,2323,2325],{"class":268,"line":2324},14,[266,2326,2327],{"class":1146},"\u002F\u002F defaults while the first config state is still in flight.\n",[266,2329,2331,2333,2335,2337,2339,2341,2343,2345,2347,2350,2352],{"class":268,"line":2330},15,[266,2332,273],{"class":272},[266,2334,2300],{"class":276},[266,2336,281],{"class":280},[266,2338,2196],{"class":276},[266,2340,281],{"class":280},[266,2342,2277],{"class":284},[266,2344,2204],{"class":280},[266,2346,2207],{"class":374},[266,2348,2349],{"class":280},">().",[266,2351,245],{"class":284},[266,2353,481],{"class":280},[266,2355,2357],{"class":268,"line":2356},16,[266,2358,364],{"emptyLinePlaceholder":32},[266,2360,2362,2365,2367,2370],{"class":268,"line":2361},17,[266,2363,2364],{"class":276},"app",[266,2366,281],{"class":280},[266,2368,2369],{"class":284},"Run",[266,2371,481],{"class":280},[1612,2373,337,2374,2376,2377,2380,2381,2383],{},[177,2375,193],{}," package reduces all of the above to a single ",[177,2378,2379],{},"AddConfigDirector()"," call. See ",[196,2382,199],{"href":198}," below.",[238,2385,2386],{},"Never build a client per request. Each one holds its own connection, initialization does network I\u002FO, and a fresh client serves defaults until its first config state arrives.",[165,2388,199],{"id":2389},"aspnet-core",[170,2391,337,2392,2394],{},[177,2393,193],{}," package replaces the wiring above with one call. It registers the client, binds its settings from configuration, connects before the server starts listening, and lets the host dispose it on shutdown.",[170,2396,2397,2398,2400],{},"It sits on top of this SDK and brings it along, so installing it gives you both. It replaces the wiring only: reading a config is the same ",[177,2399,2207],{}," API either way, and an application that would rather register the client by hand can keep doing so.",[170,2402,2403,2404,2406,2407,2410],{},"The package targets ",[177,2405,179],{}," and requires ",[177,2408,2409],{},"ConfigDirector.ServerSdk"," 1.2.0 or later.",[295,2412,2414],{"id":2413},"installing-the-aspnet-core-package","Installing the ASP.NET Core package",[170,2416,2417,2418],{},"The package can be installed from NuGet: ",[196,2419,2420],{"href":2420,"rel":2421},"https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FConfigDirector.ServerSdk.AspNetCore",[211],[2423,2424,2425,2453],"code-group",{},[256,2426,2431],{"className":2427,"code":2428,"filename":2429,"language":2430,"meta":262,"style":262},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","dotnet add package ConfigDirector.ServerSdk.AspNetCore --version 1.2.0\n",".NET CLI","bash",[177,2432,2433],{"__ignoreMap":262},[266,2434,2435,2437,2440,2443,2446,2450],{"class":268,"line":269},[266,2436,157],{"class":374},[266,2438,2439],{"class":392}," add",[266,2441,2442],{"class":392}," package",[266,2444,2445],{"class":392}," ConfigDirector.ServerSdk.AspNetCore",[266,2447,2449],{"class":2448},"stzsN"," --version",[266,2451,2452],{"class":614}," 1.2.0\n",[256,2454,2459],{"className":2455,"code":2456,"filename":2457,"language":2458,"meta":262,"style":262},"language-xml shiki shiki-themes material-theme-lighter github-light github-dark","\u003CItemGroup>\n  \u003CPackageReference Include=\"ConfigDirector.ServerSdk.AspNetCore\" Version=\"1.2.0\" \u002F>\n\u003C\u002FItemGroup>\n",".csproj","xml",[177,2460,2461,2472,2507],{"__ignoreMap":262},[266,2462,2463,2465,2469],{"class":268,"line":269},[266,2464,2204],{"class":280},[266,2466,2468],{"class":2467},"sQzsp","ItemGroup",[266,2470,2471],{"class":280},">\n",[266,2473,2474,2477,2480,2484,2486,2488,2490,2492,2495,2497,2499,2502,2504],{"class":268,"line":361},[266,2475,2476],{"class":280},"  \u003C",[266,2478,2479],{"class":2467},"PackageReference",[266,2481,2483],{"class":2482},"s9AJx"," Include",[266,2485,418],{"class":280},[266,2487,389],{"class":388},[266,2489,193],{"class":392},[266,2491,389],{"class":388},[266,2493,2494],{"class":2482}," Version",[266,2496,418],{"class":280},[266,2498,389],{"class":388},[266,2500,2501],{"class":392},"1.2.0",[266,2503,389],{"class":388},[266,2505,2506],{"class":280}," \u002F>\n",[266,2508,2509,2512,2514],{"class":268,"line":367},[266,2510,2511],{"class":280},"\u003C\u002F",[266,2513,2468],{"class":2467},[266,2515,2471],{"class":280},[170,2517,2518,2519,2521],{},"There is no need to reference ",[177,2520,2409],{}," as well. It arrives as a dependency, which is how a consuming application gets both.",[295,2523,2525],{"id":2524},"register-the-client","Register the client",[256,2527,2529],{"className":258,"code":2528,"filename":1441,"language":261,"meta":262,"style":262},"var builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddConfigDirector();\n\nvar app = builder.Build();\n\napp.Run();\n",[177,2530,2531,2554,2558,2573,2577,2593,2597],{"__ignoreMap":262},[266,2532,2533,2535,2537,2539,2542,2544,2547,2549,2552],{"class":268,"line":269},[266,2534,371],{"class":370},[266,2536,2305],{"class":374},[266,2538,377],{"class":272},[266,2540,2541],{"class":276}," WebApplication",[266,2543,281],{"class":280},[266,2545,2546],{"class":284},"CreateBuilder",[266,2548,287],{"class":280},[266,2550,2551],{"class":276},"args",[266,2553,293],{"class":280},[266,2555,2556],{"class":268,"line":361},[266,2557,364],{"emptyLinePlaceholder":32},[266,2559,2560,2562,2564,2566,2568,2571],{"class":268,"line":367},[266,2561,2191],{"class":276},[266,2563,281],{"class":280},[266,2565,2196],{"class":276},[266,2567,281],{"class":280},[266,2569,2570],{"class":284},"AddConfigDirector",[266,2572,481],{"class":280},[266,2574,2575],{"class":268,"line":406},[266,2576,364],{"emptyLinePlaceholder":32},[266,2578,2579,2581,2583,2585,2587,2589,2591],{"class":268,"line":412},[266,2580,371],{"class":370},[266,2582,2300],{"class":374},[266,2584,377],{"class":272},[266,2586,2305],{"class":276},[266,2588,281],{"class":280},[266,2590,2310],{"class":284},[266,2592,481],{"class":280},[266,2594,2595],{"class":268,"line":459},[266,2596,364],{"emptyLinePlaceholder":32},[266,2598,2599,2601,2603,2605],{"class":268,"line":465},[266,2600,2364],{"class":276},[266,2602,281],{"class":280},[266,2604,2369],{"class":284},[266,2606,481],{"class":280},[170,2608,2609],{},"with the section it binds:",[256,2611,2613],{"className":564,"code":2612,"filename":566,"language":567,"meta":262,"style":262},"{\n  \"ConfigDirector\": {\n    \"Connection\": {\n      \"Mode\": \"Streaming\",\n      \"Timeout\": \"00:00:03\"\n    }\n  }\n}\n",[177,2614,2615,2619,2631,2643,2661,2678,2682,2686],{"__ignoreMap":262},[266,2616,2617],{"class":268,"line":269},[266,2618,409],{"class":280},[266,2620,2621,2623,2625,2627,2629],{"class":268,"line":361},[266,2622,579],{"class":578},[266,2624,560],{"class":582},[266,2626,389],{"class":578},[266,2628,588],{"class":280},[266,2630,591],{"class":280},[266,2632,2633,2635,2637,2639,2641],{"class":268,"line":367},[266,2634,596],{"class":578},[266,2636,308],{"class":599},[266,2638,389],{"class":578},[266,2640,588],{"class":280},[266,2642,591],{"class":280},[266,2644,2645,2647,2649,2651,2653,2655,2657,2659],{"class":268,"line":406},[266,2646,611],{"class":578},[266,2648,657],{"class":614},[266,2650,389],{"class":578},[266,2652,588],{"class":280},[266,2654,434],{"class":388},[266,2656,673],{"class":392},[266,2658,389],{"class":388},[266,2660,550],{"class":280},[266,2662,2663,2665,2667,2669,2671,2673,2676],{"class":268,"line":412},[266,2664,611],{"class":578},[266,2666,714],{"class":614},[266,2668,389],{"class":578},[266,2670,588],{"class":280},[266,2672,434],{"class":388},[266,2674,2675],{"class":392},"00:00:03",[266,2677,626],{"class":388},[266,2679,2680],{"class":268,"line":459},[266,2681,631],{"class":280},[266,2683,2684],{"class":268,"line":465},[266,2685,636],{"class":280},[266,2687,2688],{"class":268,"line":470},[266,2689,641],{"class":280},[170,2691,2692],{},"That one call does everything the manual registration above does:",[651,2694,2695,2701,2711,2720],{},[224,2696,2697,2698,2700],{},"Registers a single ",[177,2699,2207],{}," for the whole application, which the container disposes on shutdown.",[224,2702,2703,2704,2707,2708,2710],{},"Binds ",[177,2705,2706],{},"ConfigDirectorOptions"," from the ",[177,2709,560],{}," configuration section.",[224,2712,2713,2714,2716,2717,2719],{},"Routes the SDK's logging through the host's ",[177,2715,501],{},", so the ",[177,2718,583],{}," configuration already shown controls it.",[224,2721,2722,2723,2725],{},"Awaits ",[177,2724,245],{}," during startup, before the server accepts its first request.",[1612,2727,2728,2730,2731,2734,2735,2737,2738,2740,2741,2743,2744,281],{},[177,2729,2570],{}," lives in the ",[177,2732,2733],{},"Microsoft.Extensions.DependencyInjection"," namespace, so ",[177,2736,1441],{}," needs no ",[177,2739,351],{}," directive for it. Injecting ",[177,2742,2207],{}," into a controller or an endpoint does need ",[177,2745,2746],{},"using ConfigDirector;",[170,2748,2749,2750,2753],{},"The server SDK key is required, and it is validated when the host starts. A missing key therefore fails at startup with an ",[177,2751,2752],{},"OptionsValidationException"," naming the setting, rather than as a client that quietly evaluates every config to its default.",[238,2755,2756,2757,2759],{},"Server SDK keys are secret values. Do not commit them to ",[177,2758,566],{},". Provide them at runtime via environment variables, user secrets, or from a secret store in code.",[170,2761,2762,2763,2765],{},"A key held in a secret store is the usual reason to adjust the bound settings in code. A delegate passed to ",[177,2764,2570],{}," runs after binding, so it wins over configuration:",[256,2767,2769],{"className":258,"code":2768,"filename":1441,"language":261,"meta":262,"style":262},"builder.Services.AddConfigDirector(options => options.ServerSdkKey = secrets.ConfigDirectorKey);\n",[177,2770,2771],{"__ignoreMap":262},[266,2772,2773,2775,2777,2779,2781,2783,2785,2788,2791,2794,2796,2799,2801,2804,2806,2809],{"class":268,"line":269},[266,2774,2191],{"class":276},[266,2776,281],{"class":280},[266,2778,2196],{"class":276},[266,2780,281],{"class":280},[266,2782,2570],{"class":284},[266,2784,287],{"class":280},[266,2786,2787],{"class":374},"options",[266,2789,2790],{"class":272}," =>",[266,2792,2793],{"class":276}," options",[266,2795,281],{"class":280},[266,2797,2798],{"class":276},"ServerSdkKey ",[266,2800,418],{"class":272},[266,2802,2803],{"class":276}," secrets",[266,2805,281],{"class":280},[266,2807,2808],{"class":276},"ConfigDirectorKey",[266,2810,293],{"class":280},[170,2812,2813,2814,2816],{},"To bind somewhere other than the ",[177,2815,560],{}," section, pass the section itself:",[256,2818,2820],{"className":258,"code":2819,"filename":1441,"language":261,"meta":262,"style":262},"builder.Services.AddConfigDirector(builder.Configuration.GetSection(\"Features:ConfigDirector\"));\n",[177,2821,2822],{"__ignoreMap":262},[266,2823,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844,2847,2849,2851,2854,2856],{"class":268,"line":269},[266,2825,2191],{"class":276},[266,2827,281],{"class":280},[266,2829,2196],{"class":276},[266,2831,281],{"class":280},[266,2833,2570],{"class":284},[266,2835,287],{"class":280},[266,2837,2191],{"class":276},[266,2839,281],{"class":280},[266,2841,2233],{"class":276},[266,2843,281],{"class":280},[266,2845,2846],{"class":284},"GetSection",[266,2848,287],{"class":280},[266,2850,389],{"class":388},[266,2852,2853],{"class":392},"Features:ConfigDirector",[266,2855,389],{"class":388},[266,2857,1104],{"class":280},[170,2859,2860,2861,2864],{},"Both forms also accept the delegate, so ",[177,2862,2863],{},"AddConfigDirector(section, options => ...)"," binds and then adjusts.",[1612,2866,2867,2868,2871,2872,2874],{},"The client is registered with ",[177,2869,2870],{},"TryAdd",", so an ",[177,2873,2207],{}," already present in the service collection is left alone. That is how a test substitutes a fake without the real client ever being built.",[295,2876,2878],{"id":2877},"aspnet-core-configuration-options","ASP.NET Core configuration options",[170,2880,2881,2882,2884],{},"The bound section maps to ",[177,2883,2706],{},", which has the following values:",[651,2886,2887,2897,2910,2927,2941,2963],{},[224,2888,2889,2892],{},[177,2890,2891],{},"ServerSdkKey",[651,2893,2894],{},[224,2895,2896],{},"Your server SDK key. Required.",[224,2898,2899,2902],{},[177,2900,2901],{},"AppName",[651,2903,2904],{},[224,2905,2906,2907,281],{},"The application name that targeting rules can match on. Defaults to the host's ",[177,2908,2909],{},"IHostEnvironment.ApplicationName",[224,2911,2912,2915],{},[177,2913,2914],{},"AppVersion",[651,2916,2917],{},[224,2918,2919,2920,2923,2924,281],{},"The application version that targeting rules match by semver rules. Defaults to the entry assembly's informational version, with any build metadata suffix removed, so ",[177,2921,2922],{},"1.2.3+9f4c1a"," is reported as ",[177,2925,2926],{},"1.2.3",[224,2928,2929,2932],{},[177,2930,2931],{},"RequireReadyOnStartup",[651,2933,2934,2937],{},[224,2935,2936],{},"Whether a host that has not reached ConfigDirector by the end of startup fails to start.",[224,2938,681,2939,281],{},[177,2940,1295],{},[224,2942,2943,2945],{},[177,2944,308],{},[651,2946,2947],{},[224,2948,2949,2950,2953,2954,1090,2956,1090,2958,2960,2961,281],{},"The same ",[177,2951,2952],{},"ConnectionOptions"," described above: ",[177,2955,657],{},[177,2957,688],{},[177,2959,714],{},", and ",[177,2962,326],{},[224,2964,2965,2967],{},[177,2966,311],{},[651,2968,2969],{},[224,2970,2949,2971,2953,2974,180,2976,281],{},[177,2972,2973],{},"TelemetryOptions",[177,2975,898],{},[177,2977,914],{},[170,2979,2980,180,2982,2984],{},[177,2981,308],{},[177,2983,311],{}," are the SDK's own option types rather than copies of them, so everything already described for those applies here unchanged:",[256,2986,2988],{"className":564,"code":2987,"filename":566,"language":567,"meta":262,"style":262},"{\n  \"ConfigDirector\": {\n    \"AppName\": \"checkout\",\n    \"AppVersion\": \"1.0.2\",\n    \"RequireReadyOnStartup\": false,\n    \"Connection\": {\n      \"Mode\": \"Polling\",\n      \"PollingInterval\": \"00:10:00\",\n      \"Timeout\": \"00:00:05\"\n    },\n    \"Telemetry\": {\n      \"EventQueueLimit\": 10000,\n      \"FlushInterval\": \"00:00:15\"\n    }\n  }\n}\n",[177,2989,2990,2994,3006,3025,3043,3058,3070,3088,3107,3124,3128,3140,3155,3172,3176,3180],{"__ignoreMap":262},[266,2991,2992],{"class":268,"line":269},[266,2993,409],{"class":280},[266,2995,2996,2998,3000,3002,3004],{"class":268,"line":361},[266,2997,579],{"class":578},[266,2999,560],{"class":582},[266,3001,389],{"class":578},[266,3003,588],{"class":280},[266,3005,591],{"class":280},[266,3007,3008,3010,3012,3014,3016,3018,3021,3023],{"class":268,"line":367},[266,3009,596],{"class":578},[266,3011,2901],{"class":599},[266,3013,389],{"class":578},[266,3015,588],{"class":280},[266,3017,434],{"class":388},[266,3019,3020],{"class":392},"checkout",[266,3022,389],{"class":388},[266,3024,550],{"class":280},[266,3026,3027,3029,3031,3033,3035,3037,3039,3041],{"class":268,"line":406},[266,3028,596],{"class":578},[266,3030,2914],{"class":599},[266,3032,389],{"class":578},[266,3034,588],{"class":280},[266,3036,434],{"class":388},[266,3038,451],{"class":392},[266,3040,389],{"class":388},[266,3042,550],{"class":280},[266,3044,3045,3047,3049,3051,3053,3056],{"class":268,"line":412},[266,3046,596],{"class":578},[266,3048,2931],{"class":599},[266,3050,389],{"class":578},[266,3052,588],{"class":280},[266,3054,3055],{"class":578}," false",[266,3057,550],{"class":280},[266,3059,3060,3062,3064,3066,3068],{"class":268,"line":459},[266,3061,596],{"class":578},[266,3063,308],{"class":599},[266,3065,389],{"class":578},[266,3067,588],{"class":280},[266,3069,591],{"class":280},[266,3071,3072,3074,3076,3078,3080,3082,3084,3086],{"class":268,"line":465},[266,3073,611],{"class":578},[266,3075,657],{"class":614},[266,3077,389],{"class":578},[266,3079,588],{"class":280},[266,3081,434],{"class":388},[266,3083,677],{"class":392},[266,3085,389],{"class":388},[266,3087,550],{"class":280},[266,3089,3090,3092,3094,3096,3098,3100,3103,3105],{"class":268,"line":470},[266,3091,611],{"class":578},[266,3093,688],{"class":614},[266,3095,389],{"class":578},[266,3097,588],{"class":280},[266,3099,434],{"class":388},[266,3101,3102],{"class":392},"00:10:00",[266,3104,389],{"class":388},[266,3106,550],{"class":280},[266,3108,3109,3111,3113,3115,3117,3119,3122],{"class":268,"line":848},[266,3110,611],{"class":578},[266,3112,714],{"class":614},[266,3114,389],{"class":578},[266,3116,588],{"class":280},[266,3118,434],{"class":388},[266,3120,3121],{"class":392},"00:00:05",[266,3123,626],{"class":388},[266,3125,3126],{"class":268,"line":869},[266,3127,872],{"class":280},[266,3129,3130,3132,3134,3136,3138],{"class":268,"line":875},[266,3131,596],{"class":578},[266,3133,311],{"class":599},[266,3135,389],{"class":578},[266,3137,588],{"class":280},[266,3139,591],{"class":280},[266,3141,3142,3144,3146,3148,3150,3153],{"class":268,"line":1608},[266,3143,611],{"class":578},[266,3145,898],{"class":614},[266,3147,389],{"class":578},[266,3149,588],{"class":280},[266,3151,3152],{"class":614}," 10000",[266,3154,550],{"class":280},[266,3156,3157,3159,3161,3163,3165,3167,3170],{"class":268,"line":1877},[266,3158,611],{"class":578},[266,3160,914],{"class":614},[266,3162,389],{"class":578},[266,3164,588],{"class":280},[266,3166,434],{"class":388},[266,3168,3169],{"class":392},"00:00:15",[266,3171,626],{"class":388},[266,3173,3174],{"class":268,"line":2324},[266,3175,631],{"class":280},[266,3177,3178],{"class":268,"line":2330},[266,3179,636],{"class":280},[266,3181,3182],{"class":268,"line":2356},[266,3183,641],{"class":280},[170,3185,3186],{},"Nested settings follow the usual environment variable convention, with a double underscore between levels:",[256,3188,3190],{"className":2427,"code":3189,"language":2430,"meta":262,"style":262},"ConfigDirector__ServerSdkKey=YOUR-SERVER-SDK-KEY\nConfigDirector__Connection__Mode=Polling\n",[177,3191,3192,3202],{"__ignoreMap":262},[266,3193,3194,3197,3199],{"class":268,"line":269},[266,3195,3196],{"class":276},"ConfigDirector__ServerSdkKey",[266,3198,418],{"class":272},[266,3200,3201],{"class":392},"YOUR-SERVER-SDK-KEY\n",[266,3203,3204,3207,3209],{"class":268,"line":361},[266,3205,3206],{"class":276},"ConfigDirector__Connection__Mode",[266,3208,418],{"class":272},[266,3210,3211],{"class":392},"Polling\n",[1612,3213,3214],{},"Settings are read once, when the client is first resolved. Reloading configuration afterwards does not reach a client that has already been built.",[295,3216,3218],{"id":3217},"startup-initialization","Startup initialization",[170,3220,3221],{},"The package connects during startup rather than on the first request, and it does so before the server begins listening, so no request is served config defaults while the first config state is still in flight.",[170,3223,3224,3225,3227,3228,588],{},"By default, a host that cannot reach ConfigDirector still starts. It logs a warning, and every config resolves to the default its caller supplied until config state arrives, which is the SDK's own posture. Set ",[177,3226,2931],{}," to fail startup instead, with a ",[177,3229,3230],{},"ConfigDirectorConnectionException",[256,3232,3234],{"className":564,"code":3233,"filename":566,"language":567,"meta":262,"style":262},"{\n  \"ConfigDirector\": {\n    \"RequireReadyOnStartup\": true\n  }\n}\n",[177,3235,3236,3240,3252,3265,3269],{"__ignoreMap":262},[266,3237,3238],{"class":268,"line":269},[266,3239,409],{"class":280},[266,3241,3242,3244,3246,3248,3250],{"class":268,"line":361},[266,3243,579],{"class":578},[266,3245,560],{"class":582},[266,3247,389],{"class":578},[266,3249,588],{"class":280},[266,3251,591],{"class":280},[266,3253,3254,3256,3258,3260,3262],{"class":268,"line":367},[266,3255,596],{"class":578},[266,3257,2931],{"class":599},[266,3259,389],{"class":578},[266,3261,588],{"class":280},[266,3263,3264],{"class":578}," true\n",[266,3266,3267],{"class":268,"line":406},[266,3268,636],{"class":280},[266,3270,3271],{"class":268,"line":412},[266,3272,641],{"class":280},[170,3274,3275],{},"Registering a watch is the one thing that still happens in code, between building the application and running it. Resolving the client there builds it without making any network calls; the connection is opened later, as the host starts. A watch registered in that gap is called for the first config state as well as for the updates after it:",[256,3277,3279],{"className":258,"code":3278,"filename":1441,"language":261,"meta":262,"style":262},"var app = builder.Build();\n\nvar client = app.Services.GetRequiredService\u003CIConfigDirectorClient>();\n\nclient.Watch(\"new-checkout\", false, enabled =>\n    app.Logger.LogInformation(\"new-checkout is now {Enabled}\", enabled));\n\napp.Run();\n",[177,3280,3281,3297,3301,3326,3330,3357,3387,3391],{"__ignoreMap":262},[266,3282,3283,3285,3287,3289,3291,3293,3295],{"class":268,"line":269},[266,3284,371],{"class":370},[266,3286,2300],{"class":374},[266,3288,377],{"class":272},[266,3290,2305],{"class":276},[266,3292,281],{"class":280},[266,3294,2310],{"class":284},[266,3296,481],{"class":280},[266,3298,3299],{"class":268,"line":361},[266,3300,364],{"emptyLinePlaceholder":32},[266,3302,3303,3305,3307,3309,3311,3313,3315,3317,3319,3321,3323],{"class":268,"line":367},[266,3304,371],{"class":370},[266,3306,277],{"class":374},[266,3308,377],{"class":272},[266,3310,2300],{"class":276},[266,3312,281],{"class":280},[266,3314,2196],{"class":276},[266,3316,281],{"class":280},[266,3318,2277],{"class":284},[266,3320,2204],{"class":280},[266,3322,2207],{"class":374},[266,3324,3325],{"class":280},">();\n",[266,3327,3328],{"class":268,"line":406},[266,3329,364],{"emptyLinePlaceholder":32},[266,3331,3332,3334,3336,3338,3340,3342,3344,3346,3348,3350,3352,3355],{"class":268,"line":412},[266,3333,1113],{"class":276},[266,3335,281],{"class":280},[266,3337,1201],{"class":284},[266,3339,287],{"class":280},[266,3341,389],{"class":388},[266,3343,1946],{"class":392},[266,3345,389],{"class":388},[266,3347,398],{"class":280},[266,3349,3055],{"class":1955},[266,3351,398],{"class":280},[266,3353,3354],{"class":374}," enabled",[266,3356,1063],{"class":272},[266,3358,3359,3362,3364,3367,3369,3372,3374,3376,3379,3381,3383,3385],{"class":268,"line":459},[266,3360,3361],{"class":276},"    app",[266,3363,281],{"class":280},[266,3365,3366],{"class":276},"Logger",[266,3368,281],{"class":280},[266,3370,3371],{"class":284},"LogInformation",[266,3373,287],{"class":280},[266,3375,389],{"class":388},[266,3377,3378],{"class":392},"new-checkout is now {Enabled}",[266,3380,389],{"class":388},[266,3382,398],{"class":280},[266,3384,3354],{"class":276},[266,3386,1104],{"class":280},[266,3388,3389],{"class":268,"line":465},[266,3390,364],{"emptyLinePlaceholder":32},[266,3392,3393,3395,3397,3399],{"class":268,"line":470},[266,3394,2364],{"class":276},[266,3396,281],{"class":280},[266,3398,2369],{"class":284},[266,3400,481],{"class":280},[295,3402,3404],{"id":3403},"the-user-context-for-a-request","The user context for a request",[170,3406,3407,3410,3411,3413],{},[177,3408,3409],{},"WithContext"," declares once how a request becomes an evaluation ",[177,3412,1645],{},", rather than repeating it in every action:",[256,3415,3417],{"className":258,"code":3416,"filename":1441,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nbuilder.Services.AddConfigDirector()\n    .WithContext(http => new Context\n    {\n        Id = http.User.FindFirst(\"sub\")?.Value,\n        Traits =\n        {\n            [\"region\"] = http.Request.Headers[\"X-Region\"].ToString(),\n        },\n    });\n",[177,3418,3419,3427,3431,3446,3464,3468,3506,3512,3516,3561,3566],{"__ignoreMap":262},[266,3420,3421,3423,3425],{"class":268,"line":269},[266,3422,351],{"class":350},[266,3424,355],{"class":354},[266,3426,358],{"class":280},[266,3428,3429],{"class":268,"line":361},[266,3430,364],{"emptyLinePlaceholder":32},[266,3432,3433,3435,3437,3439,3441,3443],{"class":268,"line":367},[266,3434,2191],{"class":276},[266,3436,281],{"class":280},[266,3438,2196],{"class":276},[266,3440,281],{"class":280},[266,3442,2570],{"class":284},[266,3444,3445],{"class":280},"()\n",[266,3447,3448,3451,3453,3455,3458,3460,3462],{"class":268,"line":406},[266,3449,3450],{"class":280},"    .",[266,3452,3409],{"class":284},[266,3454,287],{"class":280},[266,3456,3457],{"class":374},"http",[266,3459,2790],{"class":272},[266,3461,380],{"class":272},[266,3463,1737],{"class":374},[266,3465,3466],{"class":268,"line":412},[266,3467,806],{"class":280},[266,3469,3470,3472,3474,3477,3479,3482,3484,3487,3489,3491,3494,3496,3498,3500,3502,3504],{"class":268,"line":459},[266,3471,2010],{"class":276},[266,3473,418],{"class":272},[266,3475,3476],{"class":276}," http",[266,3478,281],{"class":280},[266,3480,3481],{"class":276},"User",[266,3483,281],{"class":280},[266,3485,3486],{"class":284},"FindFirst",[266,3488,287],{"class":280},[266,3490,389],{"class":388},[266,3492,3493],{"class":392},"sub",[266,3495,389],{"class":388},[266,3497,1060],{"class":280},[266,3499,1046],{"class":272},[266,3501,281],{"class":280},[266,3503,1237],{"class":276},[266,3505,550],{"class":280},[266,3507,3508,3510],{"class":268,"line":465},[266,3509,2040],{"class":276},[266,3511,801],{"class":272},[266,3513,3514],{"class":268,"line":470},[266,3515,2262],{"class":280},[266,3517,3518,3521,3523,3525,3527,3529,3531,3533,3535,3538,3540,3543,3545,3547,3550,3552,3555,3558],{"class":268,"line":848},[266,3519,3520],{"class":280},"            [",[266,3522,389],{"class":388},[266,3524,1794],{"class":392},[266,3526,389],{"class":388},[266,3528,1799],{"class":280},[266,3530,377],{"class":272},[266,3532,3476],{"class":276},[266,3534,281],{"class":280},[266,3536,3537],{"class":276},"Request",[266,3539,281],{"class":280},[266,3541,3542],{"class":276},"Headers",[266,3544,2236],{"class":280},[266,3546,389],{"class":388},[266,3548,3549],{"class":392},"X-Region",[266,3551,389],{"class":388},[266,3553,3554],{"class":280},"].",[266,3556,3557],{"class":284},"ToString",[266,3559,3560],{"class":280},"(),\n",[266,3562,3563],{"class":268,"line":869},[266,3564,3565],{"class":280},"        },\n",[266,3567,3568],{"class":268,"line":875},[266,3569,2070],{"class":280},[170,3571,3572,3573,3576,3577,3579],{},"Actions then take an ",[177,3574,3575],{},"IConfigDirectorContextAccessor"," and read ",[177,3578,1645],{}," from it, instead of each one rebuilding the context itself:",[256,3581,3584],{"className":258,"code":3582,"filename":3583,"language":261,"meta":262,"style":262},"using ConfigDirector;\nusing Microsoft.AspNetCore.Mvc;\n\n[ApiController]\n[Route(\"configs\")]\npublic sealed class ConfigsController : ControllerBase\n{\n    private readonly IConfigDirectorClient _client;\n    private readonly IConfigDirectorContextAccessor _context;\n\n    public ConfigsController(IConfigDirectorClient client, IConfigDirectorContextAccessor context)\n    {\n        _client = client;\n        _context = context;\n    }\n\n    [HttpGet]\n    public bool Get() => _client.GetValue(\"new-checkout\", false, _context.Context);\n}\n","ConfigsController.cs",[177,3585,3586,3594,3613,3617,3627,3646,3664,3668,3684,3698,3702,3723,3727,3738,3749,3753,3757,3767,3811],{"__ignoreMap":262},[266,3587,3588,3590,3592],{"class":268,"line":269},[266,3589,351],{"class":350},[266,3591,355],{"class":354},[266,3593,358],{"class":280},[266,3595,3596,3598,3601,3603,3606,3608,3611],{"class":268,"line":361},[266,3597,351],{"class":350},[266,3599,3600],{"class":354}," Microsoft",[266,3602,281],{"class":280},[266,3604,3605],{"class":354},"AspNetCore",[266,3607,281],{"class":280},[266,3609,3610],{"class":354},"Mvc",[266,3612,358],{"class":280},[266,3614,3615],{"class":268,"line":367},[266,3616,364],{"emptyLinePlaceholder":32},[266,3618,3619,3621,3624],{"class":268,"line":406},[266,3620,2236],{"class":280},[266,3622,3623],{"class":374},"ApiController",[266,3625,3626],{"class":280},"]\n",[266,3628,3629,3631,3634,3636,3638,3641,3643],{"class":268,"line":412},[266,3630,2236],{"class":280},[266,3632,3633],{"class":374},"Route",[266,3635,287],{"class":280},[266,3637,389],{"class":388},[266,3639,3640],{"class":392},"configs",[266,3642,389],{"class":388},[266,3644,3645],{"class":280},")]\n",[266,3647,3648,3650,3652,3655,3658,3661],{"class":268,"line":459},[266,3649,1559],{"class":1558},[266,3651,1562],{"class":1558},[266,3653,3654],{"class":370}," class",[266,3656,3657],{"class":374}," ConfigsController",[266,3659,3660],{"class":280}," :",[266,3662,3663],{"class":374}," ControllerBase\n",[266,3665,3666],{"class":268,"line":465},[266,3667,409],{"class":280},[266,3669,3670,3673,3676,3679,3682],{"class":268,"line":470},[266,3671,3672],{"class":1558},"    private",[266,3674,3675],{"class":1558}," readonly",[266,3677,3678],{"class":374}," IConfigDirectorClient",[266,3680,3681],{"class":374}," _client",[266,3683,358],{"class":280},[266,3685,3686,3688,3690,3693,3696],{"class":268,"line":848},[266,3687,3672],{"class":1558},[266,3689,3675],{"class":1558},[266,3691,3692],{"class":374}," IConfigDirectorContextAccessor",[266,3694,3695],{"class":374}," _context",[266,3697,358],{"class":280},[266,3699,3700],{"class":268,"line":869},[266,3701,364],{"emptyLinePlaceholder":32},[266,3703,3704,3706,3708,3710,3712,3714,3716,3718,3720],{"class":268,"line":875},[266,3705,1577],{"class":1558},[266,3707,3657],{"class":284},[266,3709,287],{"class":280},[266,3711,2207],{"class":374},[266,3713,277],{"class":374},[266,3715,398],{"class":280},[266,3717,3692],{"class":374},[266,3719,1730],{"class":374},[266,3721,3722],{"class":280},")\n",[266,3724,3725],{"class":268,"line":1608},[266,3726,806],{"class":280},[266,3728,3729,3732,3734,3736],{"class":268,"line":1877},[266,3730,3731],{"class":276},"        _client ",[266,3733,418],{"class":272},[266,3735,277],{"class":276},[266,3737,358],{"class":280},[266,3739,3740,3743,3745,3747],{"class":268,"line":2324},[266,3741,3742],{"class":276},"        _context ",[266,3744,418],{"class":272},[266,3746,1730],{"class":276},[266,3748,358],{"class":280},[266,3750,3751],{"class":268,"line":2330},[266,3752,631],{"class":280},[266,3754,3755],{"class":268,"line":2356},[266,3756,364],{"emptyLinePlaceholder":32},[266,3758,3759,3762,3765],{"class":268,"line":2361},[266,3760,3761],{"class":280},"    [",[266,3763,3764],{"class":374},"HttpGet",[266,3766,3626],{"class":280},[266,3768,3770,3772,3775,3778,3781,3783,3785,3787,3789,3791,3793,3795,3797,3799,3801,3803,3805,3807,3809],{"class":268,"line":3769},18,[266,3771,1577],{"class":1558},[266,3773,3774],{"class":272}," bool",[266,3776,3777],{"class":284}," Get",[266,3779,3780],{"class":280},"()",[266,3782,2790],{"class":272},[266,3784,3681],{"class":276},[266,3786,281],{"class":280},[266,3788,1428],{"class":284},[266,3790,287],{"class":280},[266,3792,389],{"class":388},[266,3794,1946],{"class":392},[266,3796,389],{"class":388},[266,3798,398],{"class":280},[266,3800,3055],{"class":1955},[266,3802,398],{"class":280},[266,3804,3695],{"class":276},[266,3806,281],{"class":280},[266,3808,1645],{"class":276},[266,3810,293],{"class":280},[266,3812,3814],{"class":268,"line":3813},19,[266,3815,641],{"class":280},[170,3817,3818,3819,3821,3822,3824,3825,3827],{},"The delegate runs at most once per request, the first time the context is asked for, so several evaluations in one action cost one call to it. It may return ",[177,3820,1241],{}," to evaluate without a context. ",[177,3823,1645],{}," is also ",[177,3826,1241],{}," when no request is in flight, which is what a background service reading the accessor sees.",[1612,3829,3830,3832,3833,3835],{},[177,3831,3575],{}," is registered only when ",[177,3834,3409],{}," has been called. Injecting it without that fails at resolution, rather than quietly evaluating every config with no context, which would disable targeting without saying so.",[295,3837,3839],{"id":3838},"health-checks","Health checks",[256,3841,3843],{"className":258,"code":3842,"filename":1441,"language":261,"meta":262,"style":262},"builder.Services.AddHealthChecks().AddConfigDirector();\n\nvar app = builder.Build();\n\napp.MapHealthChecks(\"\u002Fhealth\");\n",[177,3844,3845,3865,3869,3885,3889],{"__ignoreMap":262},[266,3846,3847,3849,3851,3853,3855,3858,3861,3863],{"class":268,"line":269},[266,3848,2191],{"class":276},[266,3850,281],{"class":280},[266,3852,2196],{"class":276},[266,3854,281],{"class":280},[266,3856,3857],{"class":284},"AddHealthChecks",[266,3859,3860],{"class":280},"().",[266,3862,2570],{"class":284},[266,3864,481],{"class":280},[266,3866,3867],{"class":268,"line":361},[266,3868,364],{"emptyLinePlaceholder":32},[266,3870,3871,3873,3875,3877,3879,3881,3883],{"class":268,"line":367},[266,3872,371],{"class":370},[266,3874,2300],{"class":374},[266,3876,377],{"class":272},[266,3878,2305],{"class":276},[266,3880,281],{"class":280},[266,3882,2310],{"class":284},[266,3884,481],{"class":280},[266,3886,3887],{"class":268,"line":406},[266,3888,364],{"emptyLinePlaceholder":32},[266,3890,3891,3893,3895,3898,3900,3902,3905,3907],{"class":268,"line":412},[266,3892,2364],{"class":276},[266,3894,281],{"class":280},[266,3896,3897],{"class":284},"MapHealthChecks",[266,3899,287],{"class":280},[266,3901,389],{"class":388},[266,3903,3904],{"class":392},"\u002Fhealth",[266,3906,389],{"class":388},[266,3908,293],{"class":280},[170,3910,3911,3912,3915,3916,3919,3920,3923],{},"The check reports ",[177,3913,3914],{},"Healthy"," once config state has arrived. Until it does, it reports ",[177,3917,3918],{},"Degraded"," rather than ",[177,3921,3922],{},"Unhealthy",": the application still answers every request, with each config resolving to the default its caller supplied, so taking the instance out of rotation is the wrong response to ConfigDirector being unreachable.",[170,3925,3926],{},"Pass a failure status to say otherwise, along with the name the check is registered under and any tags to filter it by:",[256,3928,3930],{"className":258,"code":3929,"filename":1441,"language":261,"meta":262,"style":262},"using Microsoft.Extensions.Diagnostics.HealthChecks;\n\nbuilder.Services.AddHealthChecks()\n    .AddConfigDirector(\n        name: \"configdirector\",\n        failureStatus: HealthStatus.Unhealthy,\n        tags: [\"ready\"]);\n",[177,3931,3932,3955,3959,3973,3981,3997,4013],{"__ignoreMap":262},[266,3933,3934,3936,3938,3940,3943,3945,3948,3950,3953],{"class":268,"line":269},[266,3935,351],{"class":350},[266,3937,3600],{"class":354},[266,3939,281],{"class":280},[266,3941,3942],{"class":354},"Extensions",[266,3944,281],{"class":280},[266,3946,3947],{"class":354},"Diagnostics",[266,3949,281],{"class":280},[266,3951,3952],{"class":354},"HealthChecks",[266,3954,358],{"class":280},[266,3956,3957],{"class":268,"line":361},[266,3958,364],{"emptyLinePlaceholder":32},[266,3960,3961,3963,3965,3967,3969,3971],{"class":268,"line":367},[266,3962,2191],{"class":276},[266,3964,281],{"class":280},[266,3966,2196],{"class":276},[266,3968,281],{"class":280},[266,3970,3857],{"class":284},[266,3972,3445],{"class":280},[266,3974,3975,3977,3979],{"class":268,"line":406},[266,3976,3450],{"class":280},[266,3978,2570],{"class":284},[266,3980,1939],{"class":280},[266,3982,3983,3986,3988,3990,3993,3995],{"class":268,"line":412},[266,3984,3985],{"class":374},"        name",[266,3987,588],{"class":280},[266,3989,434],{"class":388},[266,3991,3992],{"class":392},"configdirector",[266,3994,389],{"class":388},[266,3996,550],{"class":280},[266,3998,3999,4002,4004,4007,4009,4011],{"class":268,"line":459},[266,4000,4001],{"class":374},"        failureStatus",[266,4003,588],{"class":280},[266,4005,4006],{"class":276}," HealthStatus",[266,4008,281],{"class":280},[266,4010,3922],{"class":276},[266,4012,550],{"class":280},[266,4014,4015,4018,4020,4022,4024,4027,4029],{"class":268,"line":465},[266,4016,4017],{"class":374},"        tags",[266,4019,588],{"class":280},[266,4021,2047],{"class":280},[266,4023,389],{"class":388},[266,4025,4026],{"class":392},"ready",[266,4028,389],{"class":388},[266,4030,4031],{"class":280},"]);\n",[170,4033,4034,4037,4038,180,4040,4043,4044,4047,4048,4050],{},[177,4035,4036],{},"name"," defaults to ",[177,4039,3992],{},[177,4041,4042],{},"failureStatus"," to ",[177,4045,4046],{},"HealthStatus.Degraded",". A client that has been disposed always reports ",[177,4049,3922],{},", whatever failure status is configured, since it cannot be reopened.",[4052,4053,4054],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":262,"searchDepth":361,"depth":361,"links":4056},[4057,4058,4059,4063,4068,4076],{"id":167,"depth":361,"text":168},{"id":203,"depth":361,"text":204},{"id":218,"depth":361,"text":219,"children":4060},[4061,4062],{"id":297,"depth":367,"text":298},{"id":1014,"depth":367,"text":1015},{"id":1322,"depth":361,"text":1323,"children":4064},[4065,4066,4067],{"id":1422,"depth":367,"text":1423},{"id":1635,"depth":367,"text":1636},{"id":1883,"depth":367,"text":1884},{"id":2082,"depth":361,"text":2083,"children":4069},[4070,4071,4072,4073,4074,4075],{"id":2089,"depth":367,"text":249},{"id":2103,"depth":367,"text":2106},{"id":2112,"depth":367,"text":2115},{"id":2131,"depth":367,"text":2134},{"id":2140,"depth":367,"text":2143},{"id":2149,"depth":367,"text":2150},{"id":2389,"depth":361,"text":199,"children":4077},[4078,4079,4080,4081,4082,4083],{"id":2413,"depth":367,"text":2414},{"id":2524,"depth":367,"text":2525},{"id":2877,"depth":367,"text":2878},{"id":3217,"depth":367,"text":3218},{"id":3403,"depth":367,"text":3404},{"id":3838,"depth":367,"text":3839},"md",null,{},{"title":134,"icon":137},{"title":150,"description":262},"yE9MXiuUF0wKd1pSHwkM19FLkOi4ii-ajfgCbvtmI0I",[4091,4092],{"title":129,"path":130,"stem":131,"description":262,"icon":132,"children":-1},{"title":144,"path":145,"stem":146,"description":262,"icon":147,"children":-1},{"id":4094,"title":4095,"body":4096,"description":262,"extension":4084,"links":4085,"meta":4174,"navigation":6,"path":4175,"seo":4176,"stem":4177,"__hash__":4178},"docs\u002F_partials\u002Fsdks\u002Fdotnet\u002Finstall.md","Install",{"type":152,"value":4097,"toc":4172},[4098,4169],[2423,4099,4100,4120],{},[256,4101,4103],{"className":2427,"code":4102,"filename":2429,"language":2430,"meta":262,"style":262},"dotnet add package ConfigDirector.ServerSdk --version 1.2.0\n",[177,4104,4105],{"__ignoreMap":262},[266,4106,4107,4109,4111,4113,4116,4118],{"class":268,"line":269},[266,4108,157],{"class":374},[266,4110,2439],{"class":392},[266,4112,2442],{"class":392},[266,4114,4115],{"class":392}," ConfigDirector.ServerSdk",[266,4117,2449],{"class":2448},[266,4119,2452],{"class":614},[256,4121,4123],{"className":2455,"code":4122,"filename":2457,"language":2458,"meta":262,"style":262},"\u003CItemGroup>\n  \u003CPackageReference Include=\"ConfigDirector.ServerSdk\" Version=\"1.2.0\" \u002F>\n\u003C\u002FItemGroup>\n",[177,4124,4125,4133,4161],{"__ignoreMap":262},[266,4126,4127,4129,4131],{"class":268,"line":269},[266,4128,2204],{"class":280},[266,4130,2468],{"class":2467},[266,4132,2471],{"class":280},[266,4134,4135,4137,4139,4141,4143,4145,4147,4149,4151,4153,4155,4157,4159],{"class":268,"line":361},[266,4136,2476],{"class":280},[266,4138,2479],{"class":2467},[266,4140,2483],{"class":2482},[266,4142,418],{"class":280},[266,4144,389],{"class":388},[266,4146,2409],{"class":392},[266,4148,389],{"class":388},[266,4150,2494],{"class":2482},[266,4152,418],{"class":280},[266,4154,389],{"class":388},[266,4156,2501],{"class":392},[266,4158,389],{"class":388},[266,4160,2506],{"class":280},[266,4162,4163,4165,4167],{"class":268,"line":367},[266,4164,2511],{"class":280},[266,4166,2468],{"class":2467},[266,4168,2471],{"class":280},[4052,4170,4171],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":262,"searchDepth":361,"depth":361,"links":4173},[],{},"\u002F_partials\u002Fsdks\u002Fdotnet\u002Finstall",{"description":262},"_partials\u002Fsdks\u002Fdotnet\u002Finstall","D4R5wjJ19E0a5Jli3Io8dzbzg_xondJu8DJH0gnh89M",{"id":4180,"title":4181,"body":4182,"description":262,"extension":4084,"links":4085,"meta":4279,"navigation":6,"path":4280,"seo":4281,"stem":4282,"__hash__":4283},"docs\u002F_partials\u002Fsdks\u002Fdotnet\u002Fconfigure.md","Configure",{"type":152,"value":4183,"toc":4277},[4184,4271,4274],[256,4185,4187],{"className":258,"code":4186,"filename":260,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\n\u002F\u002F IMPORTANT: Do not commit the server SDK key to your source code, it is a secret value.\n\u002F\u002F Building the client makes no network calls.\nawait using var client = new ConfigDirectorClient(\"YOUR-SERVER-SDK-KEY\");\n\n\u002F\u002F Waits until the client is initialized or it times out.\n\u002F\u002F If initialization times out, the client will continue attempting to\n\u002F\u002F initialize in the background.\nawait client.InitializeAsync();\n",[177,4188,4189,4197,4201,4206,4211,4240,4244,4249,4254,4259],{"__ignoreMap":262},[266,4190,4191,4193,4195],{"class":268,"line":269},[266,4192,351],{"class":350},[266,4194,355],{"class":354},[266,4196,358],{"class":280},[266,4198,4199],{"class":268,"line":361},[266,4200,364],{"emptyLinePlaceholder":32},[266,4202,4203],{"class":268,"line":367},[266,4204,4205],{"class":1146},"\u002F\u002F IMPORTANT: Do not commit the server SDK key to your source code, it is a secret value.\n",[266,4207,4208],{"class":268,"line":406},[266,4209,4210],{"class":1146},"\u002F\u002F Building the client makes no network calls.\n",[266,4212,4213,4215,4219,4222,4224,4226,4228,4230,4232,4234,4236,4238],{"class":268,"line":412},[266,4214,273],{"class":272},[266,4216,4218],{"class":4217},"sVHd0"," using",[266,4220,4221],{"class":370}," var",[266,4223,277],{"class":374},[266,4225,377],{"class":272},[266,4227,380],{"class":272},[266,4229,383],{"class":374},[266,4231,287],{"class":280},[266,4233,389],{"class":388},[266,4235,393],{"class":392},[266,4237,389],{"class":388},[266,4239,293],{"class":280},[266,4241,4242],{"class":268,"line":459},[266,4243,364],{"emptyLinePlaceholder":32},[266,4245,4246],{"class":268,"line":465},[266,4247,4248],{"class":1146},"\u002F\u002F Waits until the client is initialized or it times out.\n",[266,4250,4251],{"class":268,"line":470},[266,4252,4253],{"class":1146},"\u002F\u002F If initialization times out, the client will continue attempting to\n",[266,4255,4256],{"class":268,"line":848},[266,4257,4258],{"class":1146},"\u002F\u002F initialize in the background.\n",[266,4260,4261,4263,4265,4267,4269],{"class":268,"line":869},[266,4262,273],{"class":272},[266,4264,277],{"class":276},[266,4266,281],{"class":280},[266,4268,245],{"class":284},[266,4270,481],{"class":280},[170,4272,4273],{},"The client is thread safe. Create one at startup, share it for the lifetime of the process, and dispose it on shutdown.",[4052,4275,4276],{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":262,"searchDepth":361,"depth":361,"links":4278},[],{},"\u002F_partials\u002Fsdks\u002Fdotnet\u002Fconfigure",{"description":262},"_partials\u002Fsdks\u002Fdotnet\u002Fconfigure","d9Sf62lQ_MrCJcb6W2W6_L92nmaXkr8HHEml8VKBr6w",{"id":4285,"title":4286,"body":4287,"description":4554,"extension":4084,"links":4085,"meta":4555,"navigation":6,"path":4556,"seo":4557,"stem":4558,"__hash__":4559},"docs\u002F_partials\u002Fsdks\u002Fdotnet\u002Fsimple-usage.md","Simple Usage",{"type":152,"value":4288,"toc":4552},[4289,4298,4549],[170,4290,4291,4292,4294,4295,4297],{},"Retrieve config values via the typed ",[177,4293,1428],{}," overloads, and subscribe to updates via ",[177,4296,1201],{},". The first argument is the config key and the second is the default value, which is returned if the config is not available or cannot be read as the given type. The type of the default value decides the type the config is read as:",[256,4299,4301],{"className":258,"code":4300,"filename":1441,"language":261,"meta":262,"style":262},"using System.Text.Json;\n\n\u002F\u002F Retrieve config values\nvar retries = client.GetValue(\"max-retries\", 3);\nvar theme = client.GetValue(\"theme\", \"light\");\nvar newCheckout = client.GetValue(\"new-checkout\", false);\nvar limits = client.GetValue(\"rate-limits\", default(JsonElement)); \u002F\u002F JSON config\n\n\u002F\u002F Watch for config updates\nvar subscription = client.Watch(\n    \"new-checkout\",\n    false,\n    value => Console.WriteLine($\"new-checkout is now {value}\"));\n\n\u002F\u002F Dispose the subscription when it is no longer needed\nsubscription.Dispose();\n",[177,4302,4303,4319,4323,4328,4359,4394,4423,4459,4463,4468,4484,4494,4500,4528,4532,4537],{"__ignoreMap":262},[266,4304,4305,4307,4309,4311,4313,4315,4317],{"class":268,"line":269},[266,4306,351],{"class":350},[266,4308,1450],{"class":354},[266,4310,281],{"class":280},[266,4312,1455],{"class":354},[266,4314,281],{"class":280},[266,4316,1460],{"class":354},[266,4318,358],{"class":280},[266,4320,4321],{"class":268,"line":361},[266,4322,364],{"emptyLinePlaceholder":32},[266,4324,4325],{"class":268,"line":367},[266,4326,4327],{"class":1146},"\u002F\u002F Retrieve config values\n",[266,4329,4330,4332,4335,4337,4339,4341,4343,4345,4347,4350,4352,4354,4357],{"class":268,"line":406},[266,4331,371],{"class":370},[266,4333,4334],{"class":374}," retries",[266,4336,377],{"class":272},[266,4338,277],{"class":276},[266,4340,281],{"class":280},[266,4342,1428],{"class":284},[266,4344,287],{"class":280},[266,4346,389],{"class":388},[266,4348,4349],{"class":392},"max-retries",[266,4351,389],{"class":388},[266,4353,398],{"class":280},[266,4355,4356],{"class":614}," 3",[266,4358,293],{"class":280},[266,4360,4361,4363,4366,4368,4370,4372,4374,4376,4378,4381,4383,4385,4387,4390,4392],{"class":268,"line":412},[266,4362,371],{"class":370},[266,4364,4365],{"class":374}," theme",[266,4367,377],{"class":272},[266,4369,277],{"class":276},[266,4371,281],{"class":280},[266,4373,1428],{"class":284},[266,4375,287],{"class":280},[266,4377,389],{"class":388},[266,4379,4380],{"class":392},"theme",[266,4382,389],{"class":388},[266,4384,398],{"class":280},[266,4386,434],{"class":388},[266,4388,4389],{"class":392},"light",[266,4391,389],{"class":388},[266,4393,293],{"class":280},[266,4395,4396,4398,4401,4403,4405,4407,4409,4411,4413,4415,4417,4419,4421],{"class":268,"line":459},[266,4397,371],{"class":370},[266,4399,4400],{"class":374}," newCheckout",[266,4402,377],{"class":272},[266,4404,277],{"class":276},[266,4406,281],{"class":280},[266,4408,1428],{"class":284},[266,4410,287],{"class":280},[266,4412,389],{"class":388},[266,4414,1946],{"class":392},[266,4416,389],{"class":388},[266,4418,398],{"class":280},[266,4420,3055],{"class":1955},[266,4422,293],{"class":280},[266,4424,4425,4427,4429,4431,4433,4435,4437,4439,4441,4443,4445,4447,4449,4451,4453,4456],{"class":268,"line":465},[266,4426,371],{"class":370},[266,4428,1522],{"class":374},[266,4430,377],{"class":272},[266,4432,277],{"class":276},[266,4434,281],{"class":280},[266,4436,1428],{"class":284},[266,4438,287],{"class":280},[266,4440,389],{"class":388},[266,4442,1493],{"class":392},[266,4444,389],{"class":388},[266,4446,398],{"class":280},[266,4448,1500],{"class":272},[266,4450,287],{"class":280},[266,4452,1432],{"class":374},[266,4454,4455],{"class":280},"));",[266,4457,4458],{"class":1146}," \u002F\u002F JSON config\n",[266,4460,4461],{"class":268,"line":470},[266,4462,364],{"emptyLinePlaceholder":32},[266,4464,4465],{"class":268,"line":848},[266,4466,4467],{"class":1146},"\u002F\u002F Watch for config updates\n",[266,4469,4470,4472,4474,4476,4478,4480,4482],{"class":268,"line":869},[266,4471,371],{"class":370},[266,4473,1928],{"class":374},[266,4475,377],{"class":272},[266,4477,277],{"class":276},[266,4479,281],{"class":280},[266,4481,1201],{"class":284},[266,4483,1939],{"class":280},[266,4485,4486,4488,4490,4492],{"class":268,"line":875},[266,4487,596],{"class":388},[266,4489,1946],{"class":392},[266,4491,389],{"class":388},[266,4493,550],{"class":280},[266,4495,4496,4498],{"class":268,"line":1608},[266,4497,1956],{"class":1955},[266,4499,550],{"class":280},[266,4501,4502,4504,4506,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526],{"class":268,"line":1877},[266,4503,1963],{"class":276},[266,4505,1966],{"class":272},[266,4507,1969],{"class":276},[266,4509,281],{"class":280},[266,4511,1073],{"class":284},[266,4513,287],{"class":280},[266,4515,1978],{"class":388},[266,4517,1981],{"class":392},[266,4519,1984],{"class":388},[266,4521,1987],{"class":276},[266,4523,1990],{"class":388},[266,4525,389],{"class":388},[266,4527,1104],{"class":280},[266,4529,4530],{"class":268,"line":2324},[266,4531,364],{"emptyLinePlaceholder":32},[266,4533,4534],{"class":268,"line":2330},[266,4535,4536],{"class":1146},"\u002F\u002F Dispose the subscription when it is no longer needed\n",[266,4538,4539,4542,4544,4547],{"class":268,"line":2356},[266,4540,4541],{"class":276},"subscription",[266,4543,281],{"class":280},[266,4545,4546],{"class":284},"Dispose",[266,4548,481],{"class":280},[4052,4550,4551],{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":262,"searchDepth":361,"depth":361,"links":4553},[],"Retrieve config values via the typed GetValue overloads, and subscribe to updates via Watch. The first argument is the config key and the second is the default value, which is returned if the config is not available or cannot be read as the given type. The type of the default value decides the type the config is read as:",{},"\u002F_partials\u002Fsdks\u002Fdotnet\u002Fsimple-usage",{"description":4554},"_partials\u002Fsdks\u002Fdotnet\u002Fsimple-usage","GyogSYxsqIfnGNTP2_3gfDwqHi1n8Swiv0u6hjv2ppc",{"id":4561,"title":4562,"body":4563,"description":4567,"extension":4084,"links":4085,"meta":4861,"navigation":6,"path":4862,"seo":4863,"stem":4864,"__hash__":4865},"docs\u002F_partials\u002Fsdks\u002Fdotnet\u002Fuser-context.md","User Context",{"type":152,"value":4564,"toc":4859},[4565,4568,4704,4709,4856],[170,4566,4567],{},"The user context can be provided as the last argument to any of the getters. Unlike client SDKs, the server SDKs are able to evaluate targeting rules for the given user context locally without additional network calls.",[256,4569,4571],{"className":258,"code":4570,"filename":1441,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nvar context = new Context\n{\n    Id = \"12345\",\n    Name = \"Example User\",\n    Traits =\n    {\n        [\"region\"] = \"North America\", \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n    },\n};\n\nclient.GetValue(\"my-boolean-config-key\", false, context);\n",[177,4572,4573,4581,4585,4597,4601,4616,4630,4636,4640,4665,4669,4673,4677],{"__ignoreMap":262},[266,4574,4575,4577,4579],{"class":268,"line":269},[266,4576,351],{"class":350},[266,4578,355],{"class":354},[266,4580,358],{"class":280},[266,4582,4583],{"class":268,"line":361},[266,4584,364],{"emptyLinePlaceholder":32},[266,4586,4587,4589,4591,4593,4595],{"class":268,"line":367},[266,4588,371],{"class":370},[266,4590,1730],{"class":374},[266,4592,377],{"class":272},[266,4594,380],{"class":272},[266,4596,1737],{"class":374},[266,4598,4599],{"class":268,"line":406},[266,4600,409],{"class":280},[266,4602,4603,4605,4607,4609,4612,4614],{"class":268,"line":412},[266,4604,1746],{"class":276},[266,4606,418],{"class":272},[266,4608,434],{"class":388},[266,4610,4611],{"class":392},"12345",[266,4613,389],{"class":388},[266,4615,550],{"class":280},[266,4617,4618,4620,4622,4624,4626,4628],{"class":268,"line":459},[266,4619,1762],{"class":276},[266,4621,418],{"class":272},[266,4623,434],{"class":388},[266,4625,1769],{"class":392},[266,4627,389],{"class":388},[266,4629,550],{"class":280},[266,4631,4632,4634],{"class":268,"line":465},[266,4633,1778],{"class":276},[266,4635,801],{"class":272},[266,4637,4638],{"class":268,"line":470},[266,4639,806],{"class":280},[266,4641,4642,4644,4646,4648,4650,4652,4654,4656,4658,4660,4662],{"class":268,"line":848},[266,4643,1789],{"class":280},[266,4645,389],{"class":388},[266,4647,1794],{"class":392},[266,4649,389],{"class":388},[266,4651,1799],{"class":280},[266,4653,377],{"class":272},[266,4655,434],{"class":388},[266,4657,1806],{"class":392},[266,4659,389],{"class":388},[266,4661,398],{"class":280},[266,4663,4664],{"class":1146}," \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n",[266,4666,4667],{"class":268,"line":869},[266,4668,872],{"class":280},[266,4670,4671],{"class":268,"line":875},[266,4672,1880],{"class":280},[266,4674,4675],{"class":268,"line":1608},[266,4676,364],{"emptyLinePlaceholder":32},[266,4678,4679,4681,4683,4685,4687,4689,4692,4694,4696,4698,4700,4702],{"class":268,"line":1877},[266,4680,1113],{"class":276},[266,4682,281],{"class":280},[266,4684,1428],{"class":284},[266,4686,287],{"class":280},[266,4688,389],{"class":388},[266,4690,4691],{"class":392},"my-boolean-config-key",[266,4693,389],{"class":388},[266,4695,398],{"class":280},[266,4697,3055],{"class":1955},[266,4699,398],{"class":280},[266,4701,1730],{"class":276},[266,4703,293],{"class":280},[170,4705,4706,4707,588],{},"It can also be provided as the fourth argument to ",[177,4708,1201],{},[256,4710,4712],{"className":258,"code":4711,"filename":1441,"language":261,"meta":262,"style":262},"using ConfigDirector;\n\nvar subscription = client.Watch(\n    \"new-checkout\",\n    false,\n    value => Console.WriteLine($\"new-checkout is now {value}\"),\n    new Context\n    {\n        Id = \"12345\",\n        Name = \"Example User\",\n        Traits = { [\"region\"] = \"North America\" },\n    });\n",[177,4713,4714,4722,4726,4742,4752,4758,4786,4792,4796,4810,4824,4852],{"__ignoreMap":262},[266,4715,4716,4718,4720],{"class":268,"line":269},[266,4717,351],{"class":350},[266,4719,355],{"class":354},[266,4721,358],{"class":280},[266,4723,4724],{"class":268,"line":361},[266,4725,364],{"emptyLinePlaceholder":32},[266,4727,4728,4730,4732,4734,4736,4738,4740],{"class":268,"line":367},[266,4729,371],{"class":370},[266,4731,1928],{"class":374},[266,4733,377],{"class":272},[266,4735,277],{"class":276},[266,4737,281],{"class":280},[266,4739,1201],{"class":284},[266,4741,1939],{"class":280},[266,4743,4744,4746,4748,4750],{"class":268,"line":406},[266,4745,596],{"class":388},[266,4747,1946],{"class":392},[266,4749,389],{"class":388},[266,4751,550],{"class":280},[266,4753,4754,4756],{"class":268,"line":412},[266,4755,1956],{"class":1955},[266,4757,550],{"class":280},[266,4759,4760,4762,4764,4766,4768,4770,4772,4774,4776,4778,4780,4782,4784],{"class":268,"line":459},[266,4761,1963],{"class":276},[266,4763,1966],{"class":272},[266,4765,1969],{"class":276},[266,4767,281],{"class":280},[266,4769,1073],{"class":284},[266,4771,287],{"class":280},[266,4773,1978],{"class":388},[266,4775,1981],{"class":392},[266,4777,1984],{"class":388},[266,4779,1987],{"class":276},[266,4781,1990],{"class":388},[266,4783,389],{"class":388},[266,4785,845],{"class":280},[266,4787,4788,4790],{"class":268,"line":465},[266,4789,1999],{"class":272},[266,4791,1737],{"class":374},[266,4793,4794],{"class":268,"line":470},[266,4795,806],{"class":280},[266,4797,4798,4800,4802,4804,4806,4808],{"class":268,"line":848},[266,4799,2010],{"class":276},[266,4801,418],{"class":272},[266,4803,434],{"class":388},[266,4805,4611],{"class":392},[266,4807,389],{"class":388},[266,4809,550],{"class":280},[266,4811,4812,4814,4816,4818,4820,4822],{"class":268,"line":869},[266,4813,2025],{"class":276},[266,4815,418],{"class":272},[266,4817,434],{"class":388},[266,4819,1769],{"class":392},[266,4821,389],{"class":388},[266,4823,550],{"class":280},[266,4825,4826,4828,4830,4832,4834,4836,4838,4840,4842,4844,4846,4848,4850],{"class":268,"line":875},[266,4827,2040],{"class":276},[266,4829,418],{"class":272},[266,4831,426],{"class":280},[266,4833,2047],{"class":280},[266,4835,389],{"class":388},[266,4837,1794],{"class":392},[266,4839,389],{"class":388},[266,4841,1799],{"class":280},[266,4843,377],{"class":272},[266,4845,434],{"class":388},[266,4847,1806],{"class":392},[266,4849,389],{"class":388},[266,4851,456],{"class":280},[266,4853,4854],{"class":268,"line":1608},[266,4855,2070],{"class":280},[4052,4857,4858],{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":262,"searchDepth":361,"depth":361,"links":4860},[],{},"\u002F_partials\u002Fsdks\u002Fdotnet\u002Fuser-context",{"description":4567},"_partials\u002Fsdks\u002Fdotnet\u002Fuser-context","tuAMC1lBGbKxJcotk0JzSWg-lmwMaa7h4NS49gnuQ3k",1788747971315]