From 4d97478c0d3783f6ba6c1f8dfff400bae995dcd2 Mon Sep 17 00:00:00 2001 From: rafidzal Date: Wed, 29 Mar 2017 20:40:58 +0800 Subject: [PATCH] Update references to zone and context to zoneId and contextId for all Consumer-side code. --- .../Sif.Framework/Consumers/Consumer.cs | 48 +++--- .../Consumers/FunctionalServiceConsumer.cs | 156 +++++++++--------- .../Sif.Framework/Consumers/IConsumer.cs | 72 ++++---- .../Sif.Framework/Utils/EnvironmentUtils.cs | 30 ++-- .../Sif.Framework/Utils/HttpUtils.cs | 14 +- .../ConsumerApp.cs | 2 +- .../ConsumerApp.cs | 2 +- Data/Databases/SQLite/SifFrameworkDatabase.db | Bin 205824 -> 205824 bytes .../Sif.Framework 3.2.0/Sif.Framework.dll | Bin 193024 -> 193024 bytes 9 files changed, 162 insertions(+), 162 deletions(-) diff --git a/Code/Sif3Framework/Sif.Framework/Consumers/Consumer.cs b/Code/Sif3Framework/Sif.Framework/Consumers/Consumer.cs index aaf35317..9cb75e51 100644 --- a/Code/Sif3Framework/Sif.Framework/Consumers/Consumer.cs +++ b/Code/Sif3Framework/Sif.Framework/Consumers/Consumer.cs @@ -161,7 +161,7 @@ public void Unregister(bool? deleteOnUnregister = null) /// /// GetChangesSinceMarker /// - public string GetChangesSinceMarker(string zone = null, string context = null) + public string GetChangesSinceMarker(string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -169,7 +169,7 @@ public string GetChangesSinceMarker(string zone = null, string context = null) throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId); WebHeaderCollection responseHeaders = HttpUtils.HeadRequest(url, RegistrationService.AuthorisationToken); return responseHeaders[HttpUtils.RequestHeader.changesSinceMarker.ToDescription()]; @@ -178,7 +178,7 @@ public string GetChangesSinceMarker(string zone = null, string context = null) /// /// Create /// - public virtual TSingle Create(TSingle obj, string zone = null, string context = null) + public virtual TSingle Create(TSingle obj, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -186,7 +186,7 @@ public virtual TSingle Create(TSingle obj, string zone = null, string context = throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + TypeName + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + TypeName + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseSingle(obj); string xml = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body); if (log.IsDebugEnabled) log.Debug("XML from POST request ..."); @@ -198,7 +198,7 @@ public virtual TSingle Create(TSingle obj, string zone = null, string context = /// /// Create /// - public virtual MultipleCreateResponse Create(TMultiple obj, string zone = null, string context = null) + public virtual MultipleCreateResponse Create(TMultiple obj, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -206,7 +206,7 @@ public virtual MultipleCreateResponse Create(TMultiple obj, string zone = null, throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseMultiple(obj); string xml = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body); if (log.IsDebugEnabled) log.Debug("XML from POST request ..."); @@ -220,7 +220,7 @@ public virtual MultipleCreateResponse Create(TMultiple obj, string zone = null, /// /// Query /// - public virtual TSingle Query(TPrimaryKey refId, string zone = null, string context = null) + public virtual TSingle Query(TPrimaryKey refId, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -232,7 +232,7 @@ public virtual TSingle Query(TPrimaryKey refId, string zone = null, string conte try { - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + refId + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + refId + HttpUtils.MatrixParameters(zoneId, contextId); string xml = HttpUtils.GetRequest(url, RegistrationService.AuthorisationToken); if (log.IsDebugEnabled) log.Debug("XML from GET request ..."); if (log.IsDebugEnabled) log.Debug(xml); @@ -268,7 +268,7 @@ public virtual TSingle Query(TPrimaryKey refId, string zone = null, string conte /// /// Query /// - public virtual TMultiple Query(uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null) + public virtual TMultiple Query(uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -276,7 +276,7 @@ public virtual TMultiple Query(uint? navigationPage = null, uint? navigationPage throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId); string xml; if (navigationPage.HasValue && navigationPageSize.HasValue) @@ -294,7 +294,7 @@ public virtual TMultiple Query(uint? navigationPage = null, uint? navigationPage /// /// QueryByExample /// - public virtual TMultiple QueryByExample(TSingle obj, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null) + public virtual TMultiple QueryByExample(TSingle obj, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -302,7 +302,7 @@ public virtual TMultiple QueryByExample(TSingle obj, uint? navigationPage = null throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseSingle(obj); // TODO: Update PostRequest to accept paging parameters. string xml = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body, "GET"); @@ -315,7 +315,7 @@ public virtual TMultiple QueryByExample(TSingle obj, uint? navigationPage = null /// /// QueryByServicePath /// - public virtual TMultiple QueryByServicePath(IEnumerable conditions, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null) + public virtual TMultiple QueryByServicePath(IEnumerable conditions, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -335,7 +335,7 @@ public virtual TMultiple QueryByServicePath(IEnumerable conditio } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + servicePath + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + servicePath + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId); if (log.IsDebugEnabled) log.Debug("Service Path URL is " + url); string xml; @@ -354,7 +354,7 @@ public virtual TMultiple QueryByServicePath(IEnumerable conditio /// /// QueryChangesSince /// - public TMultiple QueryChangesSince(string changesSinceMarker, out string nextChangesSinceMarker, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null) + public TMultiple QueryChangesSince(string changesSinceMarker, out string nextChangesSinceMarker, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -363,7 +363,7 @@ public TMultiple QueryChangesSince(string changesSinceMarker, out string nextCha } string changesSinceParameter = (changesSinceMarker == null ? string.Empty : "?changesSinceMarker=" + changesSinceMarker); - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context) + changesSinceParameter; + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId) + changesSinceParameter; WebHeaderCollection responseHeaders; string xml; @@ -384,7 +384,7 @@ public TMultiple QueryChangesSince(string changesSinceMarker, out string nextCha /// /// Update /// - public virtual void Update(TSingle obj, string zone = null, string context = null) + public virtual void Update(TSingle obj, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -392,7 +392,7 @@ public virtual void Update(TSingle obj, string zone = null, string context = nul throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + obj.RefId + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + obj.RefId + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseSingle(obj); string xml = HttpUtils.PutRequest(url, RegistrationService.AuthorisationToken, body); if (log.IsDebugEnabled) log.Debug("XML from PUT request ..."); @@ -402,7 +402,7 @@ public virtual void Update(TSingle obj, string zone = null, string context = nul /// /// Update /// - public virtual MultipleUpdateResponse Update(TMultiple obj, string zone = null, string context = null) + public virtual MultipleUpdateResponse Update(TMultiple obj, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -410,7 +410,7 @@ public virtual MultipleUpdateResponse Update(TMultiple obj, string zone = null, throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseMultiple(obj); string xml = HttpUtils.PutRequest(url, RegistrationService.AuthorisationToken, body); if (log.IsDebugEnabled) log.Debug("XML from PUT request ..."); @@ -424,7 +424,7 @@ public virtual MultipleUpdateResponse Update(TMultiple obj, string zone = null, /// /// Delete /// - public virtual void Delete(TPrimaryKey refId, string zone = null, string context = null) + public virtual void Delete(TPrimaryKey refId, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -432,7 +432,7 @@ public virtual void Delete(TPrimaryKey refId, string zone = null, string context throw new InvalidOperationException("Consumer has not registered."); } - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + refId + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + "/" + refId + HttpUtils.MatrixParameters(zoneId, contextId); string xml = HttpUtils.DeleteRequest(url, RegistrationService.AuthorisationToken); if (log.IsDebugEnabled) log.Debug("XML from DELETE request ..."); if (log.IsDebugEnabled) log.Debug(xml); @@ -441,7 +441,7 @@ public virtual void Delete(TPrimaryKey refId, string zone = null, string context /// /// Delete /// - public virtual MultipleDeleteResponse Delete(IEnumerable refIds, string zone = null, string context = null) + public virtual MultipleDeleteResponse Delete(IEnumerable refIds, string zoneId = null, string contextId = null) { if (!RegistrationService.Registered) @@ -458,7 +458,7 @@ public virtual MultipleDeleteResponse Delete(IEnumerable refIds, st } deleteRequestType request = new deleteRequestType { deletes = deleteIds.ToArray() }; - string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zone, context); + string url = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiserFactory.GetXmlSerialiser().Serialise(request); string xml = HttpUtils.PutRequest(url, RegistrationService.AuthorisationToken, body, "DELETE"); if (log.IsDebugEnabled) log.Debug("XML from PUT (DELETE) request ..."); diff --git a/Code/Sif3Framework/Sif.Framework/Consumers/FunctionalServiceConsumer.cs b/Code/Sif3Framework/Sif.Framework/Consumers/FunctionalServiceConsumer.cs index d54d6f44..97ef871a 100644 --- a/Code/Sif3Framework/Sif.Framework/Consumers/FunctionalServiceConsumer.cs +++ b/Code/Sif3Framework/Sif.Framework/Consumers/FunctionalServiceConsumer.cs @@ -172,16 +172,16 @@ protected virtual string GetURLPrefix(string jobName) /// Create a single Job with the defaults provided, and persist it to the data store /// /// Job object with defaults to use when creating the Job - /// The zone in which to create the Job - /// The context in which to create the Job + /// The zone in which to create the Job + /// The context in which to create the Job /// The created Job object - public virtual Job Create(Job job, string zone = null, string context = null) + public virtual Job Create(Job job, string zoneId = null, string contextId = null) { checkRegistered(); - checkJob(job, RightType.CREATE, zone); + checkJob(job, RightType.CREATE, zoneId); - string url = GetURLPrefix(job.Name) + "/" + job.Name + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Name + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseSingle(job); string xml = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body); if (log.IsDebugEnabled) log.Debug("XML from POST request ..."); @@ -194,16 +194,16 @@ public virtual Job Create(Job job, string zone = null, string context = null) /// Create a multiple Jobs with the defaults provided, and persist it to the data store /// /// Job objects with defaults to use when creating the Jobs - /// The zone in which to create the Jobs - /// The context in which to create the Jobs + /// The zone in which to create the Jobs + /// The context in which to create the Jobs /// A MultipleCreateResponse object - public virtual MultipleCreateResponse Create(List jobs, string zone = null, string context = null) + public virtual MultipleCreateResponse Create(List jobs, string zoneId = null, string contextId = null) { checkRegistered(); - string jobName = checkJobs(jobs, RightType.CREATE, zone); + string jobName = checkJobs(jobs, RightType.CREATE, zoneId); - string url = GetURLPrefix(jobName) + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(jobName) + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseMultiple(jobs); string xml = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body); if (log.IsDebugEnabled) log.Debug("XML from POST request ..."); @@ -219,10 +219,10 @@ public virtual MultipleCreateResponse Create(List jobs, string zone = null, /// /// A MutilpleCreateResponse object to parse /// The job name (singular) that the MultipleCreateResponse refers to - /// The zone in which to fetch the Jobs - /// The context in which to fetch the Jobs + /// The zone in which to fetch the Jobs + /// The context in which to fetch the Jobs /// The created Job objects - public virtual IList GetCreated(MultipleCreateResponse creates, string jobName, string zone = null, string context = null) + public virtual IList GetCreated(MultipleCreateResponse creates, string jobName, string zoneId = null, string contextId = null) { if(creates == null) { @@ -240,7 +240,7 @@ where s.StatusCode.StartsWith("2") foreach(Job job in toFetch) { - fetched.Add(this.Query(job, zone, context)); + fetched.Add(this.Query(job, zoneId, contextId)); } return fetched; @@ -250,18 +250,18 @@ where s.StatusCode.StartsWith("2") /// Get a single Job /// /// The job template of the Job to fetch, must have name and id properties populated. - /// The zone in which to perform the request. - /// The context in which to perform the request. + /// The zone in which to perform the request. + /// The context in which to perform the request. /// The Job object - public virtual Job Query(Job job, string zone = null, string context = null) + public virtual Job Query(Job job, string zoneId = null, string contextId = null) { checkRegistered(); - checkJob(job, RightType.QUERY, zone); + checkJob(job, RightType.QUERY, zoneId); try { - string url = GetURLPrefix(job.Name) + "/" + job.Id + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Id + HttpUtils.MatrixParameters(zoneId, contextId); string xml = HttpUtils.GetRequest(url, RegistrationService.AuthorisationToken); if (log.IsDebugEnabled) log.Debug("XML from GET request ..."); if (log.IsDebugEnabled) log.Debug(xml); @@ -296,16 +296,16 @@ public virtual Job Query(Job job, string zone = null, string context = null) /// The name of the job used to resolve the right functional service /// The page to fetch /// The number of items to fetch per page - /// The zone in which to operate - /// The context in which to operate + /// The zone in which to operate + /// The context in which to operate /// A page of Job objects - public virtual List Query(string jobName, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null) + public virtual List Query(string jobName, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null) { checkRegistered(); - checkJob(new Job(jobName), RightType.QUERY, zone, true); + checkJob(new Job(jobName), RightType.QUERY, zoneId, true); - string url = GetURLPrefix(jobName) + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(jobName) + HttpUtils.MatrixParameters(zoneId, contextId); string xml; if (navigationPage.HasValue && navigationPageSize.HasValue) @@ -326,16 +326,16 @@ public virtual List Query(string jobName, uint? navigationPage = null, uint /// The example object to match against /// The page to fetch /// The number of items to fetch per page - /// The zone in which to operate - /// The context in which to operate + /// The zone in which to operate + /// The context in which to operate /// A page of Job objects - public virtual List QueryByExample(Job job, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null) + public virtual List QueryByExample(Job job, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null) { checkRegistered(); - checkJob(job, RightType.QUERY, zone); + checkJob(job, RightType.QUERY, zoneId); - string url = GetURLPrefix(job.Name) + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseSingle(job); // TODO: Update PostRequest to accept paging parameters. string xml = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body, "GET"); @@ -350,13 +350,13 @@ public virtual List QueryByExample(Job job, uint? navigationPage = null, ui /// Update single job object is not supported for Functional Services. Throws a HttpResponseException with Forbidden status code. /// /// Job object to update - /// The zone in which to update the Job - /// The context in which to update the Job - public virtual void Update(Job job, string zone = null, string context = null) + /// The zone in which to update the Job + /// The context in which to update the Job + public virtual void Update(Job job, string zoneId = null, string contextId = null) { checkRegistered(); - checkJob(job, RightType.UPDATE, zone); + checkJob(job, RightType.UPDATE, zoneId); throw new HttpResponseException(HttpStatusCode.Forbidden); } @@ -365,13 +365,13 @@ public virtual void Update(Job job, string zone = null, string context = null) /// Update multiple job objects is not supported for Functional Services. Throws a HttpResponseException with Forbidden status code. /// /// Job objects to update - /// The zone in which to update the Jobs - /// The context in which to update the Jobs - public virtual MultipleUpdateResponse Update(List jobs, string zone = null, string context = null) + /// The zone in which to update the Jobs + /// The context in which to update the Jobs + public virtual MultipleUpdateResponse Update(List jobs, string zoneId = null, string contextId = null) { checkRegistered(); - checkJobs(jobs, RightType.UPDATE, zone); + checkJobs(jobs, RightType.UPDATE, zoneId); throw new HttpResponseException(HttpStatusCode.Forbidden); } @@ -380,15 +380,15 @@ public virtual MultipleUpdateResponse Update(List jobs, string zone = null, /// Delete a Job /// /// The job template of the Job to delete, must have name and id populated. - /// The zone in which to perform the request. - /// The context in which to perform the request. - public virtual void Delete(Job job, string zone = null, string context = null) + /// The zone in which to perform the request. + /// The context in which to perform the request. + public virtual void Delete(Job job, string zoneId = null, string contextId = null) { checkRegistered(); - checkJob(job, RightType.DELETE, zone); + checkJob(job, RightType.DELETE, zoneId); - string url = GetURLPrefix(job.Name) + "/" + job.Id + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Id + HttpUtils.MatrixParameters(zoneId, contextId); string xml = HttpUtils.DeleteRequest(url, RegistrationService.AuthorisationToken); if (log.IsDebugEnabled) log.Debug("XML from DELETE request ..."); if (log.IsDebugEnabled) log.Debug(xml); @@ -398,14 +398,14 @@ public virtual void Delete(Job job, string zone = null, string context = null) /// Delete a series of Job objects /// /// The job objtect templates of the Jobs to delete, each must have name and id populated. tHe name of all jobs must be the same. - /// The zone in which to perform the request. - /// The context in which to perform the request. + /// The zone in which to perform the request. + /// The context in which to perform the request. /// A response - public virtual MultipleDeleteResponse Delete(List jobs, string zone = null, string context = null) + public virtual MultipleDeleteResponse Delete(List jobs, string zoneId = null, string contextId = null) { checkRegistered(); - string jobName = checkJobs(jobs, RightType.DELETE, zone); + string jobName = checkJobs(jobs, RightType.DELETE, zoneId); List deleteIds = new List(); @@ -415,7 +415,7 @@ public virtual MultipleDeleteResponse Delete(List jobs, string zone = null, } deleteRequestType request = new deleteRequestType { deletes = deleteIds.ToArray() }; - string url = GetURLPrefix(jobName) + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(jobName) + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiserFactory.GetXmlSerialiser().Serialise(request); string xml = HttpUtils.PutRequest(url, RegistrationService.AuthorisationToken, body, "DELETE"); if (log.IsDebugEnabled) log.Debug("XML from PUT (DELETE) request ..."); @@ -432,19 +432,19 @@ public virtual MultipleDeleteResponse Delete(List jobs, string zone = null, /// The Job on which to execute the phase /// The name of the phase /// The payload to send to the phase - /// The zone in which to operate - /// The context in which to operate + /// The zone in which to operate + /// The context in which to operate /// The mime type of the data to be sent /// The expected mime type of the result /// A string, possibly containing a serialized object, returned from the functional service - public virtual string CreateToPhase(Job job, string phaseName, string body = null, string zone = null, string context = null, string contentTypeOverride = null, string acceptOverride = null) + public virtual string CreateToPhase(Job job, string phaseName, string body = null, string zoneId = null, string contextId = null, string contentTypeOverride = null, string acceptOverride = null) { checkRegistered(); - checkJob(job, zone); + checkJob(job, zoneId); string response = null; - string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zoneId, contextId); response = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body, contentTypeOverride: contentTypeOverride, acceptOverride: acceptOverride); if (log.IsDebugEnabled) log.Debug("String from CREATE request to phase ..."); if (log.IsDebugEnabled) log.Debug(response); @@ -457,19 +457,19 @@ public virtual string CreateToPhase(Job job, string phaseName, string body = nul /// The Job on which to execute the phase /// The name of the phase /// The payload to send to the phase - /// The zone in which to operate - /// The context in which to operate + /// The zone in which to operate + /// The context in which to operate /// The mime type of the data to be sent /// The expected mime type of the result /// A string, possibly containing a serialized object, returned from the functional service - public virtual string RetrieveToPhase(Job job, string phaseName, string body = null, string zone = null, string context = null, string contentTypeOverride = null, string acceptOverride = null) + public virtual string RetrieveToPhase(Job job, string phaseName, string body = null, string zoneId = null, string contextId = null, string contentTypeOverride = null, string acceptOverride = null) { checkRegistered(); - checkJob(job, zone); + checkJob(job, zoneId); string response = null; - string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zoneId, contextId); response = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body, "GET", contentTypeOverride, acceptOverride); if (log.IsDebugEnabled) log.Debug("String from GET request to phase ..."); if (log.IsDebugEnabled) log.Debug(response); @@ -482,19 +482,19 @@ public virtual string RetrieveToPhase(Job job, string phaseName, string body = n /// The Job on which to execute the phase /// The name of the phase /// The payload to send to the phase - /// The zone in which to operate - /// The context in which to operate + /// The zone in which to operate + /// The context in which to operate /// The mime type of the data to be sent /// The expected mime type of the result /// A string, possibly containing a serialized object, returned from the functional service - public virtual string UpdateToPhase(Job job, string phaseName, string body, string zone = null, string context = null, string contentTypeOverride = null, string acceptOverride = null) + public virtual string UpdateToPhase(Job job, string phaseName, string body, string zoneId = null, string contextId = null, string contentTypeOverride = null, string acceptOverride = null) { checkRegistered(); - checkJob(job, zone); + checkJob(job, zoneId); string response = null; - string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zoneId, contextId); response = HttpUtils.PutRequest(url, RegistrationService.AuthorisationToken, body, contentTypeOverride: contentTypeOverride, acceptOverride: acceptOverride); if (log.IsDebugEnabled) log.Debug("String from PUT request to phase ..."); if (log.IsDebugEnabled) log.Debug(response); @@ -507,19 +507,19 @@ public virtual string UpdateToPhase(Job job, string phaseName, string body, stri /// The Job on which to execute the phase /// The name of the phase /// The payload to send to the phase - /// The zone in which to operate - /// The context in which to operate + /// The zone in which to operate + /// The context in which to operate /// The mime type of the data to be sent /// The expected mime type of the result /// A string, possibly containing a serialized object, returned from the functional service - public virtual string DeleteToPhase(Job job, string phaseName, string body, string zone = null, string context = null, string contentTypeOverride = null, string acceptOverride = null) + public virtual string DeleteToPhase(Job job, string phaseName, string body, string zoneId = null, string contextId = null, string contentTypeOverride = null, string acceptOverride = null) { checkRegistered(); - checkJob(job, zone); + checkJob(job, zoneId); string response = null; - string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + HttpUtils.MatrixParameters(zoneId, contextId); response = HttpUtils.DeleteRequest(url, RegistrationService.AuthorisationToken, body, contentTypeOverride: contentTypeOverride, acceptOverride: acceptOverride); if (log.IsDebugEnabled) log.Debug("String from DELETE request to phase ..."); if (log.IsDebugEnabled) log.Debug(response); @@ -532,16 +532,16 @@ public virtual string DeleteToPhase(Job job, string phaseName, string body, stri /// The Job on which to operate /// The name of the phase whose state is to change /// The PhaseState instance template - /// The zone in which to perform the request. - /// The context in which to perform the request. + /// The zone in which to perform the request. + /// The context in which to perform the request. /// The current state of the phase. - public virtual PhaseState CreateToState(Job job, string phaseName, PhaseState item, string zone = null, string context = null) + public virtual PhaseState CreateToState(Job job, string phaseName, PhaseState item, string zoneId = null, string contextId = null) { checkRegistered(); - checkJob(job, zone); + checkJob(job, zoneId); - string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + "/states/state" + HttpUtils.MatrixParameters(zone, context); + string url = GetURLPrefix(job.Name) + "/" + job.Id + "/" + phaseName + "/states/state" + HttpUtils.MatrixParameters(zoneId, contextId); string body = SerialiseSingle(item); string xml = HttpUtils.PostRequest(url, RegistrationService.AuthorisationToken, body); if (log.IsDebugEnabled) log.Debug("Guid from CREATE request to state on phase ..."); @@ -549,7 +549,7 @@ public virtual PhaseState CreateToState(Job job, string phaseName, PhaseState it return DeserialiseSingle(xml); } - private Model.Infrastructure.Service checkJob(Job job, string zone = null) + private Model.Infrastructure.Service checkJob(Job job, string zoneId = null) { if (job == null) { @@ -561,7 +561,7 @@ private Model.Infrastructure.Service checkJob(Job job, string zone = null) throw new ArgumentException("Job name must be specified."); } - Model.Infrastructure.Service service = ZoneUtils.GetService(EnvironmentUtils.GetTargetZone(registrationService.CurrentEnvironment, zone), job.Name + "s", ServiceType.FUNCTIONAL); + Model.Infrastructure.Service service = ZoneUtils.GetService(EnvironmentUtils.GetTargetZone(registrationService.CurrentEnvironment, zoneId), job.Name + "s", ServiceType.FUNCTIONAL); if (service == null) { @@ -571,9 +571,9 @@ private Model.Infrastructure.Service checkJob(Job job, string zone = null) return service; } - private void checkJob(Job job, RightType right, string zone = null, Boolean ignoreId= false) + private void checkJob(Job job, RightType right, string zoneId = null, Boolean ignoreId= false) { - Model.Infrastructure.Service service = checkJob(job, zone); + Model.Infrastructure.Service service = checkJob(job, zoneId); if(!ignoreId && !right.Equals(RightType.CREATE) && job.Id == null) { @@ -586,7 +586,7 @@ private void checkJob(Job job, RightType right, string zone = null, Boolean igno } } - private string checkJobs(IList jobs, RightType right, string zone = null) + private string checkJobs(IList jobs, RightType right, string zoneId = null) { if (jobs == null || jobs.Count == 0) { @@ -596,7 +596,7 @@ private string checkJobs(IList jobs, RightType right, string zone = null) string name = null; foreach (Job job in jobs) { - checkJob(job, right, zone); + checkJob(job, right, zoneId); if (StringUtils.IsEmpty(name)) { diff --git a/Code/Sif3Framework/Sif.Framework/Consumers/IConsumer.cs b/Code/Sif3Framework/Sif.Framework/Consumers/IConsumer.cs index c55b49bc..083f2385 100644 --- a/Code/Sif3Framework/Sif.Framework/Consumers/IConsumer.cs +++ b/Code/Sif3Framework/Sif.Framework/Consumers/IConsumer.cs @@ -48,40 +48,40 @@ public interface IConsumer : IPayloadSerialisab /// Retrieve the current Changes Since marker. /// HEAD /StudentPersonals /// - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Changes Since marker. - string GetChangesSinceMarker(string zone = null, string context = null); + string GetChangesSinceMarker(string zoneId = null, string contextId = null); /// /// Create a single object. /// POST /StudentPersonals/StudentPersonal /// /// Object to create. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Created object. - TSingle Create(TSingle obj, string zone = null, string context = null); + TSingle Create(TSingle obj, string zoneId = null, string contextId = null); /// /// Create multiple objects. /// POST /StudentPersonals /// /// Object (multiple object entity) to create. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Response containing status of each object created. - MultipleCreateResponse Create(TMultiple obj, string zone = null, string context = null); + MultipleCreateResponse Create(TMultiple obj, string zoneId = null, string contextId = null); /// /// Retrieve a single object. /// GET /StudentPersonals/{id} /// /// SIF identifier of the object. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Retrieved object. - TSingle Query(TPrimaryKey refId, string zone = null, string context = null); + TSingle Query(TPrimaryKey refId, string zoneId = null, string contextId = null); /// /// Retrieve all objects. @@ -89,10 +89,10 @@ public interface IConsumer : IPayloadSerialisab /// /// Current paging index. /// Page size. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Retrieved objects. - TMultiple Query(uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null); + TMultiple Query(uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null); /// /// Retrieve multiple objects using Query by Example. @@ -101,10 +101,10 @@ public interface IConsumer : IPayloadSerialisab /// Example object. /// Current paging index. /// Page size. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Retrieved objects. - TMultiple QueryByExample(TSingle obj, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null); + TMultiple QueryByExample(TSingle obj, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null); /// /// Retrieve multiple objects using Service Paths. @@ -115,10 +115,10 @@ public interface IConsumer : IPayloadSerialisab /// Service Path conditions. /// Current paging index. /// Page size. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Retrieved objects. - TMultiple QueryByServicePath(IEnumerable conditions, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null); + TMultiple QueryByServicePath(IEnumerable conditions, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null); /// /// Retrieve multiple objects based on the Changes Since marker. @@ -128,48 +128,48 @@ public interface IConsumer : IPayloadSerialisab /// Next Changes Since marker. /// Current paging index. /// Page size. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Retrieved objects. - TMultiple QueryChangesSince(string changesSinceMarker, out string nextChangesSinceMarker, uint? navigationPage = null, uint? navigationPageSize = null, string zone = null, string context = null); + TMultiple QueryChangesSince(string changesSinceMarker, out string nextChangesSinceMarker, uint? navigationPage = null, uint? navigationPageSize = null, string zoneId = null, string contextId = null); /// /// Update a single object. /// PUT /StudentPersonals/{id} /// /// Object to update. - /// Zone associated with the request. - /// Zone context. - void Update(TSingle obj, string zone = null, string context = null); + /// Zone associated with the request. + /// Zone context. + void Update(TSingle obj, string zoneId = null, string contextId = null); /// /// Update multiple objects. /// PUT /StudentPersonals /// /// Object (multiple object entity) to update. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Response containing status of each object updated. - MultipleUpdateResponse Update(TMultiple obj, string zone = null, string context = null); + MultipleUpdateResponse Update(TMultiple obj, string zoneId = null, string contextId = null); /// /// Delete a single object. /// DELETE /StudentPersonals/{id} /// /// SIF identifier of the object. - /// Zone associated with the request. - /// Zone context. - void Delete(TPrimaryKey refId, string zone = null, string context = null); + /// Zone associated with the request. + /// Zone context. + void Delete(TPrimaryKey refId, string zoneId = null, string contextId = null); /// /// Delete multiple objects. /// PUT /StudentPersonals (methodOverride: DELETE) /// /// SIF identifiers of the objects. - /// Zone associated with the request. - /// Zone context. + /// Zone associated with the request. + /// Zone context. /// Response containing status of each object deleted. - MultipleDeleteResponse Delete(IEnumerable refIds, string zone = null, string context = null); + MultipleDeleteResponse Delete(IEnumerable refIds, string zoneId = null, string contextId = null); } diff --git a/Code/Sif3Framework/Sif.Framework/Utils/EnvironmentUtils.cs b/Code/Sif3Framework/Sif.Framework/Utils/EnvironmentUtils.cs index 3eabc532..3c896244 100644 --- a/Code/Sif3Framework/Sif.Framework/Utils/EnvironmentUtils.cs +++ b/Code/Sif3Framework/Sif.Framework/Utils/EnvironmentUtils.cs @@ -1,5 +1,5 @@ /* - * Copyright 2015 Systemic Pty Ltd + * Copyright 2017 Systemic Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ internal static Environment LoadFromSettings(IFrameworkSettings settings) merged.ApplicationInfo = new ApplicationInfo(); } - if (String.IsNullOrWhiteSpace(settings.ApplicationKey)) + if (string.IsNullOrWhiteSpace(settings.ApplicationKey)) { throw new ConfigurationErrorsException("An applicationKey must be defined in the Provider Environment template."); } @@ -53,22 +53,22 @@ internal static Environment LoadFromSettings(IFrameworkSettings settings) merged.ApplicationInfo.ApplicationKey = settings.ApplicationKey; } - if (!String.IsNullOrWhiteSpace(settings.AuthenticationMethod)) + if (!string.IsNullOrWhiteSpace(settings.AuthenticationMethod)) { merged.AuthenticationMethod = settings.AuthenticationMethod; } - if (!String.IsNullOrWhiteSpace(settings.ConsumerName)) + if (!string.IsNullOrWhiteSpace(settings.ConsumerName)) { merged.ConsumerName = settings.ConsumerName; } - if (!String.IsNullOrWhiteSpace(settings.DataModelNamespace)) + if (!string.IsNullOrWhiteSpace(settings.DataModelNamespace)) { merged.ApplicationInfo.DataModelNamespace = settings.DataModelNamespace; } - if (!String.IsNullOrWhiteSpace(settings.SupportedInfrastructureVersion)) + if (!string.IsNullOrWhiteSpace(settings.SupportedInfrastructureVersion)) { merged.ApplicationInfo.SupportedInfrastructureVersion = settings.SupportedInfrastructureVersion; } @@ -102,32 +102,32 @@ internal static Environment MergeWithSettings(Environment environment, IFramewor merged.ApplicationInfo = new ApplicationInfo(); } - if (String.IsNullOrWhiteSpace(merged.ApplicationInfo.ApplicationKey) && settings.ApplicationKey != null) + if (string.IsNullOrWhiteSpace(merged.ApplicationInfo.ApplicationKey) && settings.ApplicationKey != null) { merged.ApplicationInfo.ApplicationKey = settings.ApplicationKey; } - if (String.IsNullOrWhiteSpace(merged.ApplicationInfo.ApplicationKey)) + if (string.IsNullOrWhiteSpace(merged.ApplicationInfo.ApplicationKey)) { throw new ArgumentException("An applicationKey must either be provided or defined in the Consumer Environment template.", "applicationKey"); } - if (String.IsNullOrWhiteSpace(merged.AuthenticationMethod) && settings.AuthenticationMethod != null) + if (string.IsNullOrWhiteSpace(merged.AuthenticationMethod) && settings.AuthenticationMethod != null) { merged.AuthenticationMethod = settings.AuthenticationMethod; } - if (String.IsNullOrWhiteSpace(merged.ConsumerName) && settings.ConsumerName != null) + if (string.IsNullOrWhiteSpace(merged.ConsumerName) && settings.ConsumerName != null) { merged.ConsumerName = settings.ConsumerName; } - if (String.IsNullOrWhiteSpace(merged.ApplicationInfo.DataModelNamespace) && settings.DataModelNamespace != null) + if (string.IsNullOrWhiteSpace(merged.ApplicationInfo.DataModelNamespace) && settings.DataModelNamespace != null) { merged.ApplicationInfo.DataModelNamespace = settings.DataModelNamespace; } - if (String.IsNullOrWhiteSpace(merged.ApplicationInfo.SupportedInfrastructureVersion) && settings.SupportedInfrastructureVersion != null) + if (string.IsNullOrWhiteSpace(merged.ApplicationInfo.SupportedInfrastructureVersion) && settings.SupportedInfrastructureVersion != null) { merged.ApplicationInfo.SupportedInfrastructureVersion = settings.SupportedInfrastructureVersion; } @@ -175,12 +175,12 @@ internal static string ParseServiceUrl(Environment environment, ServiceType serv return environment.InfrastructureServices[name].Value; } - public static ProvisionedZone GetTargetZone(Environment environment, string zone = null) + public static ProvisionedZone GetTargetZone(Environment environment, string zoneId = null) { // Return the requested zone - if (StringUtils.NotEmpty(zone)) + if (StringUtils.NotEmpty(zoneId)) { - return environment.ProvisionedZones[zone]; + return environment.ProvisionedZones[zoneId]; } // No zone, so try getting the default zone diff --git a/Code/Sif3Framework/Sif.Framework/Utils/HttpUtils.cs b/Code/Sif3Framework/Sif.Framework/Utils/HttpUtils.cs index 8e87f553..0090c28c 100644 --- a/Code/Sif3Framework/Sif.Framework/Utils/HttpUtils.cs +++ b/Code/Sif3Framework/Sif.Framework/Utils/HttpUtils.cs @@ -629,21 +629,21 @@ public static string GetAccept(HttpRequestMessage Request) /// /// Build up a string of Matrix Parameters based upon the passed parameters. /// - /// Zone associated with a request. - /// Zone context. + /// Zone associated with a request. + /// Zone context. /// String of Matrix Parameters. - public static string MatrixParameters(string zone = null, string context = null) + public static string MatrixParameters(string zoneId = null, string contextId = null) { string matrixParameters = ""; - if (!string.IsNullOrWhiteSpace(zone)) + if (!string.IsNullOrWhiteSpace(zoneId)) { - matrixParameters += ";zoneId=" + zone.Trim(); + matrixParameters += ";zoneId=" + zoneId.Trim(); } - if (!string.IsNullOrWhiteSpace(context)) + if (!string.IsNullOrWhiteSpace(contextId)) { - matrixParameters += ";contextId=" + context.Trim(); + matrixParameters += ";contextId=" + contextId.Trim(); } return matrixParameters; diff --git a/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Au.Consumer/ConsumerApp.cs b/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Au.Consumer/ConsumerApp.cs index 1329e9c0..45f88b9a 100644 --- a/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Au.Consumer/ConsumerApp.cs +++ b/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Au.Consumer/ConsumerApp.cs @@ -142,7 +142,7 @@ void RunStudentPersonalConsumer() // Retrieve all students from zone "Gov" and context "Curr". if (log.IsInfoEnabled) log.Info("*** Retrieve all students from zone \"Gov\" and context \"Curr\"."); - IEnumerable students = studentPersonalConsumer.Query(zone: "Gov", context: "Curr"); + IEnumerable students = studentPersonalConsumer.Query(zoneId: "Gov", contextId: "Curr"); foreach (StudentPersonal student in students) { diff --git a/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Uk.Consumer/ConsumerApp.cs b/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Uk.Consumer/ConsumerApp.cs index 0307f1af..43caa907 100644 --- a/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Uk.Consumer/ConsumerApp.cs +++ b/Code/Sif3FrameworkDemo/Sif.Framework.Demo.Uk.Consumer/ConsumerApp.cs @@ -206,7 +206,7 @@ void RunLearnerPersonalConsumer() // Retrieve all learners from zone "Gov" and context "Curr". if (log.IsInfoEnabled) log.Info("*** Retrieve all learners from zone \"Gov\" and context \"Curr\"."); - IEnumerable learners = learnerPersonalConsumer.Query(zone: "Gov", context: "Curr"); + IEnumerable learners = learnerPersonalConsumer.Query(zoneId: "Gov", contextId: "Curr"); foreach (LearnerPersonal learner in learners) { diff --git a/Data/Databases/SQLite/SifFrameworkDatabase.db b/Data/Databases/SQLite/SifFrameworkDatabase.db index 1e06032324ca9e39b6efbec8b6bed8859989cee1..48dfe78bcbb115270e28091fea01c327370a266c 100644 GIT binary patch delta 17814 zcmeHPdwkTzwf~)&O?H#)ZuXTIN!SDe0!heg6JCmhBuK~-LLeY0Dg+QJF9~|BXn$l0 zx$PA}P4$P0wY6#$szoD2+g>WDt+uz1PYXWUULV+2t0xNGV;{^i(Y*7BuQZ5=(&`bT&cFI=~9f*DQ{cQ=aL#+NM|*`S@LIW&O0zUy!KD0%V)HxwV=-@JSK zowFLJTsn1nZQZP?wUyO1#9zN;| z+)#h%eEiqZ(>x)Z>qtSSfCKAmTUx@6b+xmx#ifnSQ)cj<-4jMYcJIp*hTA-{lWV#4 zLF9#8-_n0nvXfDxtNWK{C1Lp`{mU~smQU$lp24tuG^8Zz9>C%(aLD31@a!tSDB+O#QR?rC5Bqy=P)ak@#|D&rKZ}p{k0p zp%*qYmI zAeu89&TNX94>voc@pt%3{Fxs2=FB{J`X7H#y>7^a!8!SDE%mjt8(JHtHPp>+sMj<| zHOg;gS%LSm@@KX+w9dm_3HL2gqrGB0@&gED{5&VWz9HNY%cSiwZoUuvBksw{udScn z*c=t7ZS4=Ct(OqSq5Gi0xcxpzbNl1?`d-b1Lg9Z)US#6;1z;!P8A!B%-4ZU|NRz-mvuzA6S3eRVuq)|4q;U5n>0Tsqz)sRV zNI1bRrT0$1yU*bOj=ShVz5`YH4o@jA9!J|?&ucq_&XIUTF$;QM+c|VuL9uqNhJSC= zzN78NW6{gn-ysF^pd9MqLRbl#44;FIuV4?d2N6jA@uG}an@Xh7#(d1ET@U`ApKcBG zJi67-{7F5>ZuIwbZO!hva;rbXi?$ytL2#rPonHa}$W)tV+L>vvzBExrs+(ngrxf_N zE!jPXw)l;?E|zJ$^bGio{m(##ktN7&&p^P~@C;;gUxXWvv|!~^PL^TRV>2vDHfon+ zgDxiv7#y4Oj7W;HZw_P{FFcLq`=7>L#VPy5A}-YyD}3Hay488w9gLZ$VGv66N|4Nm zPt?o#Fn14M#4pFgcwr}^J-HKm_xvddnMII0P9fIjoy=iefh{Use2X?p`#{q^fFuaO zP^f}hm<5Yq4d}21z6IZhz3@x;1H1(vu@siYMjE3IL$Q98$9(W?8~ZV54}bC!%>yiF zB)gr~p|i~fEX$*vl%00XK`O_iouc*SnoHzqngI8ONalJ#Qw!5MPx1nwN$9QfJoAwZ zqI7FfyDpOapB2U#AVB9zpNmDGypTrvED#;=f>Y^p36Un#O_s4?V`C4as-s#>{={peK1I2Eg>>jVJ$^6*9Unf*5$-Z?_LUqIa0I_!rP=*=O|Gfgu@D~Q!l21cNAP_3DUVic-O@1EF}R)NV(3@NCty& zG>X_+Mk0=xkmZ7-06tQX6{5NTJ~kmMi9R6_^#*rm6&BA3*b}? zWDUtUZ9Sv!oRHsl`I@=G>v58kfdgjEF6;6h$;&=Up=OUiAel!Xs9v6O`u5tg#>VNon);lmY{Y2ojYUZ#b=ufQw|Kd#_R3;&ymXIl8* z3DC6g52A>sg@0&5l7%x(L6U_tFd@mp8Iy=n3uoMdBnxLY1xXgpl42mq!dbEjsVv;B zAeDuun~=)FJ*JY%!oB@0+@~Owh5KV5m4ycg63ve+{9OrYS>q9cwCJM*i8NXGF{LCH zNDJ55dlC|9vhepUNK3|Xf=uN(+DPqB8vZ@1orF}#h9U^zdwe>~hs)tA=!Bc`O}+#A z(7E|7ybSNc3Fcs#tcX>yNo*#&l&xUbvad6P-OF~fr`T`U%S=DaPH+d$;YZH+d64(< zXZQhhH{Qc;sXwkX8)Sh;4nUjJ207p%?dK3ds?T-VAQwDJ?+b}X>O3#q26`~&RX88{ zJ_DJFBC%gIf)`2QUfJP`Wgopd^>_hM)ZHAM@FjifJ< z4QT^umlZw|zL*FSzC;T5Dd9_XVv^D?m(qQf^ku|H(w8HV#e%fj9z-EIEU4Dn4x-db z+v&#fWUw0(lidf~+)J z{TD27vr<+422w6In)>jjtQxHb^RGl5GN4-iEIsA~u1EESsr z_`IB@V(R=0a+ZptoqrMPaZJi+OpYMoW@Sq3QKHnm978Idm6=lCBR-P)J`!G5CZ*~! zW^f#Pyq1-zf&Uv)i&;5={2d85D_0=s0SQWhe27#!D>p$tLej;`3FKoWyv&LjG-xM? zRbhN0)vT!1MNCIKDTky&ft(^rft;4(Q=vdWBSr}VAjhY|8XsW9s>Yqmwv|#5u*s@Q z!hj^A>U9}zf@BF&X@b~^kw6?0q%sPULc9tjRkp1nkThAPLMq@SiWC8t#Hcbc+>%eP zB9L?mQWXX95U&Ek00We;5P^u$gPVnvCL%0>lmZbEi*yz;K}0~q#X^K3LLFWfieg|K zL>IgYB%5!?#?=IpgM^z^E094%DUe*G(wP}mf;{3QkbES(tU3xZm{=7?5c{y0)euGj zhF%b)Mu8M!9a0Kp2vX^+#?)jek}gJJEhs|5%W9$^!-!RZ40o{|XyUUq!+lto_}Ah- zF&=rWcOL&;+mP@<0Q%#JFyX#b@N^5_83EzoRB*Q(19wD2GPi=eWastz23Myp{F@5y zB;{P4Un4q=RCjh>PXbcqz_>cE6V>IMkwTu%^+*THIY>zChj53=*(s8Sv^X4ytbi5^5+x+8X^b1QkS($X1m5PzN=bx$M($zUbVx8}taNyQ=^ zWe%o+bVl&Fz_P0Na0Q7r$a1RqIVL0;ouEgUkZ7_jw~CLnAn}MH_(v&7v|1Ld;?W)2 z74edY5<*0~)#o5fh?DWExeIY+Sr)C9JLwrp9T!#2q38|(s#K&1$S|Y|1B!;TQ z>{s*2Qc1kZlgp)=*O8W3FQ&el*OQh=3&?8Tpdc*)QzRskV)az>3oJ-W#8gvDd77`` zEfP}osD{rJh;1^sEFf!mYut*h;j`kktl_g`wXET77NjL}4nf|w0#>q3U%{Ybz$o3q z3XS#iSc)-s3o9^+n;^y5u!Rjxvx1YG+GWH2Ti7(C=_N>En=Uc-t;Wz|=~kAOtfGb! zx3YH0%r?!X+WlMEMDE)(tEY3b-`E&J*~HvJ)lY|5lf=cK>?6A{oLN%MoCIH6&Dwiz z*qmZKRBdrhCa!m@*~lR-23nSeCzZEBgA6E!^IHKI6R`lQ3pvujsi=o2A> zd%N7mu?v~sxMMy`Gn&@p$ac+V0q*be8vEvASa$w=tgM~SvTeSufXz7eF!=jc4MT;D z+c?H{Bb;Guw>!z$cP++EF~oZF;NZOdkSzcFAh|I?LKmE{#@=0gB?KdBScbZOh&@TV8E`J^bTwcj&KaN8kKt0Nw$L;>CHx z=}O$SPq=?E);^|o$FlY%ZT8n*9)NX#B9f+?L+19bcq)US8_q@n&5iQ=$(B<}v}@`gQIG`so!TkrVl zpHD14`p?CkNm|jPcZH9w{@J9>(?-1Hdh-?!hb)H#`6ad;_k7Rd5;1#B?5n>G9^N z7=8`;wJ=;p0%K!aGEitnzGM(F8WocVNGoJU6dmfJkocr80R^(ET44kwh8d*OCpW-g z*|=IBx*%VIMB{tJORhWQ5~V-}5g&o%$SNzGC_!Swjk2v7jFcEMP^se)2Qr9Pfdq(B zAbu%{0@f6-mep3gTFN!!)w0TpR}-b84j)R)XuO*EX6hmtQTtee#0IR1S4B9?fc57P zuhyALw1cw;c}0@6n~8yCTCy@VSPo7^x>ROvI;S!>G{puQ)9?~3@izY~*Cb!0KG z2HX*R*Th~OxFTrCF?S2D2wHi}-9x{t32}81y}20Rb|c~b!yRc(xFAWqL2)JAu=Klt ziNBxOb0OZZ8gMSVc-R%%+NjT^vF9<5CMTa>&J<$zMSKxs!zs-4t=-8oxIdCd(c$c! z7#%*ngNc;ipv=ZKUf6+Q;iq^mRRY&Tvhg{Ey>Yo+)a%?DY&QF~ByW8+mu=W@vK zTy2HGsk_F>0}K;{H(oVjanR|V*Hk2_jFMc&wiXy_ zeEcw^!CYh44{*Wmf15S-rLBVx>IQ#^QHpt-t!K~iEOg+$r_GD`T!=^ev3fYHd>i;I ze4Co^Nae(yrE{Yvgg@e4rD_hZ@Lt#`9nVjy7CTROe%O3t{+%^@e)Purf9Nj7dP@ne z9SW?IGL+UVrJ0%ztf+o=L8tQYFg35gy8Y-|?u8Fe>bvXVRZYD&{`~A! zjcQsE9DSMVKbG6>ItLD>)s|=r`#NBe+-ZwWl2f{ZGYJ`eUM&0$# zrHR-?!WyXxk5J;+&KvJfD&1Re-2Rj8>-O#)AU4rIN|Y!qgxe!UItH|_vVSo)vFFDC zQw?<1R~gw%UG5qyn7UMExYzCDEX#P9vD9SsD%s2M)>vK(cROTlhTYmE%`MR1ohwOVv80suWV|6g$L%R0%Lc6{I={7sWuT1ejrj7)^jF zl~b$cF2v1TPMXUQFN>SY5VyiKl*|<36%rEpMK(%^M-%cakt*NP%3qlv5u*t(=h9-c zvRBR{NTewNW}?#45^%nRM3NFDb=-t505VsIuN9i*p~#55%_85koy%~5n)Z(Ji6{VcKQS$C^^o!Yu*+BErF-=sAIx3EipeQmr73@&nEr+a)fX%NYA39tZGP!Po_tuFfgs3+HaV@cy`P5IdRJxji9ui-;|T zNS5uExhv<+?$LO_-8p{R;=GyD7EPP5E&o_KWVpsUtqrgn~cJy=;fbn5U? zMMElw7ZvvET|BG0c1Uea{o?9bb>j-Fsz>FIshU2a-{2X;i+YcqS9=zZ#xjBUo{8_b zCoDQ45)cXz6-CL%nK+Kc`A8(WMNU*prJMSC!|oOyk%^`Hh&TSwKPCl4CUf#JrNf4g z<@sU?8v+%>iz-XnH)am-czIHo$c2hAqsNz4mX0njDV{nR|8+E$4=D3TMM)!fq{xjb zs;DR{9a1zFvrH{5A3D16@d2H|x&8eC9UbxEqK=7U;&ri8+$*jTb*OxSFg)Ro9B9=L z&TvmyTj?=j9!Fd0(O8wX(xZ4X$Mja!k4y$kj(qi^?B*R1A=@roEM?+z@s@Z-JS1)u zOR=D{u%K=6hljVB9EQbgqgKMvW-=Gaj-1xcz>^#~k#@-=Eg#u7+~J7i;z=gn6Hj8% zHj1%XvW}fvcCkY`p!A{1wKcN}vt)%^d;tO#IbG{;a zByvX-bmCS%RsIBUL`8LKnxu>SE)!phchT@QQIhD0>I6;m6!HX2vK1v$fs1>X6P{z@ z4Y5tE64OP05d+WhBYZc%jo0xZNOd1XoEs6wB7+?oi|YNoX4PCgx30FPdREP%`n-bK z{igNqGh+8Ke^LrQc$*Z4Lck$dAv+4s;4hBVh&Z0#N`sd|U)y|k!HK(?IQU6{l z*R%z5J4ZTL)Hqp;MqYoPLnb$_ug_9Hw!c>2%jtATU-%Ne;YH;S4~q-q9fCD$s=|2D zBBdanw@4|BhZZRXF04nSc$tas#NWjUaa0@;hq2XO#uj=^l!ZkK07qn41b&H#uyFYm z9u_9Q!onQ*#T^d39D#6f{Fe*Rm!?SZf@J&#`}-5|XB=j)h!>D?lPHaFfMkqR-y$M{ zzQe=mJ1k6nBWpOi2MD3QIO3?Ns4y%li0|-UHbs2b7`w_-%3tHV_(QyrFXOX$B_G6d zcnWvG2{;JP!&bNheh-Ua8k9mW$bwk*Z}tg$o$X`~vPNdG`I1TfCFYtZUjaAdm<#c% zb2kU`rWF;BDlH#VGNNS2*plMJt`6o)8&^?WG`7S_^K>ykOagCGXPNulaV29W;gu0D zo+ZWZPUhB^AqhGXYX@R&-Vp;q`uy{W>&v+l>xKQY1et zuX%qEt3|aa6UT$PXhB1GxuefAr(YUg)m5Ub7#F1JttFFGbW?EJK=)tm| zy5e~DpVcBy<%~JCwN)iGb+uJhYIIZHv~bLuZRb^)N^54138}ivZIX=YtzPx9-@QriYWeXevH3|V`UHD&L7~n@GJQe zKA%tFqjALa;8{G0N5H?}b9fJ4gJ)n1+y^(q?_dechsjU|=Rg5uqdP~ie;{!}>H@>r z7e}!#vM&vYxITyik$o!14XzwArgU&gOm9r^M)p>N!qp3bKeCsaR}_~xdn(hO#U*7W zV@sSp6zVZ#ObL#xm_lV&sD_@iK%R;y&>H!O0ulL2!%!l5GIK;8iF8NckLYfR9juz>r?7ERiS9vPDs}|{kC=lKyRFTdyZ+K_Y=!C!@-l<}YfionmNk?VdQHyj? zsDl=1uMFFhNVYr`maRpy5Cy`rLL!+mZ&)UYWFYW|WmpvnDARz}NLMJ`&?0HdkgilQ zsS-F+m13M9LBQd+HC*j5!S85i(fSbj9O(V36H*jPq4GJs3VF4L2a(s|QH6_1mOvz* zPa;W(0wO6S;>HBOa9bjY2z??^izFzNphe;piq|4>h`b_Bi8Kzn{dv(BG8!Y+1;&V8 z!Y^E6Fh3lY^1gHW%$VN3wp*j&krPZ;ttlS zpPY#{9@!9x?t}|Mg4>U5$etr|+5E89&YxzmYx2Grk&Qm z;AUyu=Z6Q$@esyxuOA*z&di@>Z*yNexWgbHMZBK}+QB;8y)or+?rjIRD_2GI5cju( z+qAnQHl_Wo4!u3!Q_oYCPptzY~f2F{3yKI<(-IW4Vc0|}+DX>h-A;#`X zfh(vq2(i0T;BqP}LhP;-xJ*?<^fOo-_j#e-l9q1hg*sacy&2um3ky}@5uqD;VS&~{ zjBe&?(n5%C=!I&fg$Uiy1G8)?td?gS%xtQK_42?BOAG7ef$1SFtd|F- z*;-gH4_s(#VZA&sRcYO{vGBh?us4yiHLy1-WgJRsVBg z)wY%z*f%OIYhWK%$Qs!1QdVnVzehy&!2YuqvIh41su?KMIks8>SXf4EQU|&pH2-Uz|Oj-!lz+R-Z5UGJ( zWlPC{ZNU7dT54d=v$WK}o*U9q1AC6Gr3Uszww4;$vz1mf>|-AGD8v7DVf_Cs_7`@7 z{RmD-feugzgK%McKFo#1u)=^FFjBN0p2B$5f8oRK!Dtix;XKsGQ+45kgocbUL_QpW z;e%LWFIDWZntcQrDfW?yJ=SI~BNAdCr834T_HuP1j@U;NAo2=D9;eCAB^ya@Od6xu z<81ayvLp7f7_jaR9>qQm+tCFcVjoX{*e4)}1&?N*h{y@FYMq3?{Ah;jcS++@pn9UZT4woM(op3Y6_$%@)=4tg^E6t z0FfKB5XC}@W}l4+y;QMZgumk<#b%#FcEm0pS2@9_*ypJeK4O=FO&93ZeHDUO@M-dD zvQgwU_&Xkam4+3!sUQK7;%^tUBlbE1RQ7rVv0%j&7Lko&UyQ%wp`Bgy zi^+`0FF~a#;8)~J3?=I)_N4@f{Za(6;MZlp43QK3iv4o@9S@-Z#}#Bo?8}sIQ7FW4 zK^04c2@EFiwR|Jr!{6q|1rsSER}_iyV!jBPIr-3~!Vsp|D0XA4`ZHFoKSxe`ND|2nea)h!;Bhz2t#xkM2gy6|vXu+wL22+@HMoC{!yJ!{W>GbGJOgAnwt4vy z8wQd%M=obV!`XIN)_kQ3GR)moD6z2$Jm#%cSi}_wu^l5=8oP>#`^6fuQq+r?;#_RO zLXjmB1@OP|4=}*E8^beq^BeebUd^Ylf3lP?87-p=2hvLJ*jc zrzki{A`U1F)K7@xls!`;1b)xr4LqL#|D;-qZR|~y%z$t0T4K^3G|7N}C`p9dP%;Dl zu4{=2_b7^QND}dCg})|A#6e~MHzkR%4o?T*Gp%TBQ?(4hv8Ix;mH{|wNy=IV;M0(# ztYrZHYD>ym2H+E0Qr0p6A1g^$5aWm3mk#e)U5Noi9!Q6Gr6R^WasA^AVi=Ko)8Vl0 zON=9Oe>xnp`x5UYlH(n#FJlQGBuS^d=}P;zwItqXxGxP}wIuP%!2@aVid{)(Fj`uq z8St`}j6&>BgO_Z{NaA?Wl8hkyM@uqX5x@a0875Ds!fs2_fjE!~&o+@1(jpa}(Tey) z3s=9X@CREGh~sHXk`dmeB@MFQsT6V0l*{PCHWEa54iETYtF4DAxia3cMadxwaK9fO z)nbTo-RC!8Gl@mRe%6_pj6K1gXK%0%*-164Y6qR64-~^Vm;no58LWca;bC}+e~s7L zSdl8aiN5$iX98X|>cnz!gIFgviCyA=cw2ldzQ*f=`5!(;(+sQF)oc~^qz`-7&)ch# zO32&mI{pFuBEZ{+s`#`zZBM~F0XIH6n z`s&JlM~K>qU9CjYERo-n9f@3{MAAYc*OIB$Sf%o&Q}wGv4WiQGh{S_CJhki!EcvIe_3mIt)P&4jeZEz$)H91S$@`v_@~`w_+QOsgUfAarqh@Pf~TWkoVW8V`}F)-WDcO`Am`>s3o;X^}?= zX^{=8OR_AHjbukP*`&H8^z4UiCQ~i)sLGp78e7z$YV+* zJ5-a$$yAFxq4LtBDYiqMYOh6}B&0Q-QW`Y6ij5MslMG2@*DqgRoss30@slgF|G2(7 zBg-q}^w(EsWO-%4X|J!&$nr|gzfN;~bw-v~hJLnu8tbbwvb@6jY^~H=PT}-@n0pzzAJVX+rQD&j$>gp){Ki z{KoSELrxF$jX_Nae&hLo(Q-oY8_x&u{?~j$@EgwujB?g|Lhu{U2L@q?ve|^7<$S=! zFJobFBjA7U^BkP#Z=(+kX5ZlCY9emD=xdZEN908H=+OoC+_+^ z;7^751$}b!d*l}O%P1)5-!s2|VV^dV%4-*8Ok1#^YVM3_)2n8smnCVoF%?B0^_Y9} z@Ll=q{(4TI&#r63R3#bB6`IqfmAN%t&Z51eoY$Bm8m6}YVc+VKyq}``IkwcYM9mgn zGOzrbsJ(->T|3iw=Fp#V4xbL4zbsnQJ$}gfbZY#%vg=+Qx$g?G_}W%%1%2B{qN*BJ z)49rGG~Ia<`VX&Ib7at_c~>SMc}T1?EqBhYDQmZR zKnqhNzyHsa&MI6S-mus)=_agWN#*66$2XMSaZ_y25#<})g6|i(2@_s6O0hj{+?&(z z&ik9n*KeEiL1Ovj6Q@Oog(JEq9s3LW73*Kvr+M3*VW<1~5z*(@4X`wqNMaeRikay- zP-G5S!#(EIHQZ%xp2(-E&?aA*Y3|9xIAQ)IKGMAG6^JrdPU0En$U_jtSGJ>bFQ{{q zcr*qTPfp}+v-@Noqs-00lX-TG6*YCQOfa`jR%{m2Hkex;g=Fu|t>U(LZaFhoKY+V_ z=bKy0x!W@V^U(aJiTz;3?!??(Eq3#s0X+Txx^QT+S~S|>P#4w24u?AJ>5Cl>jZq6Z zI~*FV*OGQPG>Y!_b~rSWCcmL@DD6nI!lCdZNn-3$g+t*7TN0CGpfD3oDM^GX917oS zNlcJ|!c6#%BoV7{DEylw5z9bfCj3iPG87IyNs<_>q;Tk0wj?G|IP`>)L`dP#FSR5l zP&o7pl0;15(BmYDn8Kl-D@lYD4*iQ(w8NnvHIbyDjd3A z$stnV(1*1cVhV>oq{UzjhC^2{@i%+evA>q$|j3%dJFO$8V$aY%o zajERZMD~;};ZlN6>eg6-(3{A1Q2SpZPbRQOb@N}0Fp$7D+pXbTEVC!DP1N{{5cw0> zM#IvoC;JUrtB&9!T5BO0uP3bq@?<=_M{Ct048*g$Ls~U5dpx^~w5k#Lu9O?i@qL*1pY$pU_uV^B~)`K_pa?6|6fj{=Lkj!;xda12q zAX;jREJV8{mc~r*xh}CajPVd~UEEZp1iY@rmPlXlyB38+x}a^nE#gO1XN%wiZ`VR4 z;>68m;Bzh@kvQC>0s&{Otr0T@6THqErD3>mhYR?f)mp?^p=_&2#5r1_`6Lokt_1m94`E zp>>$O#a{wG+p^{u)(pfQj90JL@L-&Jw}uB}&4rV2vVzaCFt4htl{YcyG>d)&HxI^` zd)@(Wa63hbm($*q+`KX>u>r@fMLI*Q@ zJP7M)2Dv8&XRhBp2%VoO!*|b&0L)`B50=9k*obcmyak`ZkN6U47hc52^LgCBHw_-a zHx1tApYtC@lISAN5tX=6U^zbcUXL$~zA28{I|Qtq0@io)KILoh!meKqvs#U>na_?f zzx7-wl#CD4T5c{t`)BNj_f2xHZ`t>lQBHBm6`N#SuBNZ^@${V5$-hF;|soyA$` zRTl{ZUqiM&$A$edEBf*jzk3DW3m&^?t>(f+P(3@B??q>7>0x_uw_9rm+lvdNRt~n8 zJ<{62_M$VjxVUh+0mYfHqLbZCX89>dGmB0^vT(2Hsyf8GLcKYuE~{2iJ?@5L>aAOk zVb3f-1}V62Wth3O0^FX4;WnM+w22L+Ce-0otYHN8OUg0q7jaDOj~S)=wZH84+D0DSHX884aa^A{)@f&4(=n`C~g&3iiP5Q zoBCyJ-e0m`?&n}78wC?V*VcoYl zc=(R+MezNQRK_CUeJ0~?{8D}Z-&6 z+}y~pfhSKV5|Ul!(`;8?y=Uu@!!>1hJn>?myAE&t-A}RoZ2T9BEu&e>8K>WLR?Gcbmuu!DMvLHE))^iTZ8}{OpG*Jw@V0sKC2;R> zJPoIY`NeS-CAu=4Y&P0gdshJ3uZb)lJ4!$j_t(X*r-Uq$eQ_L=z8CAu;3mH1G+hL^2P;tpKA zE)z9kiYONYL^o865{4^ymRxPM=Ur%y5g#0gIMAMVwrADO-~hP-YtK8W8$fKZKSFD z7aQ>&CBvQO=k*YW8%9s>E;gub^0RTW+2Xb@&SuH>{J^^Jh_lV*{n5M5Hj4`J28?;+ zL{RmBb<@Hu&-Uluo@Cy9TB`FmTe~#XF)JqVbaTigdH-FRVc+%4I1DU15?5yF`|n=6 zAzbDSh3MY5J^(RhZXxvC@zMa^&yoJC+&aI7Tj#ZQ>+a3nI=7`;=U6_b-MSks8f~}k zs%mVzbyiEa4sAWM-8!SWTU$G@Y`50Cz+6G?)^a1-j#ERpBhtkG??p9ls8FjR^SPtA zsaI}A<_)9FJ+%FE+?M=}YjCTgc=N^3ixy;BhVsWA=XKsODznUJ8Oz_jHI_t8)8+3D Vcw{&EmXnUA_UG+bl`a;A{SOrOUtItI diff --git a/SharedLibs/Sif.Framework 3.2.0/Sif.Framework.dll b/SharedLibs/Sif.Framework 3.2.0/Sif.Framework.dll index 3e352053e97c2223edd766361434bfd79a2583eb..d726b6415760828561705725bbb1d1aff9ac5047 100644 GIT binary patch delta 673 zcmZp8!rkzMdqM}(mnDr|Te}#mLYW?OZD$K({Kv%cm`gx_iD4)AcAiK^IWZRyml?=q zU|?j}>;{rT7K!v?U|?ccC^X0d|8rWgHdvNUOJ-!kAMIp11J=jfT1wmE|XDg`i??I z9yR2^IOPkH#uil5UllUSfQ@8>8>u4u5G9g87PPp4NZMP?hidiqxMIdbzXhIa9+cl8 z>+UhB%l^zad6(nc4f2_8lmk=Vbgt)2QUXQ)15RsgHFe(kwS9`rG^V}VO`bEI;Q|2L C&iL*deI&vYaoSv7@C{_=WXGM{(lmY3xqz%%CDT{0m zrp>4}V0WD(7sz!S@*rETPLGUd6r3(nz$iC8E}oGG#1ffaQ^3eIy#oiAiGgAIy+lSa z1BhQhc0f$L8jSGoE1(^qkOA2Q6QBOBfH8{|`{0syVSoF4!H