From 2f9bccf38ff06dd5ca5f6741351eedf8ba659ad0 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Fri, 9 Jun 2023 16:10:48 +0200 Subject: [PATCH] Add metadata in your flag configuration (#857) --- cmd/relayproxy/docs/docs.go | 5 + cmd/relayproxy/docs/swagger.json | 5 + cmd/relayproxy/docs/swagger.yaml | 5 + cmd/relayproxy/main.go | 1 - cmd/relayproxy/modeldocs/eval_docs.go | 2 + internal/dto/convert_v1.go | 1 + internal/dto/dto.go | 3 + internal/flag/flag.go | 3 + internal/flag/internal_flag.go | 14 + internal/flag/internal_flag_test.go | 305 ++++++++++++++++++ internal/flag/resolution_detail.go | 3 + internal/flagstate/flag_state.go | 15 +- internal/model/variation_result.go | 34 +- openfeature/provider_tests/flags.yaml | 2 + testdata/flag-config.yaml | 3 + testutils/flagv1/flag_data.go | 4 + variation.go | 6 + .../blog/2023-06-09-flag-metadata/3819075.png | Bin 0 -> 99681 bytes .../blog/2023-06-09-flag-metadata/index.mdx | 62 ++++ website/docs/configure_flag/flag_format.mdx | 17 + .../components/editor/FlagDisplay/index.js | 8 + .../src/components/editor/FlagForm/index.js | 2 + .../src/components/editor/Metadata/index.js | 91 ++++++ .../editor/Metadata/styles.module.css | 33 ++ 24 files changed, 600 insertions(+), 24 deletions(-) create mode 100644 website/blog/2023-06-09-flag-metadata/3819075.png create mode 100644 website/blog/2023-06-09-flag-metadata/index.mdx create mode 100644 website/src/components/editor/Metadata/index.js create mode 100644 website/src/components/editor/Metadata/styles.module.css diff --git a/cmd/relayproxy/docs/docs.go b/cmd/relayproxy/docs/docs.go index d44340ec1e5..81664aef151 100644 --- a/cmd/relayproxy/docs/docs.go +++ b/cmd/relayproxy/docs/docs.go @@ -415,6 +415,11 @@ const docTemplate = `{ "type": "boolean", "example": false }, + "metadata": { + "description": "Metadata is a field containing information about your flag such as an issue tracker link, a description, etc ...", + "type": "object", + "additionalProperties": true + }, "reason": { "description": "reason why we have returned this value.", "type": "string", diff --git a/cmd/relayproxy/docs/swagger.json b/cmd/relayproxy/docs/swagger.json index 123abfd7b25..6e8107d201b 100644 --- a/cmd/relayproxy/docs/swagger.json +++ b/cmd/relayproxy/docs/swagger.json @@ -406,6 +406,11 @@ "type": "boolean", "example": false }, + "metadata": { + "description": "Metadata is a field containing information about your flag such as an issue tracker link, a description, etc ...", + "type": "object", + "additionalProperties": true + }, "reason": { "description": "reason why we have returned this value.", "type": "string", diff --git a/cmd/relayproxy/docs/swagger.yaml b/cmd/relayproxy/docs/swagger.yaml index e3206d8688a..18c2321dc20 100644 --- a/cmd/relayproxy/docs/swagger.yaml +++ b/cmd/relayproxy/docs/swagger.yaml @@ -150,6 +150,11 @@ definitions: not exists, ...) and we serve the defaultValue.' example: false type: boolean + metadata: + additionalProperties: true + description: Metadata is a field containing information about your flag such + as an issue tracker link, a description, etc ... + type: object reason: description: reason why we have returned this value. example: TARGETING_MATCH diff --git a/cmd/relayproxy/main.go b/cmd/relayproxy/main.go index e40a7504d08..7ce25634d6e 100644 --- a/cmd/relayproxy/main.go +++ b/cmd/relayproxy/main.go @@ -34,7 +34,6 @@ _____________________________________________` // @license.url https://github.com/thomaspoignant/go-feature-flag/blob/main/LICENSE // @x-logo {"url":"https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png"} // @BasePath / - // @securitydefinitions.apikey ApiKeyAuth // @in header // @name Authorization diff --git a/cmd/relayproxy/modeldocs/eval_docs.go b/cmd/relayproxy/modeldocs/eval_docs.go index 75b69dd78bc..3b33b798a70 100644 --- a/cmd/relayproxy/modeldocs/eval_docs.go +++ b/cmd/relayproxy/modeldocs/eval_docs.go @@ -16,4 +16,6 @@ type EvalFlagDoc struct { ErrorCode string `json:"errorCode" example:""` // The flag value for this user. Value interface{} `json:"value"` + // Metadata is a field containing information about your flag such as an issue tracker link, a description, etc ... + Metadata *map[string]interface{} `json:"metadata" yaml:"metadata,omitempty" toml:"metadata,omitempty"` } diff --git a/internal/dto/convert_v1.go b/internal/dto/convert_v1.go index ced0b2d0c55..3ec90662c44 100644 --- a/internal/dto/convert_v1.go +++ b/internal/dto/convert_v1.go @@ -21,5 +21,6 @@ func ConvertV1DtoToInternalFlag(dto DTO) flag.InternalFlag { Version: dto.Version, Scheduled: dto.Scheduled, Experimentation: experimentation, + Metadata: dto.Metadata, } } diff --git a/internal/dto/dto.go b/internal/dto/dto.go index 51dc49b4f5a..2cb2dae5ae0 100644 --- a/internal/dto/dto.go +++ b/internal/dto/dto.go @@ -50,6 +50,9 @@ type DTOv1 struct { // an end date for your flag. // When the experimentation is not running, the flag will serve the default value. Experimentation *ExperimentationDto `json:"experimentation,omitempty" yaml:"experimentation,omitempty" toml:"experimentation,omitempty"` // nolint: lll + + // Metadata is a field containing information about your flag such as an issue tracker link, a description, etc ... + Metadata *map[string]interface{} `json:"metadata,omitempty" yaml:"metadata,omitempty" toml:"metadata,omitempty"` } // DTOv0 describe the fields of a flag. diff --git a/internal/flag/flag.go b/internal/flag/flag.go index 3c89aa648aa..87fabd4b387 100644 --- a/internal/flag/flag.go +++ b/internal/flag/flag.go @@ -22,4 +22,7 @@ type Flag interface { // GetVariationValue return the value of variation from his name GetVariationValue(name string) interface{} + + // GetMetadata return the metadata associated to the flag + GetMetadata() map[string]interface{} } diff --git a/internal/flag/internal_flag.go b/internal/flag/internal_flag.go index 36ba8503821..d80f7af9385 100644 --- a/internal/flag/internal_flag.go +++ b/internal/flag/internal_flag.go @@ -50,6 +50,9 @@ type InternalFlag struct { // The version is manually managed when you configure your flags, and it is used to display the information // in the notifications and data collection. Version *string `json:"version,omitempty" yaml:"version,omitempty" toml:"version,omitempty"` + + // Metadata is a field containing information about your flag such as an issue tracker link, a description, etc ... + Metadata *map[string]interface{} `json:"metadata,omitempty" yaml:"metadata,omitempty" toml:"metadata,omitempty"` } // Value is returning the Value associate to the flag @@ -69,6 +72,7 @@ func (f *InternalFlag) Value( Variant: VariationSDKDefault, Reason: ReasonDisabled, Cacheable: f.isCacheable(), + Metadata: f.GetMetadata(), } } @@ -79,6 +83,7 @@ func (f *InternalFlag) Value( Variant: VariationSDKDefault, Reason: ReasonError, ErrorCode: ErrorFlagConfiguration, + Metadata: f.GetMetadata(), } } @@ -88,6 +93,7 @@ func (f *InternalFlag) Value( RuleIndex: variationSelection.ruleIndex, RuleName: variationSelection.ruleName, Cacheable: variationSelection.cacheable, + Metadata: f.GetMetadata(), } } @@ -332,3 +338,11 @@ func (f *InternalFlag) GetVariationValue(name string) interface{} { } return nil } + +// GetMetadata return the metadata associated to the flag +func (f *InternalFlag) GetMetadata() map[string]interface{} { + if f.Metadata == nil { + return nil + } + return *f.Metadata +} diff --git a/internal/flag/internal_flag_test.go b/internal/flag/internal_flag_test.go index b40fcbc4ff0..2f8b6278cc5 100644 --- a/internal/flag/internal_flag_test.go +++ b/internal/flag/internal_flag_test.go @@ -35,6 +35,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -48,6 +52,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "variation_A", Reason: flag.ReasonStatic, Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -61,6 +69,10 @@ func TestInternalFlag_Value(t *testing.T) { VariationResult: testconvert.String("variation_A"), Percentages: &map[string]float64{}, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -74,12 +86,20 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "variation_A", Reason: flag.ReasonStatic, Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { name: "Should return sdk default value when flag is disabled", flag: flag.InternalFlag{ Disable: testconvert.Bool(true), + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -93,6 +113,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "SdkDefault", Reason: flag.ReasonDisabled, Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -102,6 +126,10 @@ func TestInternalFlag_Value(t *testing.T) { Start: testconvert.Time(time.Now().Add(1 * time.Second)), End: testconvert.Time(time.Now().Add(5 * time.Second)), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -115,6 +143,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "SdkDefault", Reason: flag.ReasonDisabled, Cacheable: false, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -124,6 +156,10 @@ func TestInternalFlag_Value(t *testing.T) { Start: testconvert.Time(time.Now().Add(-15 * time.Second)), End: testconvert.Time(time.Now().Add(-5 * time.Second)), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -137,6 +173,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "SdkDefault", Reason: flag.ReasonDisabled, Cacheable: false, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -156,6 +196,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -171,6 +215,10 @@ func TestInternalFlag_Value(t *testing.T) { RuleIndex: testconvert.Int(0), RuleName: testconvert.String("rule1"), Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -196,6 +244,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -211,6 +263,10 @@ func TestInternalFlag_Value(t *testing.T) { RuleIndex: testconvert.Int(1), RuleName: testconvert.String("rule2"), Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -234,6 +290,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -248,6 +308,10 @@ func TestInternalFlag_Value(t *testing.T) { Reason: flag.ReasonTargetingMatch, RuleIndex: testconvert.Int(1), Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -276,6 +340,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -290,6 +358,10 @@ func TestInternalFlag_Value(t *testing.T) { Reason: flag.ReasonTargetingMatch, RuleIndex: testconvert.Int(1), Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -319,6 +391,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -333,6 +409,10 @@ func TestInternalFlag_Value(t *testing.T) { Reason: flag.ReasonTargetingMatch, RuleIndex: testconvert.Int(2), Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -356,6 +436,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -369,6 +453,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: flag.VariationSDKDefault, Reason: flag.ReasonError, ErrorCode: flag.ErrorFlagConfiguration, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -389,6 +477,10 @@ func TestInternalFlag_Value(t *testing.T) { }, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -402,6 +494,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: flag.VariationSDKDefault, Reason: flag.ReasonError, ErrorCode: flag.ErrorFlagConfiguration, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -419,6 +515,10 @@ func TestInternalFlag_Value(t *testing.T) { "variation_B": 100, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -432,6 +532,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: flag.VariationSDKDefault, Reason: flag.ReasonError, ErrorCode: flag.ErrorFlagConfiguration, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -444,6 +548,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -474,6 +582,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_A", Reason: flag.ReasonStatic, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -486,6 +598,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -516,6 +632,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_B", Reason: flag.ReasonStatic, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -528,6 +648,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -558,6 +682,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_B", Reason: flag.ReasonStatic, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -570,6 +698,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -591,6 +723,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_A", Reason: flag.ReasonStatic, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -610,6 +746,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { Date: testconvert.Time(time.Now().Add(-1 * time.Second)), @@ -640,6 +780,10 @@ func TestInternalFlag_Value(t *testing.T) { Reason: flag.ReasonTargetingMatch, RuleIndex: testconvert.Int(0), RuleName: testconvert.String("rule1"), + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -653,6 +797,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_C"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { Date: testconvert.Time(time.Now().Add(-2 * time.Second)), @@ -678,6 +826,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_C", Reason: flag.ReasonSplit, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -694,6 +846,10 @@ func TestInternalFlag_Value(t *testing.T) { VariationResult: testconvert.String("variation_B"), }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, @@ -728,6 +884,10 @@ func TestInternalFlag_Value(t *testing.T) { Reason: flag.ReasonTargetingMatch, RuleIndex: testconvert.Int(1), RuleName: testconvert.String("rule2"), + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -740,6 +900,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -770,6 +934,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_B", Reason: flag.ReasonStatic, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -782,6 +950,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -804,6 +976,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: flag.VariationSDKDefault, Reason: flag.ReasonDisabled, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -816,6 +992,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -839,6 +1019,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_A", Reason: flag.ReasonStatic, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -851,6 +1035,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Scheduled: &[]flag.ScheduledStep{ { InternalFlag: flag.InternalFlag{ @@ -884,6 +1072,10 @@ func TestInternalFlag_Value(t *testing.T) { want1: flag.ResolutionDetails{ Variant: "variation_A", Reason: flag.ReasonStatic, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -907,6 +1099,10 @@ func TestInternalFlag_Value(t *testing.T) { }, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -920,6 +1116,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "variation_A", Reason: flag.ReasonSplit, Cacheable: false, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -939,6 +1139,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -954,6 +1158,10 @@ func TestInternalFlag_Value(t *testing.T) { RuleIndex: testconvert.Int(0), RuleName: testconvert.String("test-rule"), Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -976,6 +1184,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -991,6 +1203,10 @@ func TestInternalFlag_Value(t *testing.T) { RuleIndex: testconvert.Int(0), RuleName: testconvert.String("test-rule"), Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -1022,6 +1238,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -1037,6 +1257,10 @@ func TestInternalFlag_Value(t *testing.T) { RuleIndex: testconvert.Int(0), RuleName: testconvert.String("test-rule"), Cacheable: false, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -1059,6 +1283,10 @@ func TestInternalFlag_Value(t *testing.T) { "variation_B": 50, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -1072,6 +1300,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "variation_A", Reason: flag.ReasonSplit, Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -1091,6 +1323,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -1104,6 +1340,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "variation_A", Reason: flag.ReasonDefault, Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -1116,6 +1356,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("variation_A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -1129,6 +1373,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "variation_A", Reason: flag.ReasonStatic, Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -1144,6 +1392,10 @@ func TestInternalFlag_Value(t *testing.T) { "variation_B": 0, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "my-flag", @@ -1157,6 +1409,10 @@ func TestInternalFlag_Value(t *testing.T) { Variant: "variation_A", Reason: flag.ReasonStatic, Cacheable: true, + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, { @@ -1180,6 +1436,10 @@ func TestInternalFlag_Value(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("B"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, args: args{ flagName: "feature", @@ -1195,6 +1455,10 @@ func TestInternalFlag_Value(t *testing.T) { Reason: flag.ReasonTargetingMatch, Cacheable: true, RuleIndex: testconvert.Int(0), + Metadata: map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, }, } @@ -1389,6 +1653,7 @@ func TestInternalFlag_IsValid(t *testing.T) { Version *string Experimentation *flag.ExperimentationRollout Scheduled *[]flag.ScheduledStep + Metadata *map[string]interface{} } tests := []struct { name string @@ -1415,6 +1680,10 @@ func TestInternalFlag_IsValid(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, errorMsg: "all variations should have the same type", wantErr: assert.Error, @@ -1429,6 +1698,10 @@ func TestInternalFlag_IsValid(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, wantErr: assert.NoError, }, @@ -1445,6 +1718,10 @@ func TestInternalFlag_IsValid(t *testing.T) { VariationResult: testconvert.String("A"), }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, errorMsg: "missing default rule", wantErr: assert.Error, @@ -1458,6 +1735,10 @@ func TestInternalFlag_IsValid(t *testing.T) { DefaultRule: &flag.Rule{ VariationResult: testconvert.String("A"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Rules: &[]flag.Rule{ { Name: testconvert.String("Rule1"), @@ -1507,6 +1788,10 @@ func TestInternalFlag_IsValid(t *testing.T) { "B": 20, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, errorMsg: "invalid percentages", wantErr: assert.Error, @@ -1523,6 +1808,10 @@ func TestInternalFlag_IsValid(t *testing.T) { "B": 10, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Rules: &[]flag.Rule{ { Name: testconvert.String("Rule1"), @@ -1558,6 +1847,10 @@ func TestInternalFlag_IsValid(t *testing.T) { }, }, }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, }, errorMsg: "each targeting should have a query", wantErr: assert.Error, @@ -1569,6 +1862,10 @@ func TestInternalFlag_IsValid(t *testing.T) { "A": testconvert.Interface("A"), "B": testconvert.Interface("B"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, DefaultRule: &flag.Rule{ Name: testconvert.String("nothing to return"), }, @@ -1583,6 +1880,10 @@ func TestInternalFlag_IsValid(t *testing.T) { "A": testconvert.Interface("A"), "B": testconvert.Interface("B"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, DefaultRule: &flag.Rule{ Name: testconvert.String("nothing to return"), ProgressiveRollout: &flag.ProgressiveRollout{ @@ -1609,6 +1910,10 @@ func TestInternalFlag_IsValid(t *testing.T) { "A": testconvert.Interface("A"), "B": testconvert.Interface("B"), }, + Metadata: &map[string]interface{}{ + "description": "this is a flag", + "issue-link": "https://issue.link/GOFF-1", + }, Rules: &[]flag.Rule{ { Name: testconvert.String("Rule1"), diff --git a/internal/flag/resolution_detail.go b/internal/flag/resolution_detail.go index a07ba1573af..8669f440706 100644 --- a/internal/flag/resolution_detail.go +++ b/internal/flag/resolution_detail.go @@ -20,4 +20,7 @@ type ResolutionDetails struct { // Cacheable is set to true if an SDK/provider can cache the value locally. Cacheable bool + + // Metadata is a field containing information about your flag such as an issue tracker link, a description, etc ... + Metadata map[string]interface{} } diff --git a/internal/flagstate/flag_state.go b/internal/flagstate/flag_state.go index b66fe88691f..71236b687ca 100644 --- a/internal/flagstate/flag_state.go +++ b/internal/flagstate/flag_state.go @@ -6,11 +6,12 @@ import ( // FlagState represents the state of an individual feature flag, with regard to a specific user, when it was called. type FlagState struct { - Value interface{} `json:"value"` - Timestamp int64 `json:"timestamp"` - VariationType string `json:"variationType"` - TrackEvents bool `json:"trackEvents"` - Failed bool `json:"-"` - ErrorCode flag.ErrorCode `json:"errorCode"` - Reason flag.ResolutionReason `json:"reason"` + Value interface{} `json:"value"` + Timestamp int64 `json:"timestamp"` + VariationType string `json:"variationType"` + TrackEvents bool `json:"trackEvents"` + Failed bool `json:"-"` + ErrorCode flag.ErrorCode `json:"errorCode"` + Reason flag.ResolutionReason `json:"reason"` + Metadata map[string]interface{} `json:"metadata,omitempty"` } diff --git a/internal/model/variation_result.go b/internal/model/variation_result.go index d49fcee7313..c46c9b1a31d 100644 --- a/internal/model/variation_result.go +++ b/internal/model/variation_result.go @@ -9,25 +9,27 @@ type JSONType interface { // VariationResult contains all the field available in a flag variation result. type VariationResult[T JSONType] struct { - TrackEvents bool `json:"trackEvents"` - VariationType string `json:"variationType"` - Failed bool `json:"failed"` - Version string `json:"version"` - Reason flag.ResolutionReason `json:"reason"` - ErrorCode flag.ErrorCode `json:"errorCode"` - Value T `json:"value"` - Cacheable bool `json:"cacheable"` + TrackEvents bool `json:"trackEvents"` + VariationType string `json:"variationType"` + Failed bool `json:"failed"` + Version string `json:"version"` + Reason flag.ResolutionReason `json:"reason"` + ErrorCode flag.ErrorCode `json:"errorCode"` + Value T `json:"value"` + Cacheable bool `json:"cacheable"` + Metadata map[string]interface{} `json:"metadata,omitempty"` } // RawVarResult is the result of the raw variation call. // This is used by ffclient.RawVariation functions, this should be used only by internal calls. type RawVarResult struct { - TrackEvents bool `json:"trackEvents"` - VariationType string `json:"variationType"` - Failed bool `json:"failed"` - Version string `json:"version"` - Reason flag.ResolutionReason `json:"reason"` - ErrorCode flag.ErrorCode `json:"errorCode"` - Value interface{} `json:"value"` - Cacheable bool `json:"cacheable"` + TrackEvents bool `json:"trackEvents"` + VariationType string `json:"variationType"` + Failed bool `json:"failed"` + Version string `json:"version"` + Reason flag.ResolutionReason `json:"reason"` + ErrorCode flag.ErrorCode `json:"errorCode"` + Value interface{} `json:"value"` + Cacheable bool `json:"cacheable"` + Metadata map[string]interface{} `json:"metadata,omitempty"` } diff --git a/openfeature/provider_tests/flags.yaml b/openfeature/provider_tests/flags.yaml index 1e9601d2a24..b34cb5a8389 100644 --- a/openfeature/provider_tests/flags.yaml +++ b/openfeature/provider_tests/flags.yaml @@ -10,6 +10,8 @@ bool_targeting_match: percentage: "False": 0 "True": 100 + metadata: + description: this is a test flag disabled_bool: variations: Default: false diff --git a/testdata/flag-config.yaml b/testdata/flag-config.yaml index 01aded5be1a..10ca980f83d 100644 --- a/testdata/flag-config.yaml +++ b/testdata/flag-config.yaml @@ -12,6 +12,9 @@ test-flag: defaultRule: name: legacyDefaultRule variation: Default + metadata: + description: this is a simple feature flag + issue-link: https://jira.xxx/GOFF-01 test-flag2: variations: diff --git a/testutils/flagv1/flag_data.go b/testutils/flagv1/flag_data.go index f65650c6e34..967f3bfa729 100644 --- a/testutils/flagv1/flag_data.go +++ b/testutils/flagv1/flag_data.go @@ -381,3 +381,7 @@ func convertNilEmpty(input interface{}) string { } return fmt.Sprintf("%v", input) } + +func (f *FlagData) GetMetadata() map[string]interface{} { + return nil +} diff --git a/variation.go b/variation.go index 57d9d1354eb..f4614f86ad3 100644 --- a/variation.go +++ b/variation.go @@ -275,6 +275,7 @@ func (g *GoFeatureFlag) AllFlagsState(user ffuser.User) flagstate.AllFlags { Failed: resolutionDetails.ErrorCode != "", ErrorCode: resolutionDetails.ErrorCode, Reason: resolutionDetails.Reason, + Metadata: resolutionDetails.Metadata, }) continue } @@ -289,6 +290,7 @@ func (g *GoFeatureFlag) AllFlagsState(user ffuser.User) flagstate.AllFlags { Failed: resolutionDetails.ErrorCode != "", ErrorCode: resolutionDetails.ErrorCode, Reason: resolutionDetails.Reason, + Metadata: resolutionDetails.Metadata, }) default: @@ -304,6 +306,7 @@ func (g *GoFeatureFlag) AllFlagsState(user ffuser.User) flagstate.AllFlags { Failed: true, ErrorCode: flag.ErrorCodeTypeMismatch, Reason: flag.ReasonError, + Metadata: resolutionDetails.Metadata, }) } } @@ -400,6 +403,7 @@ func getVariation[T model.JSONType]( if f != nil { varResult.TrackEvents = f.IsTrackEvents() varResult.Version = f.GetVersion() + varResult.Metadata = f.GetMetadata() } return varResult, err } @@ -434,6 +438,7 @@ func getVariation[T model.JSONType]( Failed: true, TrackEvents: f.IsTrackEvents(), Version: f.GetVersion(), + Metadata: f.GetMetadata(), }, fmt.Errorf(errorWrongVariation, flagKey) } } @@ -447,5 +452,6 @@ func getVariation[T model.JSONType]( TrackEvents: f.IsTrackEvents(), Version: f.GetVersion(), Cacheable: resolutionDetails.Cacheable, + Metadata: f.GetMetadata(), }, nil } diff --git a/website/blog/2023-06-09-flag-metadata/3819075.png b/website/blog/2023-06-09-flag-metadata/3819075.png new file mode 100644 index 0000000000000000000000000000000000000000..f5adac2d9b231cb28e13c89d7a34c1a5180284ff GIT binary patch literal 99681 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

yWYEu)EuotBuWzcgMKG&TL@s(NvQ$8Qp|*; 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�RnM&br*>L{- z!)>oJvPO zt)j0l)C9Vuqyi5`$yvo!5*>%v*d~8yfRlaxbN@ZR6IBGmMtP$NbRIt%F+S@}jH6#C zcz}p(C&N!yn>An=6Tq356LC{F63E zHr})U&1TzZA-Dh3)XFF7PA|(1ATrd8Cc*$%HJH;`I1;wzksU^O(HQvg6TEPue@^H*p8VzB!z~!XT%srpA$$3i{`d6TJ6p!R`YYxVXG22Dkuw1v3pnlh&~&awxIPoq z)^;{v&15i2| zZVPB6QCS#hi1J^TJQ!fQGmdkbk1`Y%l5?#8^nCKFqiJWHb5-aJw7R0o`}S6tGa3wC z{(G^LTmH>l{yCRme>^T!?p?g9@H=wmkF1pZ_@D|0FaxMocudu>H5v;y&Hv?L*nUfa z5U(il(uC4`Xv^`rve>q>L;(T927>Slfdku<_ER6PZfr)SCMBVE`Ml@ zeDO#at&D4y>(Ax&&9<(S-FZwpCW2&^etaHQ6)Rl}JMeP1wOS1zvE!sBEm`_z7)yl4 z#dxuNNGl}PW6{fN^H_&NpzBsTjJJ3o51*neA{Ft<~v=m9m z&VI8rGb&81)NRHk2y-HVSgWg7i^EEd?OlC?HDdYj;jnaBzIzLFG@agf2iP>~R3n_P zcs}Y>&gVzan{b1qh6md7!}8&tXdlQ8k&o3-_kY+krhil&v!q}G+xEk{m&2e3oKgaq*@*ChFSs2p{I$lUqd1EXz6B~N*nX}Z3;?7rED&T5qetfA6uKG zhx!|DN@iydpoD~sHWm7<)7ktUoM&g`-?`eSn3lJA8r&_<1*Im_aKfmF=Po}#KT8(W z=F5PF&3K<1^PQ@e5-~`7Q4#I%(akF@2BID&BCNf-`i;N1b}d*WlE!8&$>%aun!VfUI2AH_;{d^Kelkb{}z`nc2uTc7*bmhJF<^jQ@RFuL7 zqUtN?qln)SbA*id&{sURqj#Ic$B%L9y(0)-Gn8|X~z-!xYeDPzT*1qCzbt^b5h(LD>A|2qrNbCff0L5LO<~n zS^HQUZ#ZcAB!SCenvsbpc}f!O854xG^E1WV5m**09m_G59;J}9f-xB)g$Oi_h?E-qIYMo$=*S69jGSNes8g<4<*i>4j8`P2*_Ig*QPQP>*e0P_qA>I)y4t19l zmD)69TW&%J?f86{LWB<8{$`kvW-#=00%}daq){XH@zW=8De*A>Sik70&wVRpXIICV z!HLj+MDFQ|x$f>AEr#Y~mc2S5??4^mM>IfoGuYpVlNn>poZ#Gk2}RyxWfdVX{Z^~Z z`iHWHXIf3YU0K-5TEZoBR>fw?~#&WU;SKrs>yv1?lxS#4t5U2Hq75nlt z2QhZc-}AA+{rB%aMTi|Z;E{<2EJe%OdV0jn@Gcr9D({qgZ|Q6sWc2=%m1_?V%j+f4NG{3$`aT{ZL9?z~_pXcj1~>@7!2284BS`Hm zISoY!qMR9*3lJQ$Q*Lyl07|~?cs%c8#hX~Mk*WIcrW!2tqs^mD1KL<4(YY<)ergEJ z!n$el7Bg2J(yw{Ki6*}d-|`>JE|^hC0`sDaG5>Pv*>gAHb#y5 zWM{meBeG%kRXkjBK8y3PU4@gzS(bse7?xl3R1bGy4Nc8tx{#Jya8wDNpXpa; zP+Ivy8Rcf)iQMqe$fj(&0cV9QT?J$MQQ9jr)1{3%ROKe!6zUf-Ml965)lQ5*?umC6 zt>1rLGfb**RBd1=(JYp4$hueaKOZ0k4X)#}IAFsY`-4N93{CXqiW%Mh_57!64pTQjj`j7Gpnm6i zR>rB=-?qBd98)@l1KS&?-}orL`iUVI?V4>tGP>|`$u>QuN9yDB>Mmbixy_V&T&<+X zsYl07Cn_|Ktom88a1z(&r>AQ^jIVB>r=}l-!tU+!Eb@8aK&Gegs2(03lBF54W%6YF zqVnjGL05Vo*z@@3%D-{IdwTT%Qjl(VM{JH206(qh1gb_B@xs^GIJbHu=9FY$oNjQb z_(wz;6ol^Q3DC!zT%!neWp#Cg zj#U+<_qe$BU@qe;WgBYmn5uC0nKHva5#SHhJs7650r0`_4-=&~`vg{Qo3g&XUr8Q) z=*2Zfp6-99rppd4qH#?aPK27+xJ^BGOE(<`PBQ=mXYjC^TmflOwQ87qEdoYHYwNfb zD=VaXBJ!B{mi0yzb3uBaM&7*wC+dOF<0atnp3hMC%h2a^Etz#3Mn>R+RU{VPub)Mw zWlA@%{n%^5AzWWg?h#5N>a{3+;Nc zd}KYTFBXn0HCjx=!>ysOxnR%*V*Q#4GwDMJVLbh;Ess>4kxm`&KAh?O?59ODsYuA{)F%{5kUx?F6OMwvggL6gsSz^2FX@NdzSb1Kz-61M-@-MLC zX_)e0Px*m7?+7Glrq>79t&28%Frrkkd}kXdj^r5k#d-8Rcg+)#edFOnGkUTN0dVAy zrVew^1}wh>{dW&*-|{yy{0Rx4zGriXFST07je#lMY*OcP%7u=f+I1KKV&E%d#Uo}> z{*n^nhy5*i>B4OAY#V;yLfFp_^iu^>NZ~xi)v)*oAm(CL6zg-l_aXigdm1>VF&~%@ zo3qxJ5l7&-dIMc6!&VdZE;Yg2Vmw)4_8l=?N*ma=#ZV(pk4M$BTw<3wyvyrn&aLY< zEDDk0WvEaCQywfeM)BTYgbR|tZ>XxPk##Q96!g(vU^wbE(O#{&3BuE$}zRHqiJ z=lgW~%58B@*)NdJj&XUdrlYeAPo7m!DcR5JkCG#&tx{G}1FbMDKTRxO;U z{?_YH;Ri#Eh&in!<*NTC45~TtW^-=99-L5cf-c|_2{;}Cwn@7F#6QWRtKFxHXfZzAv_$<+*)@k@VNT21yqZ$nu;S9j5P_oF}v&VmPw zIg**XtGn$8t`XmL*A2)nV&GfE&N2Ls+z z%Rp|=(^LP5MXj^@QyFe=H7ev0Y!`rO!ya42hRmoMB!p2@B@-u8n5;V@-RYzfdtGmG zsIGvL3HR~wLb-nRc(wzdW8=6F&Q>k`VA=zPJWW*;=y^a3ry5|R*=S!P52><-c5u45 z$d)AFG2M*E=45?Cl&7n+IURd#q9fqs;V~2!&n_)%!|iLq+^nVe7Qz2|8V7Z*IP$9Ulx^GwN>4yYzHWop&w6aO6m2E!0DTvU|I5I_{WIo@{yMETk4di zx|`kNK}-{kQ3ydg-ms;|WB=e))`~NQ!{$%|QsMj5YeE-u7s#c(*MszQ7jHpgtv;s>Vs&s zSBNid$3O@>#-=~xk)?e%70Kl5c+yARFt#gK2^Ec8N>qGSKUUJ5 zgsI8oe|nQNNWO)MXT`@(eR=*E+(k2li=i1maKxce<%^EA;L0Jx2mR5QXCHr-$_+$b zBoI?DNp1xLv7$j3y|d>ge+6ZwR2ukEIHx6B_8gGqjDcsa$fdTHmXuiG2|8P7O+XuK z54cQSc?o8TV9s>H!NE=V+1oltG~G1x9=Hli6J^&^SdNP!whs^?Uo+_8yaBtk^J@hQ zDU-WEXwP2pa{0)Pxs~poNYNgR9b+fbi8I&hrVRjU>ASR$7sz=tnC3o)2cUU^ zq%C`((`+)GH~%kqQz;;XPPzPHSvEc=-Cy~`M+jP%~Y{<5H6p~w4_d6{+JD?WyvBHw0i+%(| zoBd!K*!TssgGl#U_tv&9JpJXx5tB6PienDBhf*$wQdRwFSc1oTAZH4{iu0mSvr=F)KZ*a;Z0Pd&yN3X-HLO0d&Uzkg&!Jphxae2P}E zSKm5GHwvmTLEAUEh)4h*Lf*Z4m#fC88cMmdisb;oir(M)aU z*-j4$FVjE`9rQ3I+WBEawhCwJhS zm(ERoV8QKrrOoY#no@_RQ11YQQu~!84ZD%sJ>!CReRG{8j0P1NHkBJ>Z8=KfX&}jf z1~C5KZ7%No_?)YtTnDe;w<=0a61>DtN}G{<$VZ5ZRLND}JOc#@3@$SC_X_&kO-t*< zY8;DhTm}cnm%3VxjfPKkr>hA((~E9ZEjjdRb9=gSJt2N>C7(LX?u&oH5moE)rGr3g zo&56Vr~)&iR%y4wkYu2OE#}SgtZRFxtb8agU^27mqg#Ecz(;MwNOI}#Cge*B-}77} z;0hM4-bGF2=RtCH0S1jRbWGSkf{!JfrAyS(enIcB5UH0^1=8CN+Lzcl?y@$>>KW2c z+SNSHo^Hk%1vr{BWR`@kKJIC$2a0YUD$_TR^qk$jAuQs5lVn+ZTLtH@41$AvSyr0P z(BXrdQEAZt?Z?GVtxL+Ji;j*J3+tr9rnJTmvNbT2^mOkxZ8oej zGQM3nWeT@X&1Tj4wuWC05e1gFlg=bsFug>n39xn!=m`?}oUTE>E$&%4t}~uYISg^b zCoX~qnJYz%O!U}pQeg6}f%(XzL#>r27En8?uGM0yD3ep?BBun;Hr%3AO_Zk%;NIj} zP&Dv9_8sWry#er8;Umy)+g=JNFVo7hI;LC#P~d}=evJjh^bG66bTap8a&n%1bA>&? z7qm3vn4-V+T56dRn0T@KrPre8?krzr>WG5|9I-3RW+3UIXP`ch{&SuH#eUgr-LLS_f&W}<37EjM^e}(K z0oACq!qcTbU7Rsw`-6CUX2T`M_yG+}N8CAI#JhC0wOcjvSV+)@77*MeyuMGb63r48 zm`-PaSN(o?o9hG2Y3#IRHD}XzV#$AmCtq@H!>O)<8mqBW+mo`S%+LmtcxY7HVQ2O} z<g_QCJ)`NIcmerSVL%M0Cd)b<)p*b>Y8AvPi1D zferppGDHWHZ|LlNiClZR35`cyh=hnC)t`vj?7Q{CyhOIgGQjdp9J14(+roA{D{x{`$?-e&Fj z?EdWk+4eBoe-z8A@T=9Mlskog;@eab=QXQ|v|z$*7fh9}g0_enc@`xB&;kizh;Gb!dKSS)fLv&U5Z6Ar-w{Wt-aPErO$GHxk?xp-;+k5TN=lf7&U8* zUt(~D%UUxi(Vu{qUaYx}L+7VTkFA(FfBshT%zJ`|YcQlZxd2nnQ~a{r4`DJq{ULqA zBi*6_EkUiv!S%(@ga6UI{15@0z)p_AJ9&1;q9E3?hV{cEkO3TSbS+v99$6ZN(q98A z`j<8rU75t_oHr*%jViBXGTTO(Ixl9D+s-Iy3AVdPwI?p@esK$gy4qx9kBwXcHC}uR z6ue;+ad+f{U1?R8CGS`Z4V`gG}0i_UD92L66x;l?k-U}1O%i732EsLMY^QB z8>BgO-0}PFeeNHB@yIam%}z*f*aY7D9=KhY`_d?n#&e`TERW zFD1X5i`#u5yrdwmczo*=6d!lLN}b_jJZ2@bA#pMEZrRLge7jQbMSba9XCz;LA=N?c z*%$o3oAAx_+Dl6KyAl$0Mf>?`VRN;=SLMLlqN;UA%^LX8wJmIWWTx0{dG9oHYfu646+<@t+t)vGD4E8&%5bsF+yy=YRu;;ur< zuwKiVosFU=GaS`BUk_>2_cC^-FPX7z++MT)Er@a~(cxu}08-%5mkAyD z{I9~l$$;N%7Aae3vJ0`)9ueOILjKkFi3f)F_RrAaNscmj}mya3?(a zOs%EJytrSgI@xHT+7uN+h*&$_1hC`D{pTn-;yXm~OOD5lc|vWM=VV}HO+%|@NwV_c z=uzBr)|qcyMv{9Jesth$>s60EW~iMIYYP$gvSRWg^ZTpVs;G-jg6AyZqs|=)1F_@?~N8^Ymu^~kNdmA@9)<%9> zQD)nmGtt)fbw}IosYO%=m)UyU`a@ZoFAJXUm%52(RSHPBVZBGrd~d|W*f%kLw?jj@ zh3V3_*LAdAd4FmDk>}E$u=xzGs@2!atcVZTZ4#l}N*1iQG2R5%wnmuv2@Gq_eCa>E z$G5n;*fT|TBxAsV?8}%j2ted{d}r|Vu+6uS2wVbq&FoEjDd@7-yohv5`zG77^3CLQ zx#C%K%l#3D)#%36w?A6>WfjOXu(;sY2$H6~EY5mCjWR8?v_yep!1KJW5}6-&4POFX zR14qzTACg<8b_m3i#6sJvS739o<5@g$D}Rc3tPN+(#o&5%Q?L*lPgHHFbkPxn{>{Q zCv&>8kkZOZQA8A?u(b;Ta#N5j$uKW?gqb@h-c1#n=p3Oyx|fUVMWX(g<=OZMam8O^ zE74YEc$(PHM^%aRrzizw^5jV5kyCZibaxQjFJgcfFdTlcnbEG+Yq;PZa!tNIGzmhn z7oX*gE9O>gYN!*1si@qW(}YV_Zohbwgy_EOXmKZq&wEX;Uh0t_XwF;RXws6BUC2Nz z$Yr743cjsw>!ECLYv8WAE5#y zf}8JZN|7Q0`x&K;k6>u+O58O1=VIo=_0*J98ABll*{VDLkNa6vD15BPSEmbZm`CLkr9$Ccy=s@ zG^3?sWJwR!MpDb9T!=;_P@Q|E53dp4qTQ*lq8^(18cZ__LsB0mvgegAE9qNZi07|V zC3XHB#9df(`J#QgLT3d&IOeM;se`a&{oZw1QIJHz)g9JQhqnBAnwY-yGM1&yh*Tw4 zctrJ7Ac}T$G9OwoLVmq>{^w1_XK$g9qs7Ql6Xfcj(z_4jH*rcs`7}asT4qey<+0Q~ zF}o{Y-6Cg*rrh~l!Q~)0ep+1S`Ru+BR^1`BMx*M7<;?R-+$IPYp#h$+q6icp7XU`g zsD3$WocZhvm`8Bh5x|nU%7fmHQU>j3bRSkWvRcD#y#6=ag-t^?kkG;ooe?r zaEsGx&iOh<^U6mok((`KV+|@8Gs+(My$2P#njw0RkV{Oi$#cbPX1~h zvemzl>wi^jtMBCoO&9I!@ihEsA{3+dE6U#dj#D;nsvkStcsIx0Ut>12Oc>SryZ4G? z43SV}x`Zw>=c+}BEH1Y~$$@@m@>K|h7uCyLe{snGdQ@_Qdxpg``A?!)CH)PUDaY`* z)0IY|j^p`q8CO9Z_|asTt)Cx$+!p2L=DyRgQ-@uGZ`%iou%S2D{Ay#_b|M(>BCkGvJ0mQznu(wb9ryhd@O-Bf_PX>ty*+YSU4Pn+T%Xi zuG%#fG`LGb6dV>7hRMXpxZZE>N_+B_8DH;fNe+@FT!9#Tquo@A#wg&tZ#k@O0c1WY zcp3}>vb}f~+Jw=Y00&~EMU^50^jF`doNtpBdW z#G`soJLEPxB6M38VP0i{OMz8MDCIw{y^agU=QRX6zr$6s9S1`ANxPylq-M`3X&jLE zKj35FO$tHaZ{FX4P)JlJJ;Yl5Lj0?G#+x`F7RDI3t3z zpyZ!q;{>SH)L&!GrYuCXco3gVmg&^s{EO&BV6{?%mF>PS9kmpWWiUPqp`P?~VLA!# zFIG}Rl(vtOMd}y6*3F`C`&#eaUAfOqN$jB}C32HE^Lhki6F-YQd$YdLix%j6XlGWZ zlurB)FVI&hTpYsqzTzK{skl)`x>mnqI?|sTX&^`;9WXX=}lM_>yoRYNc`kZ8MnPBNmAaJtI!MoDx znbUi$_PXD4qfzzGV>t(G%BiQV2C1|!<1I5?426gdbL1Iz@zVaBvhM!pU1z>C=nl_k zbg!e8u<8l^0PW+nqWrS5zv8Q;*iDPaS68z?hqhdWjdi9m(YpA^8U+O@E@LAypD|aI zl+33cXuC3KoOZSoag2yx*nDQ9RuwdmoDv=Ju-^mKluq@1qP&oLj39;DjMi2ahEhc9 z`~B0jW+MUaScb5`OBW?Y!oi-=(QZbD0cG_7W!*FDBS(-X7<-WnWEml@3`aa%Rm>}U z3RpcP(bOgfAUEiL9FVMS!W`eLA-OU*P8)qU(MrsRdA)rEReL;@g$y>L>RC~Y2WQ=f zOzU5>c7j=ck%8k=UF7}GH+tp@hgF1& z$e_^sc8s&pJBnW?W3hiGw{Y}leelPj)}eju33?dHu!W)ZkrCUKxWm32a-~dK^ZC!k zXCODBchV1gi)%adpTckNPa8MS;Qyyy=1i0B5#6RT5MFppMEH;vIP5vtN0k7uQHFyio3lz7Ls*OR>Pjgk2eURAu*hFgLv(>(0s34~$}g&8i>N?zdT7 zw0e@Is3dfqj1S21)JVZL(F`9xngv~VVYHwHh?LgT94(_>)Qov~9ugbGY`yu)?NsXO z?l9Rmtm`2af^_JNCSLJdXa8xlc^UNgPnnsUNKBY_X^6{w>Kok7hR?v}06EyZAWBnE z3pzpi5_>y74j*RCVD>|W`fGw$YDHDd7d+boMg_>c?EuDHrH`DbP`%xa;L>y?RS%0fj@_21Zx=Ud+Nexozf5zSrL@6@du4Sh~I zzH#>6UTtbZ9ah;!&d(*A?^z4A4f?R=i*CX1yy`5=^%HE)I*g=U@42gU7^_pAj=Ro* z%isF-oUa%26jZ6{J@}!?Lmq?=J1os?0BRtOJL->;GK`!IM5qHwgf5o0-*1nWqndU~ zfdspEh+QxNd`Rbuv;90%oWl%G@9vGo{x2K;r#5#zl@bWy-(ageozbKy2$Jgl9i-|KfjwRgDO-IMX6qc!V5HvJ3 zJ)dE{OgM*&Xb8l`3t}rOhd4Ls_tuLB^1ESQ#+PKHepz$&meqoNl6Bx7YI{Ku*QZ0A zd1qT;Hh=^I+_Pk~iWx2eh1_GiQ>VZQf%D9Bj0^h}sj-NJh|)XEpK~b}%{EM~UG)ZS z>C_}~{?RV$dNu(Z zcrIi#r~q!-W{)^8Qv?@Ou*0kJ!yKk6>Ue)1uj`J{;0CdI9h;L$-sQ%wm0e^n$ zmp#v;DbLhjD4nPft3AwOT|I&FHS2=fm+jV8PlPGKcxIZV_GmF=NiyfuexAbwx*rV< ziM3BjVIBE*oXpsYgFMT?VN$T&tVl5*q#(`~G{+eR!Su~46x#<)EJgTHMZHTn+q{u{ zVuRrC><<&kk0pV+&{q^niCLFdoS4mq@S1(*;K9KuZhMvb;G{l1ww;!{mL4ANmiK(5 z&$0(rxtV~o(j0p|T~4j1+q}p{#Y#{yt}0|v&^S1-oE>nkJB+F_sQpwCcIF7N*3>sRqcND&ST9eZ1uWj2nEA}Y}N^z`&IUnTLN zzbvKP>z>e+XJ#qSb|zuI%jpF0ghwP;cUHuiSDHMg!~Z@y`_D)991L}u_5i`K1%=bk zZ+}~SE%|O?(z~Hu&O!~Uk-FMXi%m(JBU#?k@qb|%C9PNPC!GleruNHYYd%cNVR%lG zXb7pJ;k^f4Tc?)x7B*VMGI)}2652=#yCTLLM>=+g^~2Yk(IgkJg`KYuiv9Kw2Vz^q zcyj$!CEcE;mLdynMi4775a9{TX~r*H(h7AD?!`2wwp4bA%8n3Zk!qf3*};5jUZz*|t(A0=(APC|(qwzh2%Dr#IBjxJ`@dNGwDgn>JR8 zZD|>o^+}gCty5>D6=u#BZ9q@rh$dimG&G&NlUvNu=4!a7hYKz~(MQLy=5Csm7<~_( zpMp;xygEMMs!qWAQ&J{nOHdr+k-Ih=o|Yzx{vb=B=N1ehC?M4vx@|^GHDUZ*BTP|$ ze7~Q8qqB$t<^oW1&$8OzrAEspJ1o#yPz^nPnwMb`Cx==H7z&G91)0zkBc2nkPIU4a zrlb+FoT{xk15w;w;kvAPx>N#Wmz4~tTUyXV!Ux!ev=gO$+iJA8#UPgslUezha*Khf(?Y`|e z_OvmkHbn?0^~LCS6>sTS_{I&;>>-<2KNZq$b2cgZ7+-za?fM&*?A=X2t?%|qE$|$T zYWZlbtDLdln{?e}9YWct&x+Q7+;!OF+=AWJDceQ+t+0w_HcU(}B;W_jsZiDd7HQm? zY|+S#@;?43(gqjM2qv)ccKn$Vm!L&}7b+6|2H|sjORv6dx+T-$^TN@c79TL**8-WB z;cYnPpG&l2w}y)nH2l0nRBE-~O+W`AFC9wPiimrye<{yl>>(Y<&2vjS;Nz616iRMW zOb8d$Jzkzr^>yQG@|(O^OP?FLyUNOxDc!g4)nm@F}+sk1aK4fz4Ra-4!ZR2O)&c zD!}Yx<4!RvqtK_lL}Ye)`ciUrK)-vA9D$*fhI}%vi)kk0)aRB1Uf}b;qcB%bnqF|Z ziA*V^ni;Wj4@&1nokilH)jxwujFS3UkLO4C+IX?ZiY6CsPH!%==%rv8$nKI0)y7yY z^IpmE!K{h1tvt5BS+g2C8T>Y#`JO4kt^-~LoOI^a&8&?6V)c3#74bZ#ytFg}3nQEt zezz(oh}2s@+s8dW+kbgvsdsv2h8!Yfw-+03Hm{FM0o;;(ut z3}YDPNYPPCj>R3Fh=eQDMJwF$-QaBEFD4&#P5qOPxnvkJ*~$*KPqr@zcWikhX@f0v zMj=4Zl|PGhf@4f*y#COlWM6YiNgxEfGwu3Yk?*fwVg%raj9S8UY5HcF}DC#PBW-XyY|Le%)&&8(0%e zn2Z=BTr0h>iBMZxOY6$~U*2=)OO3;Tli(EH=OOlzkAo0x+k8R}^qAB&IxrRq0r4O4 z(|ow}x1&L9kvIwxm$`=hzvl|5B8=Jp#{~!$d;Oz_YuKaS!K$R-JXkLOlKtd?EpK#! z7I`mZD&slKRS|SZA{HZ+KMq_q&v(+=rMwCrY)9I(R<9((co@qv=S)(U-lUy*=d!?a ze!%ml!;y;obNptIrRJHv&vOS;F&(+yP$}!@ieG8?Lc)~DBgay{(oc&eG$rKS4tw)D z^ftJV9Fc`8VRD3g?b~8CVeO9 zx3LB2rcud0ZUTRpiN3gP%^ykND?Es!Qrex{xsh^Dzu;{JdUZh+BI(<}aubkS2o-H)LN_Y{{B3qwX ztU>2RSpFHW&f@dQ3ZZ_aE2eWum>sHTl3ozFq_mNL`%(+xkR9jxuTslbQRAa`;J1V{ zRC}VL5|&;$-3f7NDHJx@x`yw>)+1&+#5Q_yZ7eT;@U!BqNYRW*;j2jDlh%W;vX6Q2 zOj{6P+kf*z*s)%*9MTdDy45OF4SVmA6xzsloj1vggKSV!?my+J{@2WlG zL+~zpAc`;9)*7>DxWZ6>`o5Npt596-fjiC?vKX=JHhbxgKDsiyM)=?6&)dyjl))c~ z;d_%C!$a*M_aHVC?sH~2`@K@V4|^jj?#zV@=F>RHggD7*`Dy}B>v3&{~KEN_WS7gG+tkRlMEAWlQh zXUg?<8XWveEOee5=S2v8-hd_ni$#8Herb(S;LW$NMIKKcJ%8o-mdmTgyhkLyCtB7) z6aEn4U$fMe@s*wKXm1-={3jOzSx^Gpag zLawTDZH;DS5Gr>;joa+2p*f?uwynt?Ck`Y2#U1~5dkTQzqy?`&vQ(QR!G&5lMD3 zm>wi5pRFKR7!}roPJirLyC<4bTSUnU`d;Uq18*RsDpH~`mBols+mL%t^h;3oY{Q@~ z_pkO#!yVhN%^8Wlmvq4m$WNAMp#TS(Re3d9xguK|AdztHN;W9=lEy)#-IIyjsHLv! zeE1as$w1WHmP?hV`E$IMd3vY4ws*5pI9?`)63Fx{Iw>HjlZ=MivLUTtipyLD)^-88 z&`&kTDlizVyOW_)2~N+JToh$0+wNV9e$Y67&I)NHRGK8rh4v&omV_67Ctz>@rPt0w zVQ2b}--2=+0_$N3dI8iH6aENlZtEnqruK2U3BK+{Ua6`Pc=`%i^sRYUoV%pDBR`<~ z23B;*r6zvpo^&ANy|HIIt9FE9mpc-4%SFq@vcxzZHvT-3tb}VpEgKK@eqm`ouR^~W z<^K;nxK^X?cK0kL$YlRCXmddYM}C3>`NbiOQBpcjeV7B^s9#YzSAU3`@B--OkHmMI za%dPZP%?#Fse2Td5FTr3YHmyI@RU~^eX>5Xk!0v;qUXh3Bgl%I6Aq=wjCK_q&QP35 zd*N#+!&7mp`7-IGHPi9-EgdMO-d_f85wyA-){R=*z6}7Zqk#`&&rXs=MQwipsw^#RfEh!dI0okNr6FZ=I0M zMA9>Bo(jK7Yy)i1eRG&s^s(ov1{Go@X-qc4D5~c1p#|}0ne`G8GGZIqc#~- zs@v<8{aKy@B<~Ww7jxUY*pl^HAnVuiR>)I;B6#!ySIDv?vKQ zIg$f`?@x$JWNf@2FW>#nVFItXh0L<=0siWIYR6TZpb%>l;->2BF9(gTKOxd+&I`kz z?Hy(qSbcfqy*Z8{_P{S(3YqM>y>_`|^P|2eZ&aE#!>|2P=p*F(+*ytOrEf>k0Win$=xlz-aUv%w zH+8}hz~$?BxH6sKYDgkRKm7DzzW%`xScd=6WsPL^dAWvS-##~$J}B%!Uw8Z;DE^&? z_H9X+K;;!F>c8e=+`}4X1DvStMcU}%c8(#;MlyEr8U+%2n86 z(hUhesm}H~z56a*I=JZ?^$t(GCpyNpC9K%kt%gp&xQ0brmX4enX3CglONa+xitfhY zC2_M4Vpcg$1LHCsA1zieR1ur;QV&w?FBbD(;Qs~$G*lss`_kg#y_Aq;_x;IY!QidK zj>`*jqjvu$D?qL=0S(FT`{I#( zf&Z{6MQ*vK2;iz%Kr7%J*f_mc*I=XMj;zM>*40>XB9FYIKAAIr!{1R+adhp>x46M& z^=c5d{aU@w5IO)H!+SL~H64)v-Rwak+vft?{|I%v&8VT}iw`q?2Aa@wZQv*ybGdh3 z3k**+;jh0w%otq-IKcL&Hh}N}+CqKNLcOp7)G|Vr<4=*f+taWcf{o-{DlA(v0kp0Y zbQ%_`Up106-qjscWWZfoN%7}Qa)lsV|6#djC9&g%8+hxNxeOF7Za@t@4Ag)yOKq{V zsVE!3S6De}Nce4$zRl9<1zPtTrJCip+8|{;u3I=$`ZD>_Wd!IO5HJtE31&m^o6p_v z-#J9QWY*Ab@jMJExkW1;>rMi0i|MfC)rmrd1w?!J6tqj-0I;^bOzyf~wGmPjANXewCganJ{GE`yGqf{qd4yy?P-Pm%dKp8{^yrpy1Pa6P*Tk{e z1tp_!aM(9Zy&L?$0c*7+nru+>HC7|BH{lncU*D1NU_C)OLzQ8wGhHAyUR~x?Zq(6U znzb8dlb))b0>f7})zMV2u-GEeiQ{xI*KjC+5{RPpJkfYa$9dc?J`rLd``4)#;r>MapLRYfkMrO#4+>F|(LqfHk&f*^uHZ0u>A}aks=_c-J%Gt6DfV2-|1>>w7z7UM>+$wT4Lk zF@>c|O7geaLz)f>!5mbc)-Wl_l8X;r9O_duGov)zcN2LfMaZE)Q*T`j*$MTX(zi)E zIjXenUGGMA-v1Ga;sb;7nKAb1g+5HqO%a)YukKR85M?=lgF6sj;m8Gi)6|f~^Lz4q zjpd#AzLJE21Us!DmtXiX?YO*(ftT`@6dc#C^NHEG`V$bCLu^ldMPS>TRjvF!%nd=N z0?3Xwo7y!YxSCF{e^4E8J93V|XETnhqsz-bC3m-gQ6D(lm8E;p;M|g&CEl^mMMrmB z&ks)F@r1&x5X5LB`7Z$9CP2 zOv+QHc@5-ww7#;-_)%{?%5gkN|J{c4S?Aism-axC-Zp}@*+YkSE7KpWLxR2_rd)p* zmaY%u4oO@$>?j5Wa3*K)3j79ivjZUf6OiiNkt)LFl|BS{aG;a9>DNx2YDKR_T6PuJU)!rl^41(Gi!acI48$ZFa$F<*ANORnJsWO3y;+go(^Y-`(b)(lw)B-^C_4@ij*RlX*0lIC=ZBlCm%0i zsa@&8$_>~4zwgXGJayHJ7Owe7TK0=I1D1n$qFHl*9Nzpod$ZdD?8D${-GHlMDf12n zsH_Y~!EzH0>Ro5U%3spdOd(Vs$=I zl~S7$0G;i%U*yc`Pp2X8{R5!V@bVY#wy?pbIEEFlQVP{(C7zAvKk%ZWecOi8ISR^% z)CSDR(buc&MVeg%Whxd1)(#q6mAe#$JRPmz3{QS4P@z|6!~4k}4PUa5#RVKPq~+|L6lcwf_)=dcnq5I{GAUazCPdu5Sq9ewE7PN?}j2Q6LC?(dSWygNwZ>u5mB*P z$2cFb`b^*LT?VJ{up_o+2O99Mz0nr&VIHI_5;^f>$w)&NQ1uO#p^$GkGNw%e!p2zPDnRr(x|Sg@Tj+4G!JNii}9w{8tBRNlN)MXI#XydX2)fx>ZNIU>)DH|xE;7fzBy|D#S1i|v>%<~ z8}6&tjywA6{I|5>c$ltg6tinhT7wOO0|w6;AZMEa$R;{&x9-)0b^2`Wd~l#Su5&or z{wYC>Grzq(@QreQ39yO>_+TXESz}3{C{TD4P`m1vuRmoB3slNu8vp z46nku_bOW_3;+z5?-r?Y_9mO0-WnXTtTv;Mc^C(%gr46{(szz=)6Fq+F>gpDX%RMc_52O)+`dnA++IkGQ{HTB>F zn6!uo&CK?!Qf>Q%3T$k3n3G?2?cWWs!zT9B*g+_l?qmWe-jt*m1iD_SSXc;&d+k4L z(rZGVfVs*0pR4iX0S^+nYx_9}ii7K1M4Hh9;m;1+^JQAwbd^MB>@44zsWINLytJU2 zzqmeM{?D(!lp|g9)ZP1YNR1O2!=rF611#O-p*{2U!h)#)`HdibVZ3lzEv!^1ee1ge zyO$-mL3_2_XBRac) zyZPaM7JANMEW<~-eD|bLP&@NSzsD}qWo`*zI{EYLF~r6;Mt9$L(tbqbbI-*W8`P|uAu5t*fn`+W2Jj$wPj22Qse|!iq4v1ajOn(0e8ZA^29n-0~^e5K;@2JIp zywpl=^BoqfK1k%sVto5+{=YSFK<73FTVsq?6-!Vm9Z}CSe<`|s27*cjVJ>`lPUxn1 z$4Up+1c%l8k}!4d#5g;U2q^#=rcrpM>xaka{`fJwUaSr3jE_(c{|2?q6!a9Nb|IoU z`*+FhT?5}Lpo*@0gv-od@x&g^H7Byu|7EGv39|mk*Q`GzpxfZTuvjvr2?wfk@M2Jb z$G>O9yot3+;&mIWQVj=q(kTIoO4p`ns$2fSP6!7Yb;?CiOJX!O+BG^xMn-_sVF;gs z1RqiGFUXX%JaSfA|=vEz{`|i&yCwD9f zrb5qj?U{lJu@{%aVKLE9)pvvwTvqTwh|JhGnJdRDDTmh+6vVN&3rUCKG#Pf&WzRwR zup_m}4OB>2eeSQ0=>0)NkhN#ntG87aN|@)}>`&?#?=kShUA1R8`#C$N%<+t|M?#Kc zwnr#Spm)yXh_J%+yJ0EFE(C>$qRGbEU);%RJZK2L>HvHpTdO$Jzm-#+CZ$@HuS6Z@ zYZY2@CMQ^LL|0=f6xkKdsXE;{!B2x(68gTqb5E16+=OTtjj4AaBrpM;GEDdMKhBYzu7%X8dQwQ=GEXQl~l3r=N|Yae4q_1?bleCm|D;p6DEDT)xZiSnqD}s zG7tLxGYK`)s02?gW{B9=mObYNoAjB8zPjKSjf_|*FZC6MSQ=U!wcCm$pg%_MzupYpRjxzb(EW?V(-q4X^RK`eu15L`SkOBZD zivx5b=;{E}nrAou?W3jpFfnBf5-_e+0-hbak@t#J*w5$c$@Y$Yzz^4gIWlBV;AWkp zucA`L^f1OxY5)o!2}<4Z!{2h_@LD2V1VsUD+mIBB#gt>o3w)g5wcI|t@RIT*`vjYg?v?1gXJXo7AyY)_~(W1sNZzX!^i zH^``@I05RFO`V}I9FQS#%-FQ3B?L#pTZA(lRfP~O6?+zv1^Om}kq8}y!vW=rIZG(q zkja^u_&Nu_+z5YkZO|Jm({K3luHn)n%u4#(7#kd57&04c-VKrj(?Rp$XNgfihNDJliFC1nwQwoBx=?j_QdK!4_ zUO^TU`yOxszq&!VEa*P+zV?dxxbzDfi zK}aqU;3dUy8uDDk=yg=A=6^|jZf!n+^+gAX6H_)|NsGndhndy>RX}n)k@=yri!=|J zq&UK#;&?9*(BSGFRwyZVAOMh{2VC|VazjI6I?7PJZ_S$trBz#H!tu$c2yLI4bvG>} z)?eb>wvUK9Ng0iDD!B2Su(RWdK~qZhhe4ux^AH~k-V>aJ6*vvbYEaLDI*8-nCTg26mC!&Iie(+W9||APAj{^uo(Zmi zT~ZaO|4ucY3zE1~T4ua&)X0X~8O8q>h%Hb|`Bpg#l z1f&tUo%LsCsBLWOYH}7`n(Q;bwjHvfJ6^CmqQx-F_mauHbtvb2e@rj*>jmL02l{Xu z6tiqOi;D;>>kojXqb5J^cY`gU$M)e3PuR}d0!dM@3b3MGrONo$Ll#%vz*1-m*FpNH zuAao}tFQarx3K_z8qn2Zq>P8WT4eyDxw0S|%4<0PwRX~>0V_Jh93@e1#gIwo7yS?p zuXo35k;ODzUQAt6M4aiUWgA;Ky70j9K&9T?^C>;doewpX&}d>c6C*2N|KK3Ln)$#H z`-a|G2@K}2OcW_O4XJ$aaae40*^p&nBD{XO<7w%teJka1I?7At=GoDb&|exIRdw-x zDPG1~$O-1D$VL269dVyHDRaC6=4ja_;+MB5U2{qTk@S2rz`l%Ow$yDay;SiQ}<~S$8z#^qmh<6a<;LS&A3(#8gWVX0%u0& zM{Ji0Tr(90dNw-K<(&YYV$gVyWhWd0Gl~+cu1$>g3x#!c9;+>5(XEwO@obXZ{>mzI zlSnNrVvIL%wXkqJgI)hTS{aWlHFqaK--vCvTusBGVc{Ne2v>kZWd7Kkvi^$(|hNuCDFBtfs_$Y{v zUqZ3S4*$KI-*aUN26-Hi7=rPzmtb$%E(<)J{D@@#j|)&%lLHVrTLKfidB)~ z^9SmCR&-U?RA0F9*S$2PUisLv->5@2B~WPiFbHEPf)&_!x|gTs2^$>7hpgwXZXPIN zTczfwj@}a6cr90^8X3xcOFOnL0281}3&8q`l;Sr*b4!bdPD;@1@^S@&n3mQIrCj18 z;%k&uHZn4@RO5(0`Qd>+D&r%aY`VL9}uZ^;LRjkgK@Q$|f%5{m8$jDw1S$k53 z=2n{>VLQUjg#HT?d`U{5y9;&4LxNJ<*=wg^*3tMA#M?#vL=?VT?-+fvc^Fs-}UMCv*Yw}Nj(w?|7Y8MFccbZqdLDfFhhLC2H;EjLD}nNxpR>@vh8|C?Bq0 zZtI#r2x9pzD(;^qY@>9+N=SlNUeo0vaXy7bwCgcz81IZ^t$=K%A=AzP)?r{^5YMJt zYpp6}D5CZa?k{_e3wCBHq|yq_?Lzx1rEvd+0_63|+(ofqeaMXjvjB|CuvW>sP_;O@ zSbd)Y(g3-Rc36;4?BA@jex2LovLQ{A{MG=ROI4^lw`=lbIrKt7E-`xv$VjYh9GaD& zP|Pc@O%hqQvtDBCzhfI;-=?qKB08RO6+k zr5CEjlcR7#&tAV+?K6Mlv$x(IjVxragE&`hAzuwlDsv#L6nT{lQRCo9jDi45uKd!1 zBe;l0uGs-dPA1q^ghp(C{bgEHQ*%y1@mnr=u_&5aE(4Af6*A2cRRGcwdOOfQXm85sHD=F`2 zNh*@ZE)N${8KSB&f)%0Rp6>4V=0D#featIDdVz19NFDGwVp}loyxq3qW77q#Ikrsy^`1#kfo0?jDv=YimqSP7dqS7iQ z6>An3$Hq=WBGtcmxx3p#eh@+WtNk_WruWp+1+?fzEPiI%eNq{Xd6}^lQ&ILZCW`Ct z#c44$I6wwKE|Lwdk+kzlLqoV0Y@1_zDmMd=u;%D>$@EL}Ny?+Qa(8!c#elf?!sK@= z4t5$B>KYoZ;I$Q?R$6YtP_80W{*2doGT?f+Y&hwNfJ-KaGuC^4_e2aKf$XlWWFh?| z&)9T~Ov4;_TKtpsqTXS_li8I&9dUIBTqpQVBPs&jyOyomqiM`Bgof7SiVj1Ds?sUQ z>koXjB`+=+qS$zf5SaG`ttPPVq-~ogDYYh~aE9vyzr>Hu{`)S+dwWgDon(+#Rm=yS z022=dtn|;;Gs;(=EOa^$zV0_aKK|Qk_g;^kF^8GLPg8~;(*v>|j|F&Ro?8Z{r3sd_ z7BVPcGJZ56yuwkD%BlioBR7Nsf(drA>=~r_(HE)S`OZEiJVt_~04UnB4u+4FJM-Op z)6D3}*E=o=D51C@yOw{`q)X}_HP!ZbEZ_MP$}5WCY51Nc5c!0d6zecgCeZ7?FMz`h z6+$hSZd7B`StLfr^fE_9_S;)~SN8puQOhxZ1#rjHbn;b;r_~uf%Bkf>;Uf6r+|nu0S;h(fK{K+>`5S2y)?GT+Tg2=Z-d_^{aVqr)x$2LS-Zbf=vYZrD3S4 z$L)%j%4#6cH-slYIM?K6h1Tf<5reKU2ss;1&~>&xeek4}Be{H_Z{vU3Py-6XYDMj; zPM<7p1U92WcwSJ5pv=GmE-q1oy$8#kf9Je*o{cCvMDBVN)xA3~NlK5fCV;S?*OrVp zz4Wi*H~4N=&M#n;6l`29E5rTT$o|&*t(Vso9i$aB(ueMIAHuT(wbkw@+s&0ZcJ!>QDJ4v@~F90xnQ zJA20D`Dp!>;U&m2$}lq8GzM?e!n%B*=(Gl#fYBaKEyo`Zy-Z?RY00NVwFi2SS5h zo1r8g3gr4_FcUZxwySA(?eO?4-Mj_NL({`IDKfqAjfK~qYIMnOX(03x5hZ*X(FAOY z1**j(#Ya}XabzlxB1kavU=Y2~Yk8|!{^OKS5&DP9`#$DfAt+y` zMO-5P2u{1A%Hy%b*lmteXG})=llpWe5KPt`NSg;@16d1uo^}z=Zu8^Zy+8}KTyxn; zCqmB@WLb6DFuzICiQ`;|G97>FCN_eNha^h+2ZxOD+_#1Wr8cTnz@%+E=nK{H<7v+sflfVI$@M5kCx)Yn{|`s;js`CPpN@aEzwIqCk32Lg~4mP%C$y-5eB@UPs4LQ#X;4i67U z30@hCcuELTmTjqt)M7xu9Q-d34N)P9)Jva^QBMSdUG!|g_G3^VH z0d|BC+{yO@bD_$?r@f{|oLbhzmuA^QnY|H#mYU%?-L8BGek&_0Dds#Gb`&MBls`eZ zbX_B8a=)S>-&$3P4}+3Qqp!5DAI^BDtQ*cDT&?#;bS}w`eELXyYR2M>GyD#+>T;+R|F~@ zxCOakcgC8>{ED?5O-)VI&QO)Gurb6cTX5`o;;M}W*`~5*(cY;%l|;fllxE~>_1iB% z1TctMNt{(aNF3L*9#9U{ZKV?e8zDkb6!?a);3(v(RqCL84%~6Bit! zFsa~W4R|}UwdM*NsS}F3H!YRDAN&s^fWM}=w1w#kngOHV@|j!K)E*f6y6^;>y&}Xr zs$sQiFeIrQPv>UTEn3}lgIsSD%SXPqEkZnAcNBdTS5_V$9P#49gE{NG!W+etyexGDNm{ad}JkWQ3yF)`jlybam#_Lqh6U&?Qj9CHyJVrcv-x2c`M1E?cFM zj$mr00Jn&I3oYWNpK-Gn&n0Q#falXpX@LV}|MertH#GJ_f=;U@>e9xlc=ILY_S0&bldCJWvUDtD!e((Lwcm2Ogu(63 zlxfKF8X3z2SUNr-8|fdD1i%WGG5o{z52IThXCEHcE|Tj!6^Rpb&r4q&L# zN|%+ES{NJ3z}wEj&?}MWHLK=k#Z*&1qE5{}A|Zhdvq*iOSo!a5Ss?Osr#R6Ry;go2}<PLgddAg!%Iv9BtN1NOc@m#xhZwZ{@b#O0}D`@&@ev6Wwo!tO);4HEWmZ^)ab=v#*GFd)2zU3G7fjrv;fI>v3E5ATe z)*I)1Y`h(K?mmii6Xe*k*R`q-F?>dr@Umkz zLHOj|TFqGFcO=z%O&K8YzKm3Sl{mf-Dk;k0 zLE<$O`lMjx`v{@`qX53PSiPJLP=AP~ z48RM{u@lYly_gl^2t2Fzm?Fo3GOZB0pXuUXUzppVD8c_gm;GLOjRzsAvkFBLwxMjubVXG`0&0}+bEPojB)Zsw$irncnFPEAom+Q`>nmxNQw29I4=4555x5MO_Jj*B-rKM zDiVb5Zt&^;L_ax_Joo(Hp(wGvizeyJB2ED}_i}7TFJkl#qwt-xt{8l$ys0R9Q~Ajs zNPwUIqzHb$eVzpwp^Su5%MGM6R?oZH+|J0BK0;I8dG$QSglMG@;JI#{D{xRt)2ZwR zY6bj+Ab+nXl-Z@g;0VF{j#$O@{LDFkF`V8h z_MOLe@VK{Bp8M&Qu;));%1acp*$KrQr~#Y3&v%N)tURSJM5On?X3RogYsLtJHg3=u zH~K9&1PvGYDEj^B5RqAv%CvE=yv0Eo%~dhw3EcUcl{iF9=3o6*#w!t1>_x5#Q7>@ zjP%3}{MaK)f3CfyBOaM9mZ8A#na%9`l~Q{V8I)`Fzn|W?h1sik<36YnXY76M*bwW* z`lAn!)d8`a;M>&Ks0t1m2BN#+adEc{>IPxH^ufIy;xBF$g z;Irs9Q=Tgtq?LK$&H+ROUpPP9fH3p8Fp%8pVTX2S?u=%pk{gjheMQ$!v+`R=oerJA z^U)s?-tRzYj7?unl`ndFldj-{CUYll3+@*}+mi}rKxW~t$VtDTPaK?i*&qp)3RQy*@>LbzYr11sEmE;Wrj%SdlHB3Vt%SsCd0oOMGB zm_87KC{b8hi8F6a953tah<}jX_TL%d@oO9rILdYNnV515GV8^+bSiBdgMIc6M?iB%A5D+b?I!|6oq) z7pO4prLU~4yj5-O`x@=3a{!qZd$-BK*B`Je*C5cIa9;4k>149*1#{3!fPsyCU*gY!w;=_3wwT5{5i@NV3A-v^FX z#Bzx?eSc66oVTCcJ^q23zWSM1tC{A-ha%c-e)7{%FG7j*=rK>+t zo}Sk>o8KNO_M!)-04fF5KJiu4_t^8KAf)0$% z?4Fsf89;JAYwFQzngagwj*Eo&*gug)EAL~McwQ)ckCS8;^_dwcg?(g6zT@<(g(Dg9 z8UyD}f40_^D*3-{1U)EZRk-$2Q`T>;#|oo0h3~qDHjfbKb>@h8X1t6aK)Yp_WyGJ% zq?bG2`KIg_`hBEoF*lBJJ7ljpMx4gaz-~2{g97_y=BOkL#=}c=;weHP@WY*$UF_2B z!C@F9jU01x7^R|Taq+G5WGTr=l#@`joq+J+iHdUL%&`=^WJcU;aUncNKvy2H)USp7 z-sz_k1>G#@0bjDvFTGI+UcX&_=Z40}(!o)4l?KQ`o#~mGt2de{)JCTMI!wBz+qQIf zjChZwYMw=V@OUEWFEaZ9@$o7Gc6x!fa{>=_NFa(UAA2TpAP6Jr>;*t3R?WFfl;G!! zOe`634t}~V=34E)y4p6%*W+kQhbpNG<|Iak?I&(LHkTO789*J^sAj?=E_|VD3Y&EVvs40{m~? zvs6j+rGa7C2fMpp_aAONzO=P@8v$;gveO4-_NZ$M4mk}*{V{?mCXZyDZ{qF)9+GlP zG=0^aT7#5lNJUQSY5evF=6OPu^)G}0lkwr#d=jssc4^tZI*;OgdBs5+gb#NT22twA zEF-QY*2ny@{((7)L*~U=Y`6*PYl*LATE88gbvc*|0=j4jWtctnr_&vJ@6|xKgenpM z8-C~PW}2Y1kvn39#?vX_vMNdTlnGTxU%Q`wbeh`gM<#q;t%9+JYP})!(&;22b zi3q;~@8-jRJ}S(|{mk=xK?EptZGja6P}&&>X}IQAP_c|OHAu8))t!??6F+Th!AGM; z#tX7sg5eCd8A=i&S6@9fu+On&8MK#kv1^xvZ3Im;(p8iU0}(pe~N z%;kvRIXG}-h~%K}*8z%>Q(kzf%Gv)*JKdcQ3WcPqdrc$1n87hJ@*!~1c;`4uOQtPJ*>Pqpy_fA_-bu{tWp?ySioeo(<#pe&KmigAe;abgyJh0qsB z-WPme;*qB?u5J3Y6>r2W#@k3V3~%T~+nl%6&Vnmx!^ApVws51=4K*M^-Z*pXZtNS; zIk@ip1bKnbs4>k$)QJFjipaY0YFo-ir4^Nx7Au`1BaboWYC`JV1BIMWRN9qy(vk58 ztW^k|$h1BCpw8E}e#GL<5CBqFRK4nBP4Hlij@~!RH8o`b^-fynq~@CPTaL?bfl}})t!yOJbsR8Q=#dq}2R5^5 z`>dY=L-I$yi3_pR?SCn9j#s0b@=+^zi?m`i+8(BNm(<%3H5VF)m-QO2lVD%tea5jGtyr}< zL!y5H6VZFc#^M9_tg64tjdcgFTIV`YtX%)DiNvl%|4^Opn58eDEcXx6sn}5u!ad+o zd|z7T@x839#3)EpT$&pB)WFlz)158V%Zm&b|yV|^S|*V$F5Kh=u< z$H{H5UBl8tBqIS8XeIhsIwK&YWKi3zEqUSIACA6faQs=R6q?1RHDdOYVV_6w` zzdcJz$?cJPZV!L1H)05P>*E%?ZnwT`5sL$6swMg<^OTZwD(>Ven3W_od$nqr@s}Nf z&fP)XdD5zv7pu&B)@xcQL9+4`)?|Cm3+EG(nqzZ1PfePXey!+xYBa}9^=|2$I$kgKHs?8SFr}5dOm?9DC?ZmExCVWb=`~)=)5RFO z&f`>HLhNUiX;smX$N^%DT(I4X(r zl2syxV_^6fw)^A1#+==29vVHEU0C_4n@}v9Uc$xOBUT5=H!ShGGVX!KPrSJdQLaH@E zyKiFw(?`%o1TtevDN5za+3ihLIkFwqy~NN6flTL5HuyxWnA$(viK(2|tUWpc(&4zf zc}CH$jGcO;>E&cH8&_?xle~^oxt8b5M_ZXCE2_$j2L!T}q!PXi{jsq1#%{T+e&!3U z8z~#8_Vd2Ya3*`pF%&jFWIcQKi^m3x;eIZ(SeT?@AMY>u1h)Mdi3$ymmqu&}ln?vX zeRu-J%M`gd-HKZPFEl=EVrePLO<3<&^4&q4*JwNmtKIS1YnklvJ%u7&McrAD=KxUl zn(jAACtGQ1|5C9G+D1=LD>LW5}gGouu~GExr4j*HzXm--o9x4ZdlIkqPWD@--Cou z`7>R@*JQYcC8g40k&j2Qd{9Zpv%MG?CqE!B=3)hh{F3sUG$k z7i~{@MzP2@i-lg#zlZ6XBJEyeIeoXrca2dldD(o4*Jvt1*5^akI=g)KakJ= zCv(Bj@4y>+p2r*Z*{mLR*mxCVqDf@WmrlCpM7D0%Sg^^IOL0hfab_;wHH$4!^Qj+! zYp8bK^~HA0e}uAlj=Xi?V@$N=3PAOP4g7JnopFAY?}nzRnY)XM5|wa@ri)6Evh&G! z6QWYSl5zc7=3xVL*w||&HvVgq;o?uyS}2B>;*_m#r?cflCp;+-#^?ULc!v5tk;b)X zmU@j^^I=T$OioRGw0~!3=;oB4I^6Q&FqY%c*IXtR#Z6SiT(YskG+6K2#q_CcQ=k$Y z{;s;S>Rpwl*QMNKn~8heNzIsr&%*6np3+We4i{E%kn9Ra6_hd4JSx2}7E$Dq9K0pk z3Uu-7?1ih!zD$y@&Uq>O{maS#l|nQ;O)-@2xWMTdEYLyPAxBO`nD^xF*X=u)9f+ZBwE`3ycPT5EU00#B($A$w7R%V!NZc!Y#J+H-RN!_mw4-)i7n}d%iX-R zXwEt#F+asOoLVjNo_)=YhfuI9vNoqS+4GO-em<&t7Jgk*p>=_=q$ODxtZRgb{GDb50sh75fZPeW za|i2i9K8h>5|`1({z8^el`*DSbUNA{mmGkDtVSL%OrK1E#ZFJfgO^va?4v&NUDTK3 zpS$mvdoOBsw#kir z^*DIR3?I#OaVZ+*W1QDGCrp#|8A%;wtoZN|zZgkMn_Pwt56oNYu3-giVS%AUB&jRO z{leN(-U&WnJMGN?dCZ3@^?m}%^C6Qbt>Q}Eq1 zIY{FwS?3BZ(FQijbB#c4iN+b5}l_Gj_gt22I91X@JD zp_r3z$h_G3somj_V>Os_ZN)(<-R#G~{*sM$=K*sXvzgb_w2v_jvIQpX zENKiJt7T)s#?9FFuk^3wDJK3c?}NHKa`q(Zd+vYYdm0KN#8M78RDX7Wz32y^BAe zQxzu;HoC%ld!0SX%$cr|bWQdsn`+0@Af)-Au`0Ol1J}2zpl?n5@9+wp2#qPc6jH7w zNuZ}C!Bm=GwhpR)=S(6=9mxQB0hBZaWo5n}U{`jPFSe%VeqEPLm!M9CWhut?nudER zruOD*cn3`$EM0wdwO&N#R+g<=vW*gywRxm6o;m0)sONe1YsD-sa%MxIb0oXhf-~5vKu6=uop(r~$chkkHd->qy z;e5r9P~|eQ>xz#GJo>7$&KfDfpz*&Mo09-fG9R~Q{_uu8HE$(b@%lnF+Cq^x0Mbg( zN#H)|o-~VbZo#^LJ-w$I;caHjzcX5xXpJ$bfluNIKM1#8e1}>%dzNbR5<2NM+Ck<$ zF+4ES_NoPi{F}o1UypMi=A~l9ApY@76AeV@Cb_*SO}nk z|Ndop)Pow9K59xnIl~(AT8RIqVA_oC-)fy>Icp(svXU4y_ zz)g6nHl9>O+lV|(afw>lM&K3`IYH}U(DEcVF5$x4J31TO_Z%H4) zRGc=@jLt?8!ZQ<092D#=^2q)Dx?(OXszr0$@DdzZGAd+04Ra7Hc9(V|m2#`U9#CP5 z$`~v#^4Yw(R=M7#cQMXuEeMPeN92IHvu&=c7b;V!?x>WJvM>Mg-Zf!S|$VRL$t?hGM1_hXZKTprp^N{uaSd3Cop2>_7~pOEm&mHLEf7h)+lkUEn4ing68!1C~cKN zSB`v);{z#go>TVvmW_B!o;L+xyNMFW>jd#lZnl5dZ$3G7rAbcL+hAg1f)Gu}K*8HQ z$I7U1D1gnCj`^utqwU&(RZf5+#E^u*h5uk?{)Y{D%qEY5kQ7o}+N~F;LcwON?(gn4 z^f(4eM9oLIr|9$QtPsqp1W@bSFu8~WnO#fepfvg9Kj+ag#?Q{mS-8c%YlYE{6>mZ! z_&?Pq!)wr|y4JM|5F*7@90&Auu8Pl~I3sbQ(-R!a6FzQ^}w7Y_fnH>s)#` zIbe1B6)-t72bC+tg|VXrOH!-AuJ(a&9}D8RWOl2dU0gT!Wrn}E^Kbv!+(|$;BTe*K z0;Xc~eMofNt`Ae!!R_TmKh?$|TyE6J=jY(3x5ptzZp4ye^5MypX?pm!@T{MEi%+bT zu<3pt&evk-Z*eRL)xTi?A3i~$l-PmPR*{w$$(Bwt>?rn{-zaxNcA}anx&JY8(>#ER zauZ%TRRVm+;Os9REJ@U!&FIhc!IHF~67&*3Jn7Yx&Wj&ZNZE!Y&dZxWkVhB_%GF?P zvI$>4zom;`Y}1R2<^Qz`22M}3HT;+m>1ZV`Zl^51>ae@PG|YRx`iU!~Xa5@0Zzz;kn1Z;Cje~nUiv_7F#S7Hdo|=`6XVK<39*8FB{0!CCoF| z=2HDQZ->2#Arw25xMNz)_kA4`ZL=JuYg~+y8nBs4ASY)Vc_1R7dogZ|%u0T`8|iEU zU=^h52et#>qvhq0-E$o7?daXH;l*f!fTplXY2pe$oB*RRhVqyY;%XS1bYoQONLQBx zQ$&Dft!Xk$d>Sa~RJka{|6gh)^j+G8i7>!K6Ny%k*cP>IrKgx&va-S1eZ+p`0Z2Uf z&1&br%toG-Qcmxar#-oJ|EW4$l{yWGI7*Vh9cx)%L%LhUO2w=AI&YOSXsk5t{0OLD z`~ftx?nj4)b7x73&+P^=6lM++9~Ka3rG<$-eR%JFacZo^(_+ne&i7?+w@c6_&j>Z1q%{~#>i~I*=*RgE(iq)R>Iy#f$LVT0v*3 zYOW9Sq%Nx*SIfb`XBN<4hNpc9^JhVN${ebr!O3Upp8D|#S|ZEu?bF_nc1 zgoilABpEZ`Dg$}3esW3Y&e_UXGXFzQtaAphLnRL$B(=2cE(`Dso^2$# z`&?{24By+&+N!dAD+jwM?0IS)5SLvyn_zP-UqI3Y;p4ox?d2mObbmJub(EYAOgwbE zn24-)%BoJ8=>xcIOl-to<@!4}O7-C6S?l-pS0xW`u_Y2t_jbL6MedCa$!o&(!-O22A0o7|9sv+*VSt7i!V z!_nAb8iBEr{3BQXW#`8)uMO_*?+MDv^f1=!qh9jBi?3$A4s(dp%`*KbQt?S!(~ z)vU)6BbqYH%0AiI;dU9|)|!IGw|H?@Vkt*QZv1dW)?t>GjJByXQ}%faAtLLUI7IH} zhGL6Yiwu{je|wN3+V^k$5iEylb)8%M5_S3F;FiD}OwZZ@)*p%>CmiBg)vI?FAK$ih zBb3jIn$r>Ld)U`n+W{APKiVbt;`zr%$n$(s4?!(X?_O6mxim?Le|x(q_+DJh0FD#V z`y!hR2HTE_{7922Ihlg>kKB&!#=_vsS4LWE}=U5Kx4A ztPN{D<4GOLf>3VOVF2wmx7W78*daU^%=d@cIMpg$4l>V=IeHyhiLjR})s?k7E_tx@ zFKz^00&{xr%6(^4##8%$3~6~ym`qE`lM6DETyse1;%ZPV>g zOZtkIy}>tk7NPtFNuDpS58U*i5#PL+<@A$ZQS8x!rA+e&@l zxteyP6r_QkNd0A|LnwIsMnk!D)Ja!gMp_IB>RAxF>wtM!tw58BWEx9Fq=CVZScwLa z6AYq}gEoD>m?e*6HnVFSRy`g)sE=FHV1KqiR8H@f&cP_pB_ zPiXmbYySgeDP2aj?ZXG4v?#U!NZj1kmYq;xzCIeRVt`eV0o_e> zeuMlMS7%WnE_}4ZL@IdL+%fLE&s8GjpN`N@dj6nP1o4pi|7;brKEwUqVWC#L;P3DM zpYH7EPuq)7G;ki1f5Xh%c1-=WvSmfd8ICIy=lJ5ytItb{V)~Ajtp-+ZQW~3|!*pi- zGqqASDtgX2gBiI0sY0%`Mbe(@bnRMRa9xuo~~-^lU%iGC5)PyZS{7_s=?S4t|Iz3yQk1WaM(B#py*GR z-GRW{RTo=~o7T=Jmetw*d$DE};vWzcg_5mFmOYS5M9`h%qwbMbU}NGO5^@Ak74@nKyP`3)2dM#nN_F) z7K;qVU}KG7IHML$m*Bdlk?lc9xU((__luwzh29!gOl)jALiFTA%6($Qrd~#FEX8T` z%C0<{_10)Bs6h-dOXhTweW~8ad)Ev663%SG~R|9e(lW+#%@7nkRpS}(;b9NS8tk6TKvB&$k zYjL_?#orpW|2_^IRA5m3N|&?OxXBRMMU#=?u#@5J{l^_uVeGXQ=h}SoC%$x zzqCnvhgT96gb?XM6rG=M zfdoW%7I0?pGAd95?VJ7Le)}GThRqvi-@XjmlO1sy=zP`!gxeSJzgV{^{-Rjoo4y#s zKk}zqS~sKFvrbPb(~5#l=Q39#jqq&Rl2PgbYzGe$Qy2zngwz8_v6s@JGvK9g{kGIRHokM&X}N z=A8vRm-SCWj};ru?*H>zoAj)f8*Q^aK7ft2p6-D>CypL1{{!kG7MAbIU#&qK9NV!! zH7&^xbzZSe?)`dTd14?5gct%L3|Iuj3t=#V2965yQaASL(8Ad#yyyG#X}4F)p=S3k zn*oeZ*fWE=sImz>GZ-aOkO%G)hq0vz*}#dLPpS!@OZ#kdDGz(?aaR3jv9NHmZ*0BH z*AviAHuF~~*E!mntLY9jt%@9PGpfTFRRjG>gD2olvJ_3oT1OAUgB@@?%r&D>wA9x~ zihf+2#H1Y_90ZzZnp;?;**h*8mD!?4mh!?F9i`!Dj_c5!Tk#7( zhyh{ua0q)>Ln zKA9R!h6Y!h9=}UTwZDbBjl9yTJ66zu%&n0_-A_B8vrvBJj~75`e@l-?N<4TT8lbti z)g9smspZutv$bSO-dmM7_s2Gke+C-X5*~5VPepBIZTgh;eNBd}n#5{Rs;u({yK(Ob zd$&KuZWrFCwkFfcbG4J``Y~$b^fs*v8l~t0e|Zv4(AXF+OE2u|y^q!)&H@B!DJBo5 z_vJTI*Tn^k$D=!Sf-&5i5kX6TWsW_~9#^KaC6zK){fnyI@>7l2f^+}zuKn#9sI=%~ zCUo&kU&tH5o&+dxu3k57Ue98QDg)HxG1q=FQg^bq-Qb2Pi1tdLstjJAhmSlY6XM5Ole)2?W(wn{zW0C)!XxrI(VgFbXDCKI3ncms?-vkO zS;WMT*-fB6?acE^4!{*AX)GSI8$=UzRQ1=sfS&=O7!e+BsqS^Kb4z{ll8Zgh?DvV9 zZ}K}0V{mq^K6JS!oWDq?rL1!%AB_g42xb=Ax}(O0uc7V0qoMIU&&Ym8VpA!ZB4k~l zaqZT5&Pw?>uzh~;)6SY-Nd*J+3fc_mj@AwSZ7elmPB4l3w?Yvhz$bj{ zD>FYqFA<}35V;56i|^lD+=sJtY}OSBGb`@@w8wsu5emZfE64HVPU*)7Ub3dBW}edyFvD=eZV2#&7rB+shZPot9h)ju(z-ilB?x31D2l_5w?pDgFOReoD}Kc&C>rvz>$-kfd28^ zOJIW;0(&$3&|i#&iwTYrm8$f!QN=$8i?iD%q%@4h zdW_p_?(lf{-NV~#w`yPIbr;!`vt_B6{$Pw$Vsy2FN%PV22{6QR)G;1JS`$sM6KUuk zz8<*i{9P)jc=RkK=Yn7dsV=nvX(h^*N`nxI9CTiy&3(%nImzN{kn zA$F%4C*%Tor9`>bwI!tY=!yRUVL-I{zDNzL6sihp$?Jq5YF6r;zO8LG_$E6C zHhZbbI(DC7(^?ujX*#@C!`+(^Rjc7Y9N=Kw8+Rn0O0N#iq8`T$Hj*pODi{JJ1^6o>@|FTXBfQw#B1%PfK z)x4K<48XLxrArJ#nw-r2{^v}y@u?~iE^p#;`M`8tZ>_nhx#ETQQVr|n-@n8wv2`xL zvAR!t?0-AA;mX~t|K6FfBJ}m9^M?q%97RH@Av?*>KiTQd(8eRN7o~ydi|mrLdfK7@ zS^Gyr~aKQf8w4-#q!~Mi5&$b*WFg+sp^q;$?b+& zz}e-tX@J8F+3xnY+0epYYJ?Vt^@}`LeIC37J86S`TAa2X*yp-4MpQ-0Zs^49Y^XI~ zdn0;7!CpZ?~;|LVk3DV=OXCJ+{dk#O5crOkraUl9Ybq8Kk9jpdB=4eD4QQe6> zD9=Xniny>62ZDZ@*`I8(KwOWc9-S^?;i7-wlXJ|OPP%SK(rmQ(8=tKfvbNQ9^nt$g zL$Kb__~DWPVy?am{g;P(Ps4Ad9m3l-H+@qt(Mz$Zlr*(ihR^SS3OC~gO75OQIkXw0 z28++FBAAwkusNhmu6YKC(*dTfV6T0;x)pieMZdzn)9mi`_P|A-VG^QD@DH%OI zS(*v-^)%I$Fo$o7JPh^Fr{2^|W+X)aH_g`E#zuxNzVjb>3fce)CYcnbzm>LFWH1oQ zl->q+PCO-5e(g2uLFkloT(n>Kb{qWPyBU@&bmTy!hM6MnsVJ#TE!spxT0~@IWSSsx zaEyV19uuJ?pSBjgdOE}}ckA9>NgGS;v%WW)e!_S`0oiC8@PZMp57ITD)uB6ORP~G3S|3NI``ZS%fK(QnTI=%_9lP5Yp3Ll7p-wa!WfXSVy7Ir1x|!~UM8l$n5$JhJrgy0eVSSzdHN2xnT+bYQ*s zw`%nyY5tz*{H3mGXu-{9wV9C~^x6X)7&ClQ(*F=3AXWe;_+{Dxd_WKb^c48}fE-l8 zwgZZF%^R517?5Ef0C~mKL9l{raoZf?`NcHRUSZyTij-K@j@OBynmk-cT;P8bOLLUT=APh6TUYcSnE6xNutjQmG4LPp>s;kNR4$!}pQb ztHMYSdw9pHNw^RTQrkwU0(26J5LCA<=pB-z=v5f&@FuYwu8OTsbMcJYQkrDm8*Yuu z>i6f-+XvD48$}uGHm0CT16m(}s&1lZ8Hx#>z8$Qi{u0&8W)H8szJV3v|0-d5F|Jya zKC}M!1c?KMXp-!`Gp64znklm&V|D>PcOC~l=>t)Ae7ZLyv8#x$ZqU^16CenUyL)wW zCi^$bLk)EF(Un$6-0fEjcCORL{@?4d-Gni2Z_qDiozOgg1q|RI-t%w)UWUfbvR7}| zPxs5*cGM&Bdcj{4UhRHq`)q^Znlcwm*VQ`o{DbBgK(lDDhM4n27(h|Gq4LETV5M|* zb)jK&l!BCyaR#|8We;Z)8kv3q7)$BO7hII-DxU}-H{W8P$Rz%J%=1vBzGow#Ubw-b zSXzo0#?jII?fBI0N&XxAkacM#NwNEHBQy-s+7vKmI`FcZG|T<7W3ENe8|JsuKQg>& z$8lt!{9M9i4myiIH&=L9%LNmZgBqj4vsxh&-07G+ic;_2zwgR-LULwEB>n3H#KmzO zq~X$*3&=wvPsYoGLW8S_eu&(a|G};>!L==?#jpPK+U~EAf}T2mxbip?p6noB_5EY< zaG%g^e}0H$BC@ksd1Q6@)XIk{ZMn$mMnAj--Ih_z)hyIX((Q*%wp71=?#7=xZ$Q*)Q=ei>XsQieMiZvX_BW9ISE$ z<^7Wrj)xQC)ER^08z}2=M#3~e?_podVlENG@F(>_Q%*nFVvMF=<`5kmf4#}roK?FZ zS#`gav!<8})TgvZ&lnPr6Z_pzzGmD06$hT`?<|5}VnFf{D&E=9JnPG3pm57M`?>68 zrj0_S>CT`h`l#b&HV@{TI9-srN-FYZ)o3YffcnszfZ8oB-z!dw?p;Y1BXEDTCJU)nOZYMa*?!(hC_Fve@`t_ojj<={Wi^fLWjTpX zF)QS{bVR*$FT`i+aTc0 z^)36VtEaa)NTyjBsI;9pF19^BL*L~#x<`y2(&XP{_PwAuKlnymk@)tSqPb${r2r6- zYzlx#4bB^oJf8~V4A;bsnl4jV?Fb(3nigg2r1+weQBX*8rArHC zkCik|@9_}I*ehKAFNk2}?BIndrs)r{&SWY(xK%h#D1JU8MjH+^Rw5WB1EsTQF0EY{@i`+zXHISdGH_i;J?6giD|E z>#7hMk{pYAxudl>HpEYkzV(Fh1zIYupwWUvYtR@Ui0&c^lB~Jtf&i)0O7gv-w6~rG zA2GjlC0ofLcFakO;vP{<^t5l&%|Txb6|&5A_Q9dDu>UK52(Ci|Q^bk0Bi{FsAiPW| zDJi@VLn@RHACD&UPFrNmHkT@xu>_yqOQD?Jw`tp7Jg7p$sqg73RQ!gT$fF&b^+1=U z`R`a$HI9uxW=K+6(zWq4_)SraP6tI1LB95a#B^t@yN4x8>rYdF?R6qOxTy|(9KFRsZO*_e{m}nAD?KzF+j>l7Fd=DXrmMCiU-g)~?fr`b0O}ypFeTzBb z?w?&uQ(N4B#sy2kNV((JP(MyZ4)=_{+|-=dS~7ZpXOnKLJc;#`Gt-h<%(aiz4Wske zvsUmB<;k!n+-0Zo|9(hu{x8)JFeCw$mWYp^18DpTzAAN3paSk1y!}=dC7Qhcg83` z$9fzs$u?~Em-+(^AXYZv$H-Ce4>AG?YX{)WpseysFxmRBkaVeIOPDpLhf;q44))Wv z;oHv{?wIa^Q<8gEP4h7$r2Ye58-_Q#i<->YJk9rE1*nSCfb9bm11!5-csvkyO0MXI zfh#pX-Nu1&cPJ3i=>FbXt{`V8EC}Xqlgh^xh#@B$H6}s!7l)j=waS_U@6(7@k$!NQ zulBEgv-amz6!`X}?Z{NyW)b9U-BerBqpzJ=^DQ=xZSZ|r?qy($*jR?JS8OX9hV)AH z>-%X+>>LpLwi+S)EuET64AyXc)*Ra)Q|IT2ws;Dj`93H^8KOd1#N=#?p*UJ|+D&;- zb$EM^=YFH4;B%;cGt@V05JhrqvN}PI*K1`$hPV79Q$(v&!bDg;z4diOfRm7})A56k z7-)(T%@C#HQ3Rvvwui-0X>n!jN3PX2^5|aTJMR63nMX;I4Wt(5>~i=HO*&6IgfhU!71S7DY&FagESCF|Jm0OIYRPaE zD>uJ1Y|DCh!?EV_d|SVh

)3yRW9tvU?D~hGKMfL$oUAej_dXWoI2ee+OC87#EEp zqHA>BYr-Wl%N6x)w<5SJVzm`I-kKtB^uiM=hZ~jPyU@YST%oR-ZJ)cy1Zl^9C8q`SLBy1TnU>G;n3`PRGE1#95fHD~U`n5!&I??k3F%M*VEoE$DWAvMKlwBt6JDg0*+_=VE zTL*>%Hu+^}qeHufxQ8Dqb>}6k$zv{NY|R)Wn{*O#hn5V&ldS4X_;A)lAhFHWtHKr} zD~CV#o9%UOR%YrQ&bLzdd5PaVWktm|R5$khH$nRI?-%u-gP&X)Rb@8Rf0+h)vnfCe>l!u}kzP=+y?nmp!b@OI*Wk}%U1=R^)O9LpJ`F;36`4qu@B|eFDbaL7i zmgvB*cTrvQG2Y=)h}rQuVr;5@y)>=_dbGj?ptrHg;T1aCSUNjib%6*=#o^rpJ*lJDDoL>1vm9L(hBBTZSnDDsoGx%d%$$DYmO!2y2C%0X|&AW zrk<>BvVsL8W0zVMuWS84&e%mCWvI%IX$OM=KE~x8;}((kN+;h;TXdT0!ozX}i;w#z z*;zHqQ{!jHK|A!(%(6p}C)yFke0C`{CmZW$|3d}QL;PuqsTW{z(ls^G{zeS)IjAe9 zFn=Y%NKnl8WN4nkkl)nutzQAA*sGYsPj5B9tQBA=g{#kQXI_1N_tp43V*fI>ZBOk} z_4q#+ul)Q@{&zu>>c+X{hR|X9>*IOd^Lx<=A@8X+L96C-G~{3vjarjS?{0RWxBsML zKXh4g=%s4m0oo$HdcrhW|Ms~xfUVT4?bjH~)=a(DT7Yg7Nr{RrdeE4g1is~|6Gp+y zkTf>giTY)O@Y%B-{p5wK2R-Pa0Oay;e)MBlhz;jrrHkbozZ~+gh`#9h`>|Y-o0}TX z&Cl9!i#?c6ULbHvZN0HPY?0q6jDLcKa(}dSv*t~W(l@n|5mPWR{`W*aR1{axVrJTm;^RBMW7sovjv-gKd+D%@OvbiZ^yY>6>)BNUuC@(oW#SrBy0 ze>RYB=?lA*>fO7XLJkXSUcxy7>V^Udi#zGjn-b&ae7^#yu0MCQ7!jNvWbi&nq{{Fn zRluPt5=>DX=Ij`|^KfB)YiBzCF17WVMdLmG;T2&AcnI%|Le z4G1|uFH$Em%*lYcxG+6484RnNz=ML)-i2XO_@Kao0B2Gu^3`_;0|785g~&^ zpTr2*OASl!dK3MQa_04A zKpK_eTG+fi9HtD9h6a-2Bt@kTQeHOT;?Sfh07fD^X0QW4Fw74Gq$m}}@6X;Zp#ywV zH5WDXliV_SqcYN)ZMP%n!cFxqAx^?qNkwm2qtWY4|CZD8mgJ*!u#I#0psXQP%AT#r z@jZU9ME6Thj$&e)N}A)dxxL)fl~-R;B5LTk2*i^85b^hNpz^EnbRE7|wzeLe z#X$0EjsTR!#kz=Joh@1kxuXrOsBCM2pAl0u_7f+GsoKa>VihNqdJ81fi@o%SD=>XT zsu3)3>|AQ_?=B}}yGbILTu*m#yz6QE&ONSkNy_vJVgJ2+UMHbEuO5bsrEa{MtA2GT zbffJeh^y!P=F#f3vr7fD!$JM)GWBwVwIY;TnqIM< z!*xuJe@d*fT5GB|2$Hh)M}PBUm{XC9jaSCYz7B!n^KjEmTXAuJQ!8rydC=T1ZLFoV zm53;uGO5_)8;xrpVbN{GKbs-Nv2}e=NAU~0G@cr`_U}02H2;Wto^7A3Tni>w-&1t) zas+ej{*g?!J_(JKxTH-Ty50FQtOS&pU-9@H0WEB>4e3>V=8NdHaW2;0TN%nZg~>k{ zxz=xd1jzvdR6Fqp5$uN&GAR6#_jgwPO8m79WYLVp0vFd$BZ(S&qj?8{(!e{f37rD6 zP?<7Z$9brN4>!r}kMy%OL#(*Rw^CNsyJY^M`~pgN;)}qScUQSY)cLWsV69|4MdO*K z1Pj;j&z0%Z+Q$a^YKnGMY||(mKZ8r{Ke$~tPKJ-0ET^mO6pkx6WrHTpBD6mXeousW z?dN&^p^tff>sgY+n;JnePR=CwS@4R^$NWSMQGgO8dMcQP`W~Ds!lzDY#4x3==QDBZfc(l&j-`(}ugtJqWJo8xS3 zj4M^a=dB*TpYN0FQyC9EYy`VVfP28<70pr)!YcZOZtcHn&dRgTMSjAJSZie`w>NP& zwt8!En+KhWbEY4Xo=9piACyQsPQSxJ#G*~uqt1Kqua#eMc%*|cBV zYw?#I$m)GG`Aw)E;R_YLJMS?l60^^PLx=wR$@-|-#yic(0a{d$=UK8 z$Bmqe;LKGroG9+u-HP-|)06 zkt?0*y+{dL6i6Rmkdq`}&eS(e|RnB+cSHQm}l-R35sd;X=sq~c$t%=~%k6B~%)Lsfq8YbNzX z8^~n^*R&{_nhfjpTg>qCe)EkG`YE0XNHz;fYoL0PT;=2kTobZP7%nOnvgO`~ zB5au~M)dy@O0`d->e!2mM{iS|>R0}C#UlRwLN*dbhhqO!KRkhtx@;LH^(7e&* zIIfIm{1NX*RUh-?D0{XdeUD6*p`_+kR6YlNTX+b|gL`YUhm!32jqm3Tk#lGn+Vw^+ z6T{CqJ3j{IEOr*|`+PWOb9jjt6h25qMeMz6&g%v~yh~9<3Y+id^CXB+sTJ{edC8>$ z3oP~4`2sXMPb?GZm_!$SfJrz_(hzmJ5>Rp7Jo*8Mt*$|} zIrO+xXU^4cc!8*r>8; zJ^f>dBrQ5Q@h2lYu>Ezwj!C_RQfN-+p1KxMf|laDf*#=YbLEll4Fc8M7TjmynimWg z#=j2Uk|ZHFrD>bkAwF~mRSOxclS!{yCY@9JFwBIHhI%^+Q#tkgT#^~*@2Bc^H}P%Y zA47`eenu7z-4TPd2u;O&+^lxg`AMd_kW!2tnC%!S8k=h3o9vkTF2Mel&iD|}oIuvs zhRyYDP)tLkuozt@5g=t>73jenTf#(Wd8H5W@+x&_-{Pe z>uEzur+#YOsHp$Ww&)!TY>LC(^3Z#`*^oW!qR)o6Tbd!^&*2H>EAubS<(Vp0INr9R zh)f0&v48e#+4BvC)mD<@h7b-mh{`qQ0N7F$5|O zV0Xm>jYirWcO;W!|EWQg)+G4@am48e>kc^Ui1FNr(UBD>NQPK!G?n4LjI(%=P~}&P zkoO}wurLHLLk(L$T#6!dGZOc}%Z#I{W3I5#IaGe_z?STk)_>QYWt5afqu;qz0O|di zw9OHGZj4LSPXhmx?&|FLMQ4~jEe{S^8aPL1ND?s1R zR2*$Fq8r1+zmSR&dchwn?UrY%uwxL)z$FjgaWudDogMtriu64`f^_F3uktvmDy9T? z@EZRsh-QJoDe8cF9E#8m=mtBCT%;?%1wdf_>G>jz*KD z@D%kF7ipmqZ5V5tpdh2;Aq}?m9riP^5Q9E;P<7heGPQcQ6v|4M`)2=t_i%FW-FcSe zp<{<_MyU$!Tm67vkd%pPR~xL(amdD%y2X!BT*1n(MoYKE3i&!m-E-;p7Rj&!N_#aP$L z(KV2}$F7U(7IPF!`a&h1#1nF<$APu7LnvAhGvtHWUlBrN)V9Q>SQ})% z%}*lHeEAt6W{NNabzna$mXgZiNDWWq=vdfE&b=EZJEiswWEM0v8gCz5D3tCMx3M@fHs=il~6K z+Z!=S4W9gCoACgWste2ZilP~PcO3q#3o-+&Sdd>{07t3Z6h;paYu;2T!F1^j-j|yH z#|3!(Lju?}ungryAEk;Hkq)&Mhltl!k@hlMkVoye8E1Wp^Rmq=q*r0#m6sxFmXA*Q z^?gtR>Yjd6mOYC~J+K{{pZe(MKP0p7J}_SuQJZ%zd-LvekM#jN_RK&^b;J?8e8;y{ z=!E;zVI~p%^Z0)6TNI?>F*Z?UPeB$`a6cx8AKt+G=p71N+v#tQxrTZoe%AfzM9|3M%z7^QOpjeR2n3#sM3Lt$%>RiU` zdc$~TuTwhefR99J=nzlCDb47K7fOP!|E0jz%ZJURjdUKKzGH9CtHbGVgO z7H8fE+>!9r^uH&n!Nf})FA=X95pGQCs6>-+e%M9Y@t{(#x_M&_cRVVqSou7^$Z&m9 zrmdzhTuZekw4l_E(GQFCrhn5R8kR3ucY4~pyOu3SlaGlIBA5_$%b{J*OQ3cU(|pNiT&mi_Z23Il0+C_B8RuSh0^8#|S=?P) zk?)IB+TZtQyOV4qnN(y#zV=Zcft&_a9AGw}rAedCMW_noMBr8;O{9qEG6zkM%bf`X z;9VHZdIajnM5emAZ3uC#Gu!(5Sb_?8~#pJydNu zAs1l(8`2q0i~b!KZz3B+rVb4xUDMkTt(^2eZ$p-<4X0 zE6gaW6u;OXgcy-*w$15@-IM7G{v;7pGSj_BUa+r`Xw7Gg{4W=)MgEUce_jwl#^0H3hTWu7-nkp4cI>0#2@Xil_51iKg3z=)NW5(yI;xPet*-a?4Aj} zTY08C(nzE-<-ck@RxNHkE}+NtU;n1QB-!r)Ugyd-e`m(Fyw?7xvkq!UAu2q z&N=S6&3(|MqZe_pM0ldXTI<_mS;|P(awhl}xkmSE#>wMj`IvAr^J8-^9a>!LUzXgg z-@+HxW~9W*3e)GR+~yxKe<6ROc%jpmpeVF%bHO-*Z7PX+?t=a{X-GUV{E$*7QHq7I zq=A(Uin^t~5IVyj(Qh4w?tEzH>UXqz zCAb^{X^GW?_tlr9zg!BeH)t zmU_Nd#jO+CHm8tZShzYdLRf?4_ ztFCN4Ni>sLctK zKV&&5^05t7{XAL-#jiW=E+W#``*%+^{7VIM_vxUX{}244vL2$@jLQw4zEQsw@E_uq z3XGQxUiC-)R(IU<$F5m?-Zd~is%7`AxIZ7*&PZ^PmmQmHS+bN_=}MM{07{XRs+sy# zlmrJ0dT*pbwfb&xF+l%9x@+~-Ti`*Cv%1P2%|Tn^7uMVFwYz58nm2?gon36L`e^s6 ztA$pu#56N+eX()bLrs3OBoL$??4H>R)3>1NkKEDT-1=2|jj0lCjcd~mnn(Qb%8h)4 zSU1jZQh-@09qMCiMEfvhqDPeu7pi^ZR$TRdd;W{y6#nPT?Q} zK{(##qhjW2@J=+y%y`H?A}Zv34=4~0OznKQt#=NC1RKrQo5}U{odpNUPEWVfrIitg zUf#HiEoclPm)1|Ul9f>G-tK`rUlmVmLPhGI)=&ZpTvhSUoLHH>VOE!j@7rrg4SoUJ z2A)hnZ|9!fPVhMEz_!J&hFT(PDWyhT;;T#B^|NCVhYiN<+0waLwB%a>%AlUHjSeB; zQ2Di(ag*A4!u2@nwMi}w3hDstc9^m?p9?eieeOlHii}Hai~`F;oDWnKdcAoXYHzzI zNNH@{Wmqm6W1MrnlX}HV%od>t*CE3^&o0MtGdiZ=!`<3Djuao?}A%AGtcZuTO{rdgnlX<_ikK2lxkALTd>U~YG z3s>|ClK6nPZxzeOiMceW8bO|^4&k`vlyi1FAv*0K5a@9aH_6ESuG0H1SRZQsX19b^ zQ06ij*44h_W@Dll=fynFN6^V8N+IW}9q&7Wi}T!*ND{ zHM}0n9ix47mWAcv^jpnGlmq2n0qZ(q`>}=alKPz$A#?5P9GF;dykfym0qnq{k=sZ? z#h>-F=e`qm8^N1J)KEqiu| z=Y$&`@KsRZLD&a^JWydRNO&_8RCWmTO!-zjHgZVfmKa%Rn3*=Qn-{8JBU`fuGO}<~ zRECd+os(OJSWyH}J#nbgX7`R|A zX z#)J85hB;iU2_99$_>OuI^k75VOFaB`kPK)l(9HZ~JUFsmsg@(6<{PuH8JKW9@2q{V zgG_m(6D_5;pM8cO=klkt_*KDystvnXzGOOpu)*G@OA=oR7=v_mzZ5 zz;ak5f;pD5!FG>%u;6)6wK>nHb|t*M^qsvY!FVt&KmIo@UG)`8&iZbsvt@p5G(b!! zpdV~W$XCQ8RAmK>BLF1=7;^yjY}YzFqByXy%rP&lM*wA%A99^lEFhxsK}>)K0e-eE zZz`V&TTc~BVR0nj-~Bg(cu3?td!IFv{F)<2c55&baZ3AhtkL88iPo+hRvQfF2WfG~ zFusvFvQl-DolAMJ89KV^FN&cS75eA>IP3Wlo?Te1bYwV9K>2~p#>>81VtC_QINy3( zMreckghb2fn(iJFUlx)cgpE06!Ofs=ZrQfuUyKPcDrMPh4cgx;n#QX){a3TNsVhOy zjfep-VYdTX#=7%#gd){DNbjXx^@l?zQlM&1=8dUyK|>fctAH5#H-|Yao8sc1dNe_@`>A4K`)P7z27LU-!W*be%FC0mATxD4|Nb#X(Sg2 zb!6st-?&v#5#4Owi2K+-{VT$ZLmW1aQr*mjX1Smk(B5eww6^{fIQ92LDo70xcB(#Q zkES?xzTdHu;jx0Ta_&9NmnnKM>#PsV(}IFDyz}3z{4u}q%K`V1lQFlCTSB2_hk#SG z=Gj(QvQpRQMgvtDb^BFjn;*U5qnXLLHUp)WRq$i549g`^_obYi% z=sduM7=%mR3=-YW&byA?Qu~YlNEt{&gS)?lNE`94g{_$ldwT;;Hsc#w0@AGRswU*DUb)RT_yCT1Y6N&o^u)FAfX`RHOR8ZQ9} zZ};*?y4k2BIasEE)jnJ&9h0l^t^g^>`#T&9nO@XmVwi@$yrZcD>BD9;+KM$}gYYA^ zNa}KIIby*^`8kqy7hxRwvhnL12{#n%CWldXGKu#Z3j>E9>q-w#a(oZ9KyO~=CKo3O zg=CV>g@mdH-&k#E|N7vZJcv!k_?d5O!A)*bOc))LKFWaCa+l33E2Wg0mnkfe-3+~F zxtU^~YS?3)cBQjVDXZDjR7-=WJ+`ZGXZgO)B=duB&MH&HAozZV&n9Up<&IMm*az`088zF5&KZbgNM z`UV_;!mM8gGBpTsx_@UM)}eorUkDf4mb}q3`rS~QVfWh;0RdtC*DmHUf6sT6jb!W*SbwTvQTGn!>?qChGEEdqdb4T$Gi2yL`O z>NF4wiD=T<_DGgkPI|d2k&?S(MIU#i-UNf|vqO#GBx0o3$-ZX)>9u~(zefG95fMV& z{c9|37vn#V(W$reAx}qFf@vMoB{)*5yP8$Y6cgetWwRnxV^)6YLII**!q;*v-}n47 zL_|R{x{5YlN9%C7ff1!m?;c^3MSuGiVmU*`_ki8qKrzo^yTW8kxKAo&1l<&8R-yc|M0Z@dM~$^z*3|O9%R<+?mPz^zY@;nMeCWIiw+v* zLLzVeu7%!osY*Dv=dDN0`}r`ol2Bdso|~Ac%2-lv3)d5^5!j0!WbmyZ>zHgbXJ0ox zi;6ZNdB=g)Z0y+Yu#lcB*0wzROXDPbeMe3zI?vAe=fsR2u$ViB@W0X1*vs(RVZ2N< zi+Xpu*!W@k9!3$d{%tb030&%Kgfl@+F~-DZHUzEFZ^!#HHYSVX=cOlY$8XaT;gnSy zrij>@W8NwJH_)<@htL9nU;Da|C83mKNc#>TriyTZ6kwKxXJ%KH9eU`IC98esoc$8I z`Wj(?#~~o9UuTMSGGyuD3Rxv^d;IY?bRxHHfLca%&)DN{rC*N~?{j!*4)!My0Zez$ zqY?yDxeu4v_?{hi&qcjqODiU&WfUEimgm#tWv_|OgGr8CEnv#y!GI?Zq!-UeTy zashg7ZG!v6%#ELgizOCU#Kc0T8{TfsB%H1t@QgnEF2qFI&RNds?TI?F*cdR53eO@A zE3$6N)^dDP4xq3INZ+udNSOwaBY!;3=D``kA5)}1+lUJ09*9L3LUtcUy`T87ya;@gO1cV`h-I68qm0_@uy%SzFx|GxCwz~yMh{YXmY~R; z?#chp*AFdFtiyS?>V>6?;;w;ux1PDnmR}z0#@&+A`<||6Y4gn^JlB*|MI^pY?j{9! z>-XzAuL=PvRwpu+Pb1S=;f)DMJ*Z_@HPEWCqady z*jKx5#cz8sXFT8`j~`!&`H2O8A|BN$*}NktC^MVm$9Y!Lb|p9n$^9`qRLQ;t=ZC$} zB^(`)6)wrG&>V{KYHQ-CMW8}g=!$FJSr>Q}N{#Z+5$*UeSWG=6-_eHfMI2{f+U&m*0v1T{$D2SJV<$7z15LJ@vdx z>E>(CAhL7XR}dnb)71a1r{m3r$b&dZM-qbiIg&Bw4eoU#xLqIN<#Sh&q(9Qk3zy_O z((ttntED zeoE8?fizh-<-up5 zM|15lw?bzq0yM{&nx1?YlRv4@JHiJfJbsm(QK$k%V|dKYsOp(Xaxyvl{2njyWALRMYv zs4+xHinew^1b7-`$o*mpELpCl{)2VyLs@+UI4KNc75WMF``DcB&kvX29;8S+40GXp zIJrqghfcc5tYfMt;*1189gKuYoVmIRRF#`|Bg3y{tL_0J@%^4lHW4U<)5-oGjWj1l z{*UX~8>vv0-Z4C|qb;$KEJl2Ka@-AAGxASq@DAI*Zg1ujsym35e!i0ZeQzBmK|MPC zsFS$uwcq6djPexdCu?FaBjl>ze9M^RY!GS2|7J<3+(Tr+2uDYYH$9_6`ofT_p+JZ$KI-^Mf=dHGWuvTD#b4BR0>% z)XK+YbJsB*(a(87>Sp_VmjF#sN)>Pw#G%5QB|2X~pp1gSW&)!JeZv?dtqa4=UwIsh zXQ^^G#al*E$B{}3s9Bx}m_+=I+qY|AWk+J`A&Oz7)|wzXW5!R>&33< z+_q>_NThYrH*f0(pyU^!s;t+q&MIK!{@wJIlPYJK`}#KqUPP<}csIKPE(o$2=VrF@KreW$}O90Vm z6Xt*D^z^Vjg z-0B35?=&2asV)%FAJ}WwStupViLnPCs0IVf*61B^C_jXqm5y=i(MCUs)Cq-rMS@T| zdQ<#c`@NiOoE)ifhvJLIVs>p>O3mXWt04&yX2MyQ^+d&JfV7dMhPGp1%Sb)Zijese zqF5{KrYgPjV=UhAQWTmtAH}JAUL{N%?jy`lNPh)M=e~3JtC&CsFl>&=Ex&fEd0XC9 z)n(M*JiFZZiDrOq3vk={{Xc5lBK(awRB20EZd9=R?NMM9|K(kajhG!UCFspBE*{u+ z0(7B_7YF!AA6=|r$g&9lFkZjDr$&{~Se>2>pV?$#jeemo&+huJfFJJ6!VGm4>Tb%x zy!NBVcZMx&G@ zP$jY|)fYoS$`cKJdv{-l<*p6cVK)}}RZ-Le}*v%Q`l-+6@^05Z4n zVTT)+!Ydl{oRJT-i;EzwU*znnBG)si$@<(|q0qgH=>5Xm#e|(W#9ZfQfGp1Rqxs)} z5F(T-1WTo<@nh8=9S(@IglUo4AEpS*;uLFA1CP!l42aTVVn1j#gKotLij$!2kPs!z zPT`d)qf7!lecO-4n9BsR%4n>O(jK*k;P&Q-k}KiK^(T+>CQFdE53}@zCv8MIcsGnr z)}i{SXweLx6G145UG)I9`SW)74ahFZiqkl!EES+j2`iz7 z?xX$FSw%OpZl9;`$C3{orR;oKCl|WL9!9*ML#nmmU1BJ$G|`x^DSHM737R&#drx8c zzzw&8CG~kSmN60@mcM>^TVeR)JoPEYtUjHH^hAUY6MhDXk<|2l4rQIQ{ zcd9IR!o*>!bmSyq;*12Zb)Mf(a)S~NIPO7~1436U7P#s#kTViz}2=&f(u59V?7{ZpJ4sk)?U%L{t?k(*P z_h=RRqJmk5rO-(h@yg>BfL=(GBRyHYod}(jPhQrMaJG@A3s|#gz1p)qCNg`jvEpf; zWj>m#COSP@idoK9yA(nGgyb&zS9{zh(QF%I&AE~MgN9x6hvsa?+aj_0>+*12`fPc1 z0ulZ^oDPR@*Btd!gTnb5K*_4qW_cD`{5KprEZLzNPZHJJXIoQ=RFFiImT%QWDqA;% z!ykJY4LKd-ZzD|$o5h#!dja!~^RPAeF&}FaLfHZ}oWq5^=%}(?ZW>fvYQP(ZkpDv$ z$iQ05AH)15%hG8h6SC`3haS@h>Aaq3<_P|`9vpa}zVI)1+*dt+>cOD=?00cJ1fom@ z8f@HScNeekEQ@l7Fg#tMPt5BLW`0ckamvb?hB*0qjupX8f8!g{!Q=~I1yf;y(&jjn&j4xS^)wYu&>0SQ0(xJ z5|(vcq^*DE^@x{pK*E9J1v2;*W^xPo&JAZfc~EfAgew2GHgvu zN{S9=sU7P+h`Zj{X2bLZO%Jcu_c3Xb5&jZwHZ{eVJDrSNK#bg$k;r-sfwcU+lY?|) zY2h3Re0gp*CewVy^&)Cy7aMD%ad;6}iDh_h|8uMdt1p`o5Uzmt;cTcx>0E7+Tl$K9 zQO($nCGx89)jLQxEs?K?VRz_HEo)wx|7=&q#n_48@sk6geb7r(o@qfZS%)UGJyuyY zKg41pi{3b?62H?{Ot`ZE&X8|mGp4oF8`C{B4_cNx4dy2lk<=kmn#w!4u&249OCNQK zSZ+qWji^mLLvm$HCZAW$_>cJu(UQA^I`k(maMmZ+4M5gpJI!4FW;$gdd1ju} zm_BBnwBeI?^@oN$ijs7A=V|R0;XBm}P)A=kqA(VUdM)jt`7EGDteqLQL{ub7#q2&C z_Ve<=q3S+7XBSDC59_ZTzhaBo+HHJnpkInAkyJmA*}95c)v_T?m#=ZjrGQj;ZSGXz zA`h}xS~CV~NTx(y*W1n7+b%bfIa_F)G)SR>H@(&E)5J}uRi7SeqTlRAXpXA8-QtLH z=swExJRQ)@@u>Y}NApFo!?)AwV>*xge+7j^vqq847R@8oe2RnJfV@p}M>a~ea0khs zM44C$l#_Rbl2SD_hT4;oMg&rg7Y$_DBoEYrI8^_p`QR&cH4AkBe%$by+w6~5qC``s zUSK!EJ}kDs_wX$5FKTMtse@0Za?6dJ;%T*%1#hZd%3rT_QvZrGmp`#RVsOboAQby; zH8hh|0H2=*8^or%#gjJwjpgw7CMy_LebsAW&DTEw_4HJ9!Pvya+crbE0UJ{By3$22 zZW#NAxatQPTTKM1Myla--D@g{6?ogOP zs#${8T&;Wi=Dp9(kJ&6OqcweOiT8eZ>aV2N>^s>NRC6W)_4;t68E<~5tP^%w-qG*9 z8w3sd@EWO`9Y*L#8=}BpiAG+lQ^mq8>RU*{ZR7OSm{@8?8vl5;zFU=2T^%%EeEU?K zclN;q&K~F5)9=8L8FX}z_iu!?c??zQX-L3JZ4$)`C_eU{;^K(Y5|&}ct~PX=(^XjE zw&*TedF{n$c$^jOT6>jiLCto3)wu+4%gYQtUi$%40XkXG?DSirERc~Nr=wSH=Tewe z&#wGh?Zj{%U+y~b0^O6Xf~rYOCV5+TJ=^Sl#pqHyuk*r1iYJi!{#-U1Xy9)|TOBy= zy6)yWe{U;7$i7lZZA)Yco9SEq-P}OUt1oICrJYq2`rB%#<5CX&6d!NX%id{_1+q3@ z>TUGFbKP6$TX(E4O2vA*9Z&f*Mxm~0hD^rI;!y1I(1`&R)4>uj5CJUAEvLq8)L(Bk z7=gUu@BlzQpqs5aP3@Ip3k9O=8v^tZJ=R$V)k(`mS^y%=NKcQ9os2E$^~g9T`4GDg zhM({Mackkb`EoE;-v3-}(3%Se4I{(1#R1x8aob1O zSR?4Oxtj2MV+U)of<7gbSNbng37Iy>_f8z%>&^SryDSpq56k!k4dy|CeZnu=8|`V4 z6GnKxyvUzvCD;aT(18C7SV%y03w{H=EU13?wTrHHfUZrQm%`xvyWdJ5@BEB-%^R2# z1pKzcFhHXr(!>cuDO@19CdaN%s~y)?*cvtGNgI`MkherO7~@RtzNu`oVQM2TY+=Zf zw5w^Fv-J`O?vTT>3GX28%wcgh7d2Vox#EC{5iXCQ@1ZH1xE#wFyYkmv7Ttce3ZGlb z*t{bSaWpU|{EfpmSS+=Ezp>fh-8g&4=PJu!npcTt>qSWh-K&Oo1~S(+G9`%OXCceL zejM~M1NX^o;j3=;HGcakEFPe%PaOv0GVYq4krK+(;l46Eg@Q>CPN9aUU&GZMnx@Cv zDk0kBD3P{umi={Km-BZ{wPO(ERacvW1&+6>!o19#glSD>w5hI7PsXA~{7ffyHngAv7{&5@ zmL$q9hobYqG0#-+$E>i6tXBGUcj~+A3gLkHUjax<#6=7!_R!_?nX**0JF?xgiro%s z+a=w`Rjb-L=h=@;5)!He0P{kn#=;ft=((8t6(WtU)GRPibZPgI49-#qXIO5}M?}bj z1eUKqtN3p%an40QtJ$&9=N%~`q(zIk8)Gu?a5;KqCL^Zp^QzxhquN*_H?f& zXir)BuBmDK*I3opFA-di+mlN@aJBP%rH)p6<_;c4&_)-$m`E&<%Y(y#NVVWAk!ZX4 zDY>9YUg}wHtn5A8Joy6iYVH_lno@+~{}m`fCl4WsYDtvqmwxT5uFD^A?DZerH0M z`SPQz!ve)5Fb{PbJFQW#)}bswD!?~UPc++d68O);F1WL4b}CCUyon!G%+(wBAG>j{ zIjn&eVxT#h{O4@X^wF%Y@HA{`kqb?Db)omZj$i#1Zt+qw>XxLk=qh(}wkCcWc|X`W zk_mK$#ay%XO2a#Ib3y8pHBE>N)VcPRDMQ;AGtz$kjfWq+C**2pDCh~Amkh*O8)$gZ zsD+mK?Wu!Vu{d?}b|4UjGqWS#0|K#XuY#F>e&y5_6Jum!>%K-t(9!m`uJgyl?h^d) z-(Vkuq`;|>+y$jC6R6Dk3sf9-oEl+Q#{PZic5$fGpe+g@)M#i}!ZaraR!{iBNCUZz z@ajZPa!LLr`&4JQOOLrCO5XmkJ$e1tUl=^8kh4S)AAEtf=(*fKcQexm!{W5m5T_IZ zmv9=}(1(+(ej^^H1aVZWMpjp#@DhiD7Oe+_X>P;x|H~mYG(d>2Kl||@jhi&l?7!~i z#ny^J)nkA36U_im5)%uH`iC6YxjSz))QbrI6S)m-8^P!SXd##$2Kt^#=U}Ca{5J)~ z^IKQ&2faU-BUy%0AN<-&`c86^^@YO67*E{UUGVs@pRsuO=6-)ip)DN+jU*kNct-VcCqruIkrUw|- zz&`;MabZTYfYi1#MX3PpXR+f~x5mD)v9Si4m5hKqMs&u=-&F22GB<)aA`~sC)VbTe z`Jl)S8mt7O2u>__z@K&hp%i9Hs{3Qob4TOx4ez{Zvzckk zU70Zf3be!ORB>Ivs5`@dQ4odr>gAiXc>5?)3Dp19#jG2hCmF3H9DY}&vCR@Q!H&?> zL^8{_=!%pS?HFQKI-6AprY}q;hxG<^A(Kmj9z@40-p>x*3nAeSkOS#h&Vql+XHx#0yhSbOai~YC9-OL zUX{7=5l3=xw}G03O!@I1;NXLS13nSo`rb+yhkVN}tkPcxsCw#fY;iZx?SoQ)@MzM* zul*)$Rf5aY>Nn-Z5xH)AV_ECOfnsZR^+c*{_L@h0-efT|+!TC;gs=@TlaRgW0*r)%pBuubq!9Wx$ z1Z6X#27Of?UsR9Q-CyFyTU5|j{hqK=;P$RT#S$<%0d>m>KG=fM7&6feZ`7l#Xea)pUA_OayG3xiLC_4Oi^MRlD(8_!}mIZ(xN)wX#g znE?)t>&55#qTP`y7MZ4&)QC6y$Ecr}fC`Kc2I=O>{BO`w`4uN`zrd_u_?ldlYdP zM{(j9J0_r*v;=x{la>~f{4Qfc3>#Gp&xs~TyP_gnO&U($K$dzeOU$k%cOLS{RwU`yXsu#}u{p1=YYk^DxRJZj`9n4-#uWy!epjBrYufi`*7xvXWmx!RBfI&szS zJ_Suc=BC3?s6&`RvJ~|^+YaY`x)_;jp!;VIemWy$GK;vIJ(3*G7Vh93gKO5DZ7p7$ zbT%GF`9U{M{j3@AMsq@lrP7V64&z-b{=@t5UN8WG6$@>D?1~&aRDx{DAOyeRH8`5t z8a#bS3GC5F9Gual5cy^^DK!uO?*Bz!SAn|woSN&ooXks=Q;B#$Az#V(=PFE}FP_@h zu5q4gjqlldcm+O7@yALs68w(atg#Wq2+bE~dDy+Gl_?6c4mjxx<` zLb*O!<+aY_RwT-E79#IGA*^5bT;Tw8D4Aav`tWj!B(V1_S-TFdUS#H2zxv|xg26?* z3Mx89QFGRefH&HpOwz*#*ilOzq&_s&wX}jl{KFUl^7(7no7RUEij$*_6w{4!MBN%) zbPsYOM+btCmw#gsOsbJ4tF}>5;q4#${&`#rSZsv5Kj4L9Q}vBJQ2+)IztuTSE(xi0 zI)2jc^C(e~FM*%XXZVZ#5avy`{+wj`KaaGH~vGZGv zQPaUjeQkos7mv}|g)O)~;l{S!v}DaGd1+&MNfcedDEE~#p2RS-ti|2_7p=~YR-@4z z3|4?E8kYvk7ocvgHk@^C&{&EpsBw9!WRG-Nq}t`wk!YOkle@eRhi5z}1 zoTJV}D7xcyo@bZy_OG?L{bZM4qS^Tq23yCgB)tT_dJ)(C>@ce9-WMh3dH&Co*jO{W zcDp#$j5j$|)e|3kl zy$#vLJ|ca^ZI?0Mj*)4o)wcT6p&g&8>Y)(U6A^rPHiRd^CC8!t2i-$m zS;e7m4EczA@ltmw%j(zl{o^)6M-6dVlwxEyrK>j<1e$FrOb#>`m+pMq9;#zEuZ7Uq z?#(x86%cKB`8O$;lwS@db14bK+2Ush{&y@AJs)e@F08CpnAX7lUv+Q&71j5?56{rj zDGdUGl!!1i(%m44G)TwL4FXDozzZn>5os8tyHQF}N@D0vhwkRPd4JaPM?AA;t@-7g zIeYK3_ucn(O~UY57OLogtg8#kuwLqN5q}3Q;3Hb@ayak~M~ie0g<_uMqWlvHbcN{{ zD4=QT=xOZ-!tG7FdhEUD0-^VBLtm%B@ynBp$;XiUTJ*fFr;{!zgSc7WBQ1#EQ}j+| zZ{0^k7h{(hYi1H3V@V{zX|smE(=&L39k+ZrZcH48gwnYN&_h5`#I=i+U=Vdy=<87Y zg(uqF?Y-(hGTTMY`DQSeeoB7Nh|8p(>UgY4S4B+_Ss7^H!O4p?N*%bie%E_cA=Jw- z0UJndZc_cbAD3o5#Vot;(pH0(`L|B-oubAMXaq|!@a6z65WspJt$i>eE{DT$$aiuP znCB4SQ5YX<7K}ecKdE;S1icR0+g#_q`Xso+U@!a|H;5B7XgXO+cVhC>x}Z1 z_3Zg*Nr_V{+0zA10rv=t)f;I%^%KgY>(tM*s&#*r1!Z3=3UND5_!TnVrc6+s^E>$@B2eij31Ac_lovnVf<2clNpNCj7<3(rpQE>&&z!TOD_&E;iN%RZ6s$?bFWz<+bamg;%vovm#)i{~s4R~S{Z>65OKbe1=K?m#o&DaVuKlY08Tl4y0A z-P-b@4K6DC7VmLBtItbu!n^eLPtRLgL|B9MTM!8OgxHykzWSZnXd%#^qVj-AZr3qT z!ff}Xt?DAcY{pP%mOTw6n zCb9-h8Hv1l_iuG^xBS7(XMAT(r#_-@>Wwf z#CMUR_I|5~n936SY5r8}GW5zwWZkiV^0{kz1%2AZbd|Qv{C(E>KXD)7 zyn9$o^(^qyQ?yT9?_WQ9zfa(1wRqC-yP>`)v2eu1?0izO(&8vJro3buH4(7e_rd<9 z+i>oMb<2PuRZ5c1`h>&!p2Wg`)%zQ9UBL{D(-Jw0^{U|mI$^{ho*<9(@HuUfhJl2G z1`Dao>W?B?DG=(_i(hQ|PR%afJ9^SUPwR@}RZKkUx!l^x=n&6&C~^Lwm)i{I>e93I zbHhXaZ^ex=*&j3`ds)66-`ynWU!PY$r)I>hx6m|$6e;TGv~HIo_{8{<8b4W zD^TXxJ86z^FO8{;p2xT|f*^fOeo7VMNDlrhvi@oJ%~Y&?{fq07<1zMAd7AI^nrV;kP`!?U9Tp~XykacUFx$ibq$)|Sd-$%R?U$XNf9f0 zCP*&i=n#t@za}X9c?Q*;8`dZgf?L699fck?1XFX=Kotd{kI3It_$g*El=3R(C}H}1jHKs7ZWCIPjriAosv z3{WmEijIzs<rqYGiHzg8xxGR- zS+=u{{={K&K5C9oDNapP50lC9A&u^~)ahSoEw|<_n`?Y9#kc!SeZoF_AV({#GyMre zWY5)3=*(^#qh?2CYwnWy;kg?{%Z`JdLxz~W?ScQ$zR%ZSw~3%8$(j1BmYwUZ3zdGe zne-w0C6pNb9>cE^c9ju!yCwzbQ5pxNCodx_oqYE-|7G4s+YAx5 z-sHFAqAPWy-vMfco`_)2Z-3b|sUj=PE;(9HCuSOtzANr$Q*d#Sib{GOUiAlMj{gA? zqWSMNZ#9oKK}m;YJNopK#p8of_h26*juL?IKJ13{K82&kd|v9XCH;z%Nu5sC<@`y= z27;qsN`a%cS=AVH;@%y3@jA_233Z^ zsri{{jL(EiH+sS?UV`Km+Bd$PiM#!+qQy;FLhj%2CdAvbiYuEPEG}d!lc1{)rXGdR z2EBHAheFk!lBoc7th(|=UdCHR-C`iF3M=Sl=EdqGol^eo7v6jc0bh?m7oDVIrQq;RyWwkFG8 z2kvu?6#w}oh?!>QDIsyQRC6$P^lUku(yX^y-;8nOW9S3=o%7?5L`yHQ8MRJDOW($Q z7DG(=)M_xU7dBP!2$RP$!<#x<;(qJtJ)QP4!MmJEUKQ5h32A=9v({ki9%_5bUM$u; z>4W|dB3=up7k$}ICEfgQ}WwaDik3uY%nJvr5I+Cqas@=8#*c<1W#U+`IC zSrF5{G90a3uuw|&t$3=g+t8Si%Ru1xL&3xWn>*y*nHhQ~)p5UN{zr=%vEIais@zB! z;e!{EE8S;w@t$me3!*jL*39r-ic4FZkC2m0VRvGp431hlFN4Qf#=EZ51#CsS*G(*Z zrEjfjI{1IvZd$O*;M@BgHwF9w)i2Nf+`LFvTSt3!d-3l?N;^51M25qfC+yUOD5GMG ztwhq3>LoWXv;D$AE9J@P^Nl?l3e3w9%jM|RAkRSkRWnb2j z|8`2WV*5<-L>|X22`QkfGafzwXhMsv4LY#)4Zx-;K^RssME%nBLmuITXXi#TFP^P@ zl|S+*i*=e&sC^Ov&k{>iD*VchroP0>=2^=mj`gx-w>QaQ{TBbYtY(g}J2#cEm5$!` z=HPw`@T=V~5d4?FmOkLp|qG zOT}MWMDRB0PfFJ|a(>tEyx+syB=`%svM6qDPfzU|ncE2^8|r_|pN#UFmL%+JP@I@R zdR{tu<#R^rz|@Tr=Gpf2a`y0oMX0R_GY3f8?UA{Lc3*em?NVvhB>iS}uUA7XhiPVS z0tqj!g*_6cd@na^aNn~Hw`h#sKq#Z-{xL6pPzW0K%>1(vFtg2YGUcUy3n|a23;u4M zu2yKCW!I*bvyt7oiW}LL_vOW8EqpQVN1vQo*T6)o@i0b+GJYnklAyW#ZW_hRS;h%e zjFjFu3O;koj`*r@*3+@qjBt-i_EWK4Zan>7A*WaLu#g8E7sNKJN&;3|f7MjB+G3OE zyvbJLLSvnuefqn*)Jx@R zb2Jsk3lZZ4i7WAXZw0sck|)X6J`c>>Oj@~PMmJ%^Ox0b~+6RH+P%qK*hGs&Nd2xYNJpc4eFc%L){Pvq6=g zc;9jlnT~S$|7roK15$TR*9S5T>SuEMOAF>YE*vj`V*XF@am^Gr06ukR(a6zaZ_pUs z@p+AqS7-TkHxI16bbl+kIhw9p$gWu+DH~R-5a!yRRK>c@Wf!mnKmhwIJ1z*LGbjFx z^2xs2UFxv>^{cN-?eRgUrRMT^5BAcjV&vS1X?7tf2%mXJFjH^oXiKgh5x@H>`ikK# zzGmw_>8sWg?_U+cf+pA3FE~1pmj94?5E>f-?eUHufK<&BdY*ywf)r%J(z>qVUmK^E z90N;+|2(DGAz75QaGE3Ly;A-e_ZBD&vx8-zY&Xl-)CzO}!e3Kxk`53@fW#w>PTB+A z7C;lL*SxGcI{n1Iiqe>1Ill_f=o^8P;qeT)h+rn$uBg>1u_ZO_sj5V)vGK1GxxXlk zR&DoSN#!wnM_|;jQnJRy>vb*cG}%mm(CkUP+6(<;ZE@FBL&ACBYn|V1xwV`7Ta%E_ zNk=*1U-NAxQvO2$f+!R66?HiTZC&)Dhj1SLm?al<-3*FVcq^vJ&}c@D$f?pPh1&ph zVrLp-l?S7+dqiB&<`2FAdR><@1(j1`Ph)6kh-J+46~UR2k%8-t5JKE4#7auOg%a8^ z2BI%w7Y+2{^#$Tw9aE2B_-l^+%9f}ox-ER0EmROsJn*ET+j6KQs$l}&S;2V8HEon} z5J_7h%e$!P!yWG^;RY?g`O|j*w!N^`lDN}sGrCLJLdaX2Jv~n&)tcwWKYvIg2zw&Y zn@p2p3g9#CV<_fcL-jCqNIdZ}pZQqXx8AGEo9=jT?%9@eDp7<60x|K& za6kuaT0@oEN{guI@YU2c|gQi<=-oMhe)JJr7meeh1@U;bkJU_S1Tb z7FU1qe?9gSr(kj&3$s5TB`I1Syjh5~F+1=8aG~$**8rHMQ0DvDqm3g181Mc>Gr{=} zqM-LKbC-_C-Rj~8KU94eaG}>?2bxmfv&{D|b%r0g zo!>}^v!Xap~apu&* z$0DQME0){+&6TE9%K(jxsI0jcI9LG{d%}d%nE{$_0?vQgy3TD#K;>~h2P{{yx(p=? zGAQkEH(y_C^(l4GBg|0hqu1VTwbZon84ofc<};^j2*ei*^HyYCBMa}^taQLsIOF%} zxXdayRQ=L8Dels0UIMofy{-XZ7jjleHkOI1KFJlpXQ33%%*=FjKp$5EF~wQfzLtWQ zEe1iLxNt4UG%!RfFF1*DbdLjFpC#jF-n?MUHmM@r`0UGFZ9rR5=0_P6ymykHJlO~r z`(s6VH8ewO(9#Q+#~jMV_NOkMu2U^14Y`Fggg@Btew)4fhfUs{i zrfhRifFquS=iz~M**ngzjid3NcV#lQ(YMmzRd6R_R9OD@z!PVFhM%`achkm(2i7*Ts+tN|LtAPTRqW;Z;#(I%G@_* zBZMyQONB`%T~0q(>}cirp(-F${Qv^c^<$FVF+&amuNe!h_(Z-1Im<37MR!P^;0L|E zlbvkmH#`*eXAj#8+|qHzM?iNkd;J6QDr(i(Lce@r0EN=chL*1ZK5LU#N*?t)PdaQ+ zBj`h35D+jhFyPgMH36?n0Wo)I8m@TNHf!Kre9L}OW_hHh9?4F$#mpf4y4r%}&$G;A z!qbHd+=;0cNh-Op7&C#rp4$vvDV!>~(b|@_@-9_@I-Ah~`)P$y*fR7Tzjmaox6v1mM)BogHZvorftdkDLvLWtr%z_hbT(|BUj&|8{?O`5+E5qn;+V z!*oy|{Qz+W#@ZD1vQePsxc=6|U#ALe*QJ!`BJ7?vE$k`2eED)t;!dT^jo#^IzZ&_< zqNAy1X{OG*xsHQxbNWwvQ0k;1F`(Er(02RKVgI^8)@$!pfha>NE?OHSv@}&8zFnrwqp0FnZ9x@$*8HD? z)~E$2NQv%#!?BhGLD&R6O;HiJ=3tN0&>L@N)TVLVCGac|?UTxT@5gOqyy<@i}hy>}q6o*7)?wpOdWXD$nK7%m!~uY~4X4 z2VWcT<^)iZ&E<^I^Mc>PM1fo-|6P5Hwun)I_iH2QFTf#$I_usa6qyr)viWuTXa9b75;Pi9{kw4lNFx9ZE^Iq86Ev0P)*Z^=0R5P9^4w1> zv)j$2!m{P1uUS$GB(?6DOj7YsT{p~0j6!}&k{q|}2&}PA4Q<$^YxUGNDZuZi3qfq5 zuhzFHvn5$C2+NJjYm3DGsR1wzsF=7hwqlP*6<- zQO=W2W9A~dIx6|2Th(>Hr`N6a-|Y&;zAr>uv{mP)g8f>92q#F_yq^2h04PItYT;Kf z$ebzi5tB5yH_F%1@N43h73Uq)47%{X#J2L3cgkh$5x#=<`b!)Jn zcY^e!oUclfPYYJg{y>JdmR(*n{kWhN7@HlwCW-=xH2Y&ZaG1ztuBoNQ+m2dZzM)(D zMg-c#0QKySnk!Aa%C?r7^%J+)I?T+^_&gK6X{>5W92WPnHC=VhJN>+NMfY`nd`sQF zuJWoRoClcATF))}-1FCVS+x}}SbQ73czm*xP*4-(5So@*4npmpjn$|%RqsN6vR)JV zANnS)<`?OhjPWyZFUf8j)VCGGsDf|%%RmWp}Z!n zrGz8t*VlrAaOs*qmqrRqVN~OnTScQUd|i$OW;17_ALcBx-|ZIejgCDEniG$ePBMPB z)f@z+f?esQMfdT3*h6oeLy2AjS_k(R`@*cRjCAz|;?xfA1_NYpKq`H*er|7b!n_)U z(xb~JD?Bhs<3lNDD3_Y|85)&9;{e)#Z?mRk&l2cMZ}L_TEgQ;D{3WR`v7nSz|F|Hu zq8GW6T&_2{WaSo&AcMHRDn9dE6gJIS`F$_X@kK58jWvB@22qB}S{ zmp9EF*0Gc0t_foN&t3585Ad7lt{OqQ$$X_Y`}<_cJh*YwQAosoHhVVOjI}-uzmT*O zy@Z_y`DCeN0(0_r-&bV_#0ckrM1Ayj#fz!#>z6JzPm_huDh2U1@GE5qS!=oNqurnB zw4z4|rFm6F|MS;EWeD!UzR9gSPlgL?4_F-Woa^fsnc?E84NqlWb1W!%-P%h56T~?4 zg~BY$3$kbo01pvHT$vvi+q|G)DC#Rr(F2&~3QMH_Xv^B^=&I?zKY!&*6F=KTYLxX( za`ldNF8ue2GJeMDM~FnJ{WQ8Mr4H9WQ71G|{vGInBs}SZ*7}+Zna^4h()US&IB3?9 zs->)+9;hU9zAn+ec`N)M1E<=~1${=J!#k0+%{nRWvnBAbR?D=y|>|Al3{%5oiZly@Cv5yhHiooq$ zlVf&6Bp>cU9F{+b`B*&#k`Abu6qSR=xw!5{{UW4#!Kv12#w2F3$;s#NQEobtDEwRb zu15uO;tYxaYfqSt$B4y^hT+WE7vc+>i!)=ZC-A*txh4_MV(>jelDxy&b;yV#EMS`F zw6|+-b0p&Nf!=aDvCTg;h#tC{O+>;d3FmY0_sS7>6X@9nr&pX&}~Km&%^A%sM7m9Ur1)~}@4 z&oiD=B*2EOhw}r4P|de`6|u$g1Sc=8sCx6F<(9j2`UAAX)fceAVO~7C003ox#05ky zftC{`3{OLwkbtqOk!x( z=GeJRcDzl_8~egWqXFjZ_-vtp?skbb89kk+q%zkUqqVAS<$13JbODE{`sl8Z`q3Mv z?j5Ne?^Q3^m!P!>J_DGID&d(gci!SK0q+srCe-)wcsSRx<8xVpWk&cBuRi_t@uvX| z8nalJPVXn7lJ$S6|K2pB`2A?KyrPw9=Va~lyyPCeKk>#z9nzc*y^=k5vBVvGP*-Ij zc5?Ey(4J9tZ)yXEMnEYD1@LKR>4j5FVdubO`jAS@Oey|uzMc!Df&mj_=78X8aS;Lm zAap=UR!lChxnKy0F_wR*=z1jL=LPASlRtb#@ zHGgc>KER3k9{ib6*=wo)TvSaT-M1Fbuufos0b`W4IniNqy(r)Kk^K_DRFic%h`o#R zrm>KhPttO;dh}i+y+>^2R58c(YC#9u_vdwEK)KQoiFPn}e)YlHmZbCWICk$x$?a%OWfSv5fN!1PK^HL=$;}{q(meS?3-U zw)(L9yN0QotZfNo+Q(u3rlEalnBap>zj5*QRcx`Oi#1tezj1`p_Wt zS1Q+RP4o*eq2+U_m%m7~Xh}O%occhI+UHd)_SdGr(ljsc^?yO{S~EV!ik9L{(R3R zW%;UU{icz*{$aD$zATn{ZUkG{`Ika_v(x5y|L)3kz;yY-+F+sza*J!eZ$ZY4DCV(W zK{qMo)jqH^xRUrJ9Oji?TBB_22=DYr7jCyuyH_nE3@ZfQGz+}Qm1s|Ved;8)96>@{ zA7(NEPL6_B8RQA0zll=YGOr$EbNMq5x(zCbV_SK6aiTILd&?j+T!O$yXovx3*Go@} zOs948^kiK}(7dYM2_-svkdeCGHkc!3_Wdzy$lA`;y}k%#(_T?g<&Xru*P%9;ZdNq_ z0kW0vVJv+`W@VoB0UmAg|?F@<-%)a$-roxi& zJ_QvB(PN)w2agvIFJatpqo^&;gw)3lu3~_kOiP$9=nqQfAE0%U1aU?}$P+-(IFp~e z5di)>@51^GEzby>6s`H&^`ms*@~DbXf@rZ!+a=!MgQ<;YHfqMyX4o&M&*iPK;_=C! z{W49g+m~UBkF7nhzF~+eb||ZdU)>}sS*0MuVQ3n8MBKo&Q!Gd}!!mkA99NRY_b{F? zb-uJ=L}O+7OG8zDfB+AU*JAXvWf?lII^qZSG-sQRb7=L!uC|XXJNz}XqBxz5yje0ZhW8eF>rZQRj?QM zgckqHsxU{8cB{f;V(n9 zh+~*DR-l+1V38LrtVnCZHLCt4!SIe>vmeObKmEiT=B+AsU#IY#V=a=P%XboGNJCLH z63GEv0zks31!?dz!PCx*1u`wFqU$QRVyRe)?2Ds`7CEe?Anx88{Iux^2C=wi@)W@4 zHh5C*DmnKx#M!5CXGd`Y$E%)b)GJGRRF-avEI ze|qmNJd%Gb?V}(MGYkDniQhycPl(5B`uJZo=5Np&Q+|mc!kUS>efzjitKI&I+u9@4 zi|ArO9Hv(y@gDUSR29A^csp$Q$)-pxA+^y~DI7PvkiRoV(RM$3;bsvHqNlR4T6jD@ zk7CjCS>e|Sb(lg%My`p140mufY2Of=eW^YFp}kL;uA1)HJflyRNa1MjLjws&^qw(w zXMsu5NX?=Qi-`fu#ZTT33$Ig8a6&;+UPYl3r)J8gr<dfkxpxt(IVb|CAB$3r*x+~~$GaDT`=^#fyY z>+AJeSD>ReiEctfP_+0v@!64%*9yesw(5`8J`0tuVRH=~rc!=P3O26`ba>b6sa)OH zF)Sw4>B(KIs*Oh|zN^#8*1=B^FDCn=iYJsI4ZzV6nG~xj1V`k9U50nIeTL=(CTC37 zjQjV?@U7fabA!kSeF^F(DFvROKps{j35nXK4j?NyUe68C#Aj z0y2;@Eb3m|y_m8qa&sG+dHuJIhB8bPm~eqWvR}HIu_a9bSJnHulRq#?7T9B|vx%3p zO_4IXC~o@|1xJ3usS8{~3dz)lXFuep&!sb)$h60eh!$bMBeZvRj`uggkE81EBXh#BjP&68Y2T8hr?Wc4@9=5onx zujep-B@g*;6xw0ADJOgzv|AC+9`)?@)t2}bWdNqsHMN56*$3os!iN$Jz! zShL0N^6lZpuW-!aTl#530XUa;1o2loAawYPB0v}*UKs&jH?A#qwB;4(k9{S+P#-0o zR4gGEPMijon0!c}LJ~hyPY!vq1_Bd21=s8$8sN4=9XWRJW*`ubt;PF^{|m&-(5if+ zpP-(-*sPXI^CXh~aPF}nHS%Emwq6W5ucv{bV56YWV z@v^H?Y%1Eo0cRm$J6goyC+crhF@Aos3)=ZN3#wUeqYWy-($Dr8eRxbk80NqNB#tXc z_H+$+BR21)BP=i(lQ-ELRcz|1%FzL*>Q#sEfeo3`S7|^?{=e96Af>o%R#cS3ORP?M zo&E~yh^lea8@p{@r-_Fk;5)<-;~tm%u}fS|PM7O;NqCSF$b?dGoGif^!7@k{pzcIM z1L>Sn z5ny}6nVX@V?O=z<$q_syT#Rfk52lp*i+WQm3Z73iUi~cr?Ho6R8jKiR&_gOS3&?Lf zXrtx4eNFK7C?f_gSA^6(qKTJFAvS&{_#`Cbb>tyt=;smTsLVE=2n1P|&CQ$5$IQ7Z zZnEoj&E+nK%~S|y{LGVtoTR9z{&1$Gh&YQHH(pOtk`blnR)3?OI|+UPaVbi)M%+$M z7gZ+aTuxhMj$p#Ys|X9H18}oCerB9%6*o#3qL2O>>^QJ2diBu8p8B0^cOQ|shh1z; z>1qsH!h;*YbN-?vCpY%<6?iWQ`{^b}p*eF1s^a@xz?vNp<-B~jOGcy7QyOTvG3I$USm;fsj^xWyM6sU>+ zQp(;xuG25_zcsQZ!FEkUAS6M5p9?rm_PsL*J8$VlQ+2p~ZmVU6mewQ*n`W0YNNdUD(kGxHGtNFf{O zpSHYS$jN!JJy>Ldbc}o5JcCp-06qUKLLC8P1y&H92D&rOKh_0SWEj0XZ&9Gr;*$?$A*Vp?Ff%83 z;xREK>)e_GQ#rRmkxhHRaxx!53ZNp{W8CYBmyJ2rjPGAHqLPQHTUMw4%G2adEF>8W zIE5C>_NkCBnlNo=;Qb|>NyWs=OD51Gmqi@5aS<@f2Vgl1SA>g{Ifk%Y!|s=pU{r&t z8=z_b=|KDG3ugG*VlqF2EVgHzGv-j5srzbVM%?tInTIbmcrMDsWY z3(QfVtf;7HVDF6aNr5;+CpJWFA6)71S}?@6Aera^(`^pwlCJ`f8G(hLsjI2`yZRK} zl_um2T^JIwU;mgH;UNYQXDbL4PWmN22@-5;Uea>o5f(}RUh$>R0;h@$N=LM41+hp_ zWzN0a&mdlAV(RV!8khR`%eJiCjrnB0LQZDk1%teHe2NZ3&knEW9S3{zz}XV5|y^bE!(K5XR4HLRoVW%mCm+)owS#{y z(uBN#gsi)n$c-1eR0axyQ+d|N#!Lf^P-ot|P#-mhnCIlO;}s<14U1t)(r@1=pH#e5 zxj+!VVGYrzkT*zIdTiF-Oa;3>i+6C`2U~{V&SeAgLhvD4dudd<&BKp?@%Vi9&YW z{B$LAArp;x$uYU#5_QT)yxvlTG$MOQw7o1QA3NYXfZf+szhfX11-@JHD{5pi+fZ{N zND`1$<%x(sK?p76TbfQeW~Bzs0gz3lT}%585M`I&EV+h1DwX9R{zV%%L3e6Q-D;2| zsM@pupD1;kg{LT_r;D^iTn8eU>(g+?#?(#2u|{*YmulTMH8MhSR4c=b-~#&urfbNV zlCdg0h{3TY3?YN4Veo3Gh(J5#n8E`5GSk8ZAK`Vrf*3)ZeD1izCJD`fL9Hs7Ip;ic zntET9mKIK`y#l6@tAYbuKVzH}oqAj*Lr5(SlVN^xnP0FobQrhurVUiS;xWC^>F0rH zb6BSl=i*7FCG&BHZIa4(io}nyhDG5r)pNyE3sB)ZL(Tn-MM<Cm5|@nk7FHWc#F zC5Y)PjiS6nrF=)^TQZVy3b6aY2SLSi`UL#u#(>HG|MK_Z?v)mW + +## Improved Code Efficiency +The inclusion of metadata in flag configurations brings substantial benefits in terms of code efficiency and reusability. +By using the `VariationDetails` functions, developers can easily retrieve the associated metadata when working with the flag. + +This eliminates the need for additional queries or requests to obtain essential information related to a specific flag. +Developers can conveniently leverage this information within their code, leading to streamlined development processes and improved overall efficiency. + +## How to add the metadata? +We have introduced a new field in the configuration of your flag + +```yaml +example_flag: + variations: + A: true + B: false + defaultRule: + variation: B + metadata: + description: this is a super simple example feature flag + issue-link: https://jira.xxx/GOFF-01 +``` + +Now that you have this field available you can read the metadata in your `VariationDetails` when the evaluation is done. + +GO Feature Flag relay-proxy also enable seamless access to the added metadata. + +## Open Feature SDK Compatibility +To further enhance the usability and compatibility of GO Feature Flag, the new metadata feature aligns with the **v0.6.0** version of the Open Feature specification. +This update ensures that the metadata can be retrieved seamlessly using the Open Feature SDKs. + +As soon as the SDKs will compatible with the metadata we will support it in the different GO Feature Flag providers. + +## Conclusion +The introduction of metadata support in GO Feature Flag marks a significant milestone in feature flag solutions. +Enabling developers to attach relevant information directly to their flag configurations opens up new possibilities for +enhanced flag management and streamlined development processes. +With the ability to retrieve metadata, developers can access essential information with ease. + +The compatibility with the Open Feature SDK further solidifies the integration capabilities and ensures seamless utilization of metadata throughout the development cycle. +Embrace the power of metadata and unlock a new level of control and efficiency in your feature flag management with GO Feature Flag's latest update. + diff --git a/website/docs/configure_flag/flag_format.mdx b/website/docs/configure_flag/flag_format.mdx index 008378ab115..da13507f0c0 100644 --- a/website/docs/configure_flag/flag_format.mdx +++ b/website/docs/configure_flag/flag_format.mdx @@ -48,6 +48,9 @@ first-flag: B: 100 defaultRule: # When no targeting match we use the defaultRule variation: A + metadata: + issue_link: https://github.com/thomaspoignant/go-feature-flag/issues/XXX + description: this is my first feature flag # A second example of a flag configuration second-flag: @@ -91,6 +94,10 @@ second-flag: ], "defaultRule": { "variation": "A" + }, + "metadata": { + "issue_link": "https://github.com/thomaspoignant/go-feature-flag/issues/XXX", + "description": "this is my first feature flag" } }, @@ -141,6 +148,10 @@ query = 'key eq "random-key"' [first-flag.defaultRule] variation = "A" +[first-flag.metadata] +issue_link = "https://github.com/thomaspoignant/go-feature-flag/issues/XXX" +description = "this is my first feature flag" + [second-flag] version = "12" @@ -238,6 +249,12 @@ version = "12"

Default: ""

+ + metadata
(optional) + +

This field allows adding a wealth of information about a particular feature flag, such as a configuration URL or the originating Jira issue.

+ + scheduledRollout
(optional) diff --git a/website/src/components/editor/FlagDisplay/index.js b/website/src/components/editor/FlagDisplay/index.js index 1e621b3ec73..f5bcd54ef6c 100644 --- a/website/src/components/editor/FlagDisplay/index.js +++ b/website/src/components/editor/FlagDisplay/index.js @@ -30,6 +30,13 @@ function formToGoFeatureFlag(formData) { } } + function convertMetadata(metadata) { + if (metadata === undefined || metadata === {} || metadata.filter(({name})=>name !== "").length === 0) { + return undefined + } + return Object.assign({}, ...metadata.map(({name, value}) => ({[name]: value}))) + } + function convertRule(ruleForm) { let variation, percentage, @@ -98,6 +105,7 @@ function formToGoFeatureFlag(formData) { version: flagFormData.version === '' ? undefined : flagFormData.version, targeting: targeting.length > 0 ? targeting : undefined, defaultRule, + metadata: convertMetadata(flagFormData.metadata), }; } diff --git a/website/src/components/editor/FlagForm/index.js b/website/src/components/editor/FlagForm/index.js index 0eb09dd82ef..8ad50ed751f 100644 --- a/website/src/components/editor/FlagForm/index.js +++ b/website/src/components/editor/FlagForm/index.js @@ -9,6 +9,7 @@ import {useFormContext} from 'react-hook-form'; import {Targeting} from '../Targeting'; import {Rule} from '../Rule'; import PropTypes from 'prop-types'; +import { Metadata } from "../Metadata"; FlagForm.propTypes = { label: PropTypes.string.isRequired, @@ -79,6 +80,7 @@ export function FlagForm({label}) { isDefaultRule={true} /> + ); } diff --git a/website/src/components/editor/Metadata/index.js b/website/src/components/editor/Metadata/index.js new file mode 100644 index 00000000000..2c5f6eacc72 --- /dev/null +++ b/website/src/components/editor/Metadata/index.js @@ -0,0 +1,91 @@ +import styles from './styles.module.css'; +import {Input} from '../Input'; +import clsx from 'clsx'; +import React from 'react'; +import {useFieldArray, useFormContext} from 'react-hook-form'; +import PropTypes from 'prop-types'; + +Metadata.propTypes = { + label: PropTypes.string.isRequired, +}; +export function Metadata({label}) { + const {control} = useFormContext(); + const {fields, append, remove} = useFieldArray({ + control, + name: label, + rules: {minLength: 1}, + }); + + const removeMetadataItem = index => remove(index); + const handleOnClick = () => append({name:"", value: ""}); + + return ( +
+

Metadata

+ {fields.length <= 0 &&
Add new metadata to your flag
} +
+ {fields.map((field, index) => ( + + ))} +
+ +
+ ); +} + +MetadataItem.propTypes = { + label: PropTypes.string.isRequired, + remove: PropTypes.func.isRequired, + index: PropTypes.number.isRequired, +}; +function MetadataItem({type, label, remove, index, icon}) { + const {register} = useFormContext(); + const handleOnClick = event => { + event.preventDefault(); + remove(index); + }; + return ( +
+
+
{icon}
+ +
+
+ +
+
+ { + + } +
+
+ ); +} diff --git a/website/src/components/editor/Metadata/styles.module.css b/website/src/components/editor/Metadata/styles.module.css new file mode 100644 index 00000000000..9dc8d0ccd96 --- /dev/null +++ b/website/src/components/editor/Metadata/styles.module.css @@ -0,0 +1,33 @@ +.buttonPlus { + background: none; + border: none; + cursor: pointer; + padding-top: 0.3px; +} + +.buttonPlus .bg { + color: var(--goff-variation-plus-button-bg); +} + +.variation { + display: flex; + padding-bottom: 1.2rem; +} + +.icons { + display: flex; +} + +.icons div { + padding-right: 0.2rem; +} + +.icon { + font-size: 0.8rem; + padding-top: 0.3rem; + margin-right: 0.5rem; +} + +.targeting { + display: flex; +}