Xerces 3 revisions.
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / impl / Protocols20Impl.cpp
1 /*
2  *  Copyright 2001-2007 Internet2
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * Protocols20Impl.cpp
19  * 
20  * Implementation classes for SAML 2.0 Protocols schema
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "saml2/core/Protocols.h"
26
27 #include <xmltooling/AbstractComplexElement.h>
28 #include <xmltooling/AbstractSimpleElement.h>
29 #include <xmltooling/impl/AnyElement.h>
30 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
31 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
32 #include <xmltooling/util/XMLHelper.h>
33
34 #include <ctime>
35 #include <xercesc/util/XMLUniDefs.hpp>
36
37 using namespace opensaml::saml2p;
38 using namespace opensaml::saml2;
39 using namespace xmlsignature;
40 using namespace xmlencryption;
41 using namespace xmltooling;
42 using namespace std;
43 using xmlconstants::XMLSIG_NS;
44 using xmlconstants::XMLENC_NS;
45 using xmlconstants::XML_BOOL_NULL;
46 using samlconstants::SAML20_NS;
47 using samlconstants::SAML20P_NS;
48
49 #if defined (_MSC_VER)
50     #pragma warning( push )
51     #pragma warning( disable : 4250 4251 )
52 #endif
53
54 namespace opensaml {
55     namespace saml2p {
56
57         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,Artifact);
58         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,GetComplete);
59         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,NewID);
60         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,RequesterID);
61         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,SessionIndex);
62         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
63
64         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,RespondTo);
65
66         //TODO need unit test for this, using objects from another namespace
67         class SAML_DLLLOCAL ExtensionsImpl : public virtual Extensions,
68              public AbstractComplexElement,
69              public AbstractDOMCachingXMLObject,
70              public AbstractXMLObjectMarshaller,
71              public AbstractXMLObjectUnmarshaller
72         {
73         public:
74             virtual ~ExtensionsImpl() {}
75     
76             ExtensionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
77                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
78             }
79                 
80             ExtensionsImpl(const ExtensionsImpl& src)
81                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
82                 VectorOf(XMLObject) v=getUnknownXMLObjects();
83                 for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
84                     v.push_back((*i)->clone());
85             }
86             
87             IMPL_XMLOBJECT_CLONE(Extensions);
88             IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
89     
90         protected:
91             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
92                 // Unknown child.
93                 const XMLCh* nsURI=root->getNamespaceURI();
94                 if (!XMLString::equals(nsURI,SAML20P_NS) && nsURI && *nsURI) {
95                     getUnknownXMLObjects().push_back(childXMLObject);
96                     return;
97                 }
98                 
99                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
100             }
101         };
102
103         class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
104              public AbstractComplexElement,
105              public AbstractDOMCachingXMLObject,
106              public AbstractXMLObjectMarshaller,
107              public AbstractXMLObjectUnmarshaller
108         {
109             void init() {
110                 m_Value=NULL;
111                 m_StatusCode=NULL;
112                 m_children.push_back(NULL);
113                 m_pos_StatusCode=m_children.begin();
114             }
115             public:
116                 virtual ~StatusCodeImpl() {}
117
118                 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
119                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
120                 {
121                         init();
122                 }
123
124                 StatusCodeImpl(const StatusCodeImpl& src)
125                         : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
126                     init();
127                     setValue(src.getValue());
128                     if (src.getStatusCode())
129                         setStatusCode(src.getStatusCode()->cloneStatusCode());
130                 }
131
132                 IMPL_XMLOBJECT_CLONE(StatusCode);
133                 IMPL_STRING_ATTRIB(Value);
134                 IMPL_TYPED_CHILD(StatusCode);
135
136             protected:
137                 void marshallAttributes(DOMElement* domElement) const {
138                     MARSHALL_STRING_ATTRIB(Value,VALUE,NULL);
139                 }
140
141                 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
142                     PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
143                     AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
144                 }
145
146                 void processAttribute(const DOMAttr* attribute) {
147                     PROC_STRING_ATTRIB(Value,VALUE,NULL);
148                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
149                 }
150         };
151
152         //TODO need unit tests for non-SAML namespace children
153         class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
154             public AbstractComplexElement,
155             public AbstractDOMCachingXMLObject,
156             public AbstractXMLObjectMarshaller,
157             public AbstractXMLObjectUnmarshaller
158         {
159             public:
160                 virtual ~StatusDetailImpl() {}
161
162                 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
163                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
164
165                 StatusDetailImpl(const StatusDetailImpl& src)
166                         : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
167                     VectorOf(XMLObject) v=getUnknownXMLObjects();
168                     for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
169                         v.push_back((*i)->clone());
170                 }
171
172                 IMPL_XMLOBJECT_CLONE(StatusDetail);
173                 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
174
175             protected:
176                 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
177                     getUnknownXMLObjects().push_back(childXMLObject);
178                 }
179         };
180
181
182         class SAML_DLLLOCAL StatusImpl : public virtual Status,
183              public AbstractComplexElement,
184              public AbstractDOMCachingXMLObject,
185              public AbstractXMLObjectMarshaller,
186              public AbstractXMLObjectUnmarshaller
187         {
188             void init() {
189                 m_StatusCode=NULL;
190                 m_StatusMessage=NULL;
191                 m_StatusDetail=NULL;
192                 m_children.push_back(NULL);
193                 m_children.push_back(NULL);
194                 m_children.push_back(NULL);
195                 m_pos_StatusCode=m_children.begin();
196                 m_pos_StatusMessage=m_pos_StatusCode;
197                 ++m_pos_StatusMessage;
198                 m_pos_StatusDetail=m_pos_StatusMessage;
199                 ++m_pos_StatusDetail;
200             }
201         public:
202             virtual ~StatusImpl() { }
203     
204             StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
205                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
206                 init();
207             }
208                 
209             StatusImpl(const StatusImpl& src)
210                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
211                 init();
212                 if (src.getStatusCode())
213                     setStatusCode(src.getStatusCode()->cloneStatusCode());
214                 if (src.getStatusMessage())
215                     setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
216                 if (src.getStatusDetail())
217                     setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
218             }
219             
220             IMPL_XMLOBJECT_CLONE(Status);
221             IMPL_TYPED_CHILD(StatusCode);
222             IMPL_TYPED_CHILD(StatusMessage);
223             IMPL_TYPED_CHILD(StatusDetail);
224     
225         protected:
226     
227             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
228                 PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
229                 PROC_TYPED_CHILD(StatusMessage,SAML20P_NS,false);
230                 PROC_TYPED_CHILD(StatusDetail,SAML20P_NS,false);
231                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
232             }
233     
234         };
235
236
237         class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
238             public AbstractComplexElement,
239             public AbstractDOMCachingXMLObject,
240             public AbstractXMLObjectMarshaller,
241             public AbstractXMLObjectUnmarshaller
242         {
243             void init() {
244                 m_ID=NULL;
245                 m_Version=NULL;
246                 m_IssueInstant=NULL;
247                 m_Destination=NULL;
248                 m_Consent=NULL;
249                 m_Issuer=NULL;
250                 m_Signature=NULL;
251                 m_Extensions=NULL;
252                 m_children.push_back(NULL);
253                 m_children.push_back(NULL);
254                 m_children.push_back(NULL);
255                 m_pos_Issuer=m_children.begin();
256                 m_pos_Signature=m_pos_Issuer;
257                 ++m_pos_Signature;
258                 m_pos_Extensions=m_pos_Signature;
259                 ++m_pos_Extensions;
260             }
261         protected:
262             RequestAbstractTypeImpl() {
263                 init();
264             }
265         public:
266             virtual ~RequestAbstractTypeImpl() {
267                 XMLString::release(&m_ID);
268                 XMLString::release(&m_Version);
269                 XMLString::release(&m_Destination);
270                 XMLString::release(&m_Consent);
271                 delete m_IssueInstant;
272             }
273     
274             RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
275                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
276                 init();
277             }
278                 
279             RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
280                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
281                 init();
282                 setID(src.getID());
283                 setVersion(src.getVersion());
284                 setIssueInstant(src.getIssueInstant());
285                 setDestination(src.getDestination());
286                 setConsent(src.getConsent());
287                 if (src.getIssuer())
288                     setIssuer(src.getIssuer()->cloneIssuer());
289                 if (src.getSignature())
290                     setSignature(src.getSignature()->cloneSignature());
291                 if (src.getExtensions())
292                     setExtensions(src.getExtensions()->cloneExtensions());
293             }
294             
295             //IMPL_TYPED_CHILD(Signature);
296             // Need customized setter.
297         protected:
298             Signature* m_Signature;
299             list<XMLObject*>::iterator m_pos_Signature;
300         public:
301             Signature* getSignature() const {
302                 return m_Signature;
303             }
304             
305             void setSignature(Signature* sig) {
306                 prepareForAssignment(m_Signature,sig);
307                 *m_pos_Signature=m_Signature=sig;
308                 // Sync content reference back up.
309                 if (m_Signature)
310                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
311             }
312             
313             IMPL_STRING_ATTRIB(Version);
314             IMPL_ID_ATTRIB(ID);
315             IMPL_DATETIME_ATTRIB(IssueInstant,0);
316             IMPL_STRING_ATTRIB(Destination);
317             IMPL_STRING_ATTRIB(Consent);
318             IMPL_TYPED_FOREIGN_CHILD(Issuer,saml2);
319             IMPL_TYPED_CHILD(Extensions);
320     
321         protected:
322             void marshallAttributes(DOMElement* domElement) const {
323                 if (!m_Version)
324                     const_cast<RequestAbstractTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
325                 MARSHALL_STRING_ATTRIB(Version,VER,NULL);
326                 if (!m_ID)
327                     const_cast<RequestAbstractTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
328                 MARSHALL_ID_ATTRIB(ID,ID,NULL);
329                 if (!m_IssueInstant) {
330                     const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
331                     const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
332                 }
333                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
334                 MARSHALL_STRING_ATTRIB(Destination,DESTINATION,NULL);
335                 MARSHALL_STRING_ATTRIB(Consent,CONSENT,NULL);
336             }
337     
338             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
339                 PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAML20_NS,false);
340                 PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false);
341                 PROC_TYPED_CHILD(Extensions,SAML20P_NS,false);
342                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
343             }
344     
345             void processAttribute(const DOMAttr* attribute) {
346                 PROC_ID_ATTRIB(ID,ID,NULL);
347                 PROC_STRING_ATTRIB(Version,VER,NULL);
348                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
349                 PROC_STRING_ATTRIB(Destination,DESTINATION,NULL);
350                 PROC_STRING_ATTRIB(Consent,CONSENT,NULL);
351                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
352             }
353         };
354
355
356         class SAML_DLLLOCAL AssertionIDRequestImpl : public virtual AssertionIDRequest, public RequestAbstractTypeImpl
357         {
358         public:
359             virtual ~AssertionIDRequestImpl() { }
360     
361             AssertionIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
362                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
363                 
364             AssertionIDRequestImpl(const AssertionIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
365                 VectorOf(AssertionIDRef) v=getAssertionIDRefs();
366                 for (vector<AssertionIDRef*>::const_iterator i=src.m_AssertionIDRefs.begin(); i!=src.m_AssertionIDRefs.end(); i++) {
367                     if (*i) {                               
368                         v.push_back((*i)->cloneAssertionIDRef());
369                     }
370                 }
371
372             }
373             
374             IMPL_XMLOBJECT_CLONE(AssertionIDRequest);
375             RequestAbstractType* cloneRequestAbstractType() const {
376                 return cloneAssertionIDRequest();
377             }
378
379             IMPL_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,m_children.end());
380     
381         protected:
382             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
383                 PROC_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,SAML20_NS,false);
384                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
385             }
386         };
387
388         class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, public RequestAbstractTypeImpl
389         {
390             void init()
391             {
392                 m_Subject = NULL;
393                 m_children.push_back(NULL);
394                 m_pos_Subject = m_pos_Extensions;
395                 ++m_pos_Subject;
396             }
397         protected:
398             SubjectQueryImpl() {
399                 init();
400             }
401         public:
402             virtual ~SubjectQueryImpl() { }
403     
404             SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
405                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
406             { 
407                 init();
408             }
409                 
410             SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
411                 init();
412                 if (src.getSubject())
413                     setSubject(src.getSubject()->cloneSubject());
414             }
415             
416             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
417     
418         protected:
419             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
420                 PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAML20_NS,false);
421                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
422             }
423         };
424
425
426         class SAML_DLLLOCAL RequestedAuthnContextImpl : public virtual RequestedAuthnContext,
427             public AbstractComplexElement,
428             public AbstractDOMCachingXMLObject,
429             public AbstractXMLObjectMarshaller,
430             public AbstractXMLObjectUnmarshaller
431         {
432             void init() {
433                 m_Comparison=NULL;
434             }
435         public:
436             virtual ~RequestedAuthnContextImpl() {
437                 XMLString::release(&m_Comparison);
438             }
439     
440             RequestedAuthnContextImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
441                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
442                 init();
443             }
444                 
445             RequestedAuthnContextImpl(const RequestedAuthnContextImpl& src)
446                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
447                 init();
448                 setComparison(src.getComparison());
449                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
450                     if (*i) {
451                         AuthnContextClassRef* classref=dynamic_cast<AuthnContextClassRef*>(*i);
452                         if (classref) {
453                             getAuthnContextClassRefs().push_back(classref->cloneAuthnContextClassRef());
454                             continue;
455                         }
456
457                         AuthnContextDeclRef* declref=dynamic_cast<AuthnContextDeclRef*>(*i);
458                         if (declref) {
459                             getAuthnContextDeclRefs().push_back(declref->cloneAuthnContextDeclRef());
460                             continue;
461                         }
462                     }
463                 }
464             }
465             
466             IMPL_XMLOBJECT_CLONE(RequestedAuthnContext);
467             IMPL_STRING_ATTRIB(Comparison);
468             IMPL_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,m_children.end());
469             IMPL_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,m_children.end());
470     
471         protected:
472             void marshallAttributes(DOMElement* domElement) const {
473                 MARSHALL_STRING_ATTRIB(Comparison,COMPARISON,NULL);
474             }
475     
476             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
477                 PROC_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2,SAML20_NS,false);
478                 PROC_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2,SAML20_NS,false);
479                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
480             }
481     
482             void processAttribute(const DOMAttr* attribute) {
483                 PROC_STRING_ATTRIB(Comparison,COMPARISON,NULL);
484                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
485             }
486         };
487
488
489         class SAML_DLLLOCAL AuthnQueryImpl : public virtual AuthnQuery, public SubjectQueryImpl
490         {
491             void init() {
492                 m_SessionIndex=NULL;
493                 m_RequestedAuthnContext=NULL;
494                 m_children.push_back(NULL);
495                 m_pos_RequestedAuthnContext = m_pos_Subject;
496                 ++m_pos_RequestedAuthnContext;
497                 
498             }
499         public:
500             virtual ~AuthnQueryImpl() {
501                 XMLString::release(&m_SessionIndex);
502             }
503     
504             AuthnQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
505                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
506             {
507                 init();
508             }
509                 
510             AuthnQueryImpl(const AuthnQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
511                 init();
512                 setSessionIndex(src.getSessionIndex());
513                 if (src.getRequestedAuthnContext())
514                     setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
515             }
516             
517             IMPL_XMLOBJECT_CLONE(AuthnQuery);
518             SubjectQuery* cloneSubjectQuery() const {
519                 return cloneAuthnQuery();
520             }
521             RequestAbstractType* cloneRequestAbstractType() const {
522                 return cloneAuthnQuery();
523             }
524
525             IMPL_STRING_ATTRIB(SessionIndex);
526             IMPL_TYPED_CHILD(RequestedAuthnContext);
527     
528         protected:
529             void marshallAttributes(DOMElement* domElement) const {
530                 MARSHALL_STRING_ATTRIB(SessionIndex,SESSIONINDEX,NULL);
531                 SubjectQueryImpl::marshallAttributes(domElement);
532             }
533     
534             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
535                 PROC_TYPED_CHILD(RequestedAuthnContext,SAML20P_NS,false);
536                 SubjectQueryImpl::processChildElement(childXMLObject,root);
537             }
538             void processAttribute(const DOMAttr* attribute) {
539                 PROC_STRING_ATTRIB(SessionIndex,SESSIONINDEX,NULL);
540                 SubjectQueryImpl::processAttribute(attribute);
541             }
542         };
543
544         class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
545         {
546         public:
547             virtual ~AttributeQueryImpl() { }
548     
549             AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
550                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
551                 
552             AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
553                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
554                     if (*i) {
555                         Attribute* attrib=dynamic_cast<Attribute*>(*i);
556                         if (attrib) {
557                             getAttributes().push_back(attrib->cloneAttribute());
558                             continue;
559                         }
560                     }
561                 }
562
563             }
564             
565             IMPL_XMLOBJECT_CLONE(AttributeQuery);
566             SubjectQuery* cloneSubjectQuery() const {
567                 return cloneAttributeQuery();
568             }
569             RequestAbstractType* cloneRequestAbstractType() const {
570                 return cloneAttributeQuery();
571             }
572
573             IMPL_TYPED_FOREIGN_CHILDREN(Attribute,saml2,m_children.end());
574     
575         protected:
576             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
577                 PROC_TYPED_FOREIGN_CHILDREN(Attribute,saml2,SAML20_NS,false);
578                 SubjectQueryImpl::processChildElement(childXMLObject,root);
579             }
580         };
581
582         class SAML_DLLLOCAL AuthzDecisionQueryImpl : public virtual AuthzDecisionQuery, public SubjectQueryImpl
583         {
584             void init() {
585                 m_Resource=NULL;
586                 m_Evidence=NULL;
587                 m_children.push_back(NULL);
588                 m_pos_Evidence=m_pos_Subject;
589                 ++m_pos_Evidence;
590                 
591             }
592         public:
593             virtual ~AuthzDecisionQueryImpl() {
594                 XMLString::release(&m_Resource);
595             }
596     
597             AuthzDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
598                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
599                 init();
600             }
601                 
602             AuthzDecisionQueryImpl(const AuthzDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
603                 init();
604                 setResource(src.getResource());
605                 if (src.getEvidence())
606                     setEvidence(src.getEvidence()->cloneEvidence());
607                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
608                     if (*i) {
609                         Action* action=dynamic_cast<Action*>(*i);
610                         if (action) {
611                             getActions().push_back(action->cloneAction());
612                             continue;
613                         }
614                     }
615                 }
616             }
617             
618             IMPL_XMLOBJECT_CLONE(AuthzDecisionQuery);
619             SubjectQuery* cloneSubjectQuery() const {
620                 return cloneAuthzDecisionQuery();
621             }
622             RequestAbstractType* cloneRequestAbstractType() const {
623                 return cloneAuthzDecisionQuery();
624             }
625
626             IMPL_STRING_ATTRIB(Resource);
627             IMPL_TYPED_FOREIGN_CHILDREN(Action,saml2,m_pos_Evidence);
628             IMPL_TYPED_FOREIGN_CHILD(Evidence,saml2);
629     
630         protected:
631             void marshallAttributes(DOMElement* domElement) const {
632                 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
633                 SubjectQueryImpl::marshallAttributes(domElement);
634             }
635     
636             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
637                 PROC_TYPED_FOREIGN_CHILD(Evidence,saml2,SAML20_NS,false);
638                 PROC_TYPED_FOREIGN_CHILDREN(Action,saml2,SAML20_NS,false);
639                 SubjectQueryImpl::processChildElement(childXMLObject,root);
640             }
641             void processAttribute(const DOMAttr* attribute) {
642                 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
643                 SubjectQueryImpl::processAttribute(attribute);
644             }
645         };
646
647         class SAML_DLLLOCAL NameIDPolicyImpl : public virtual NameIDPolicy,
648             public AbstractSimpleElement,
649             public AbstractDOMCachingXMLObject,
650             public AbstractXMLObjectMarshaller,
651             public AbstractXMLObjectUnmarshaller
652         {
653             void init() {
654                 m_Format=NULL;
655                 m_SPNameQualifier=NULL;
656                 m_AllowCreate=XML_BOOL_NULL;
657             }
658             public:
659                 virtual ~NameIDPolicyImpl()
660                 {
661                     XMLString::release(&m_Format);
662                     XMLString::release(&m_SPNameQualifier);
663                 }
664
665                 NameIDPolicyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
666                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
667                 {
668                         init();
669                 }
670
671                 NameIDPolicyImpl(const NameIDPolicyImpl& src)
672                         : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
673                     init();
674                     setFormat(src.getFormat());
675                     setSPNameQualifier(src.getSPNameQualifier());
676                     AllowCreate(m_AllowCreate);
677                 }
678
679                 IMPL_XMLOBJECT_CLONE(NameIDPolicy);
680                 IMPL_STRING_ATTRIB(Format);
681                 IMPL_STRING_ATTRIB(SPNameQualifier);
682                 IMPL_BOOLEAN_ATTRIB(AllowCreate);
683
684             protected:
685                 void marshallAttributes(DOMElement* domElement) const {
686                     MARSHALL_STRING_ATTRIB(Format,FORMAT,NULL);
687                     MARSHALL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,NULL);
688                     MARSHALL_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,NULL);
689                 }
690
691                 void processAttribute(const DOMAttr* attribute) {
692                     PROC_STRING_ATTRIB(Format,FORMAT,NULL);
693                     PROC_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER,NULL);
694                     PROC_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE,NULL);
695                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
696                 }
697         };
698
699         class SAML_DLLLOCAL IDPEntryImpl : public virtual IDPEntry,
700             public AbstractSimpleElement,
701             public AbstractDOMCachingXMLObject,
702             public AbstractXMLObjectMarshaller,
703             public AbstractXMLObjectUnmarshaller
704         {
705             void init() {
706                 m_ProviderID=NULL;
707                 m_Name=NULL;
708                 m_Loc=NULL;
709             }
710             public:
711                 virtual ~IDPEntryImpl()
712                 {
713                     XMLString::release(&m_ProviderID);
714                     XMLString::release(&m_Name);
715                     XMLString::release(&m_Loc);
716                 }
717
718                 IDPEntryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
719                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
720                 {
721                         init();
722                 }
723
724                 IDPEntryImpl(const IDPEntryImpl& src)
725                         : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
726                     init();
727                     setProviderID(src.getProviderID());
728                     setName(src.getName());
729                     setLoc(src.getLoc());
730                 }
731
732                 IMPL_XMLOBJECT_CLONE(IDPEntry);
733                 IMPL_STRING_ATTRIB(ProviderID);
734                 IMPL_STRING_ATTRIB(Name);
735                 IMPL_STRING_ATTRIB(Loc);
736
737             protected:
738                 void marshallAttributes(DOMElement* domElement) const {
739                     MARSHALL_STRING_ATTRIB(ProviderID,PROVIDERID,NULL);
740                     MARSHALL_STRING_ATTRIB(Name,NAME,NULL);
741                     MARSHALL_STRING_ATTRIB(Loc,LOC,NULL);
742                 }
743
744                 void processAttribute(const DOMAttr* attribute) {
745                     PROC_STRING_ATTRIB(ProviderID,PROVIDERID,NULL);
746                     PROC_STRING_ATTRIB(Name,NAME,NULL);
747                     PROC_STRING_ATTRIB(Loc,LOC,NULL);
748                     AbstractXMLObjectUnmarshaller::processAttribute(attribute);
749                 }
750         };
751
752         class SAML_DLLLOCAL IDPListImpl : public virtual IDPList,
753             public AbstractComplexElement,
754             public AbstractDOMCachingXMLObject,
755             public AbstractXMLObjectMarshaller,
756             public AbstractXMLObjectUnmarshaller
757         {
758             void init() {
759                 m_GetComplete=NULL;
760                 m_children.push_back(NULL);
761                 m_pos_GetComplete=m_children.begin();
762                 
763             }
764         public:
765             virtual ~IDPListImpl() { }
766     
767             IDPListImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
768                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
769             {
770                 init();
771             }
772                 
773             IDPListImpl(const IDPListImpl& src)
774                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
775                 init();
776                 if (src.getGetComplete())
777                     setGetComplete(src.getGetComplete()->cloneGetComplete());
778                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
779                     if (*i) {
780                         IDPEntry* entry=dynamic_cast<IDPEntry*>(*i);
781                         if (entry) {
782                             getIDPEntrys().push_back(entry->cloneIDPEntry());
783                             continue;
784                         }
785                     }
786                 }
787             }
788             
789             IMPL_XMLOBJECT_CLONE(IDPList);
790             IMPL_TYPED_CHILDREN(IDPEntry,m_pos_GetComplete);
791             IMPL_TYPED_CHILD(GetComplete);
792     
793         protected:
794             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
795                 PROC_TYPED_CHILDREN(IDPEntry,SAML20P_NS,false);
796                 PROC_TYPED_CHILD(GetComplete,SAML20P_NS,false);
797                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
798             }
799         };
800
801
802         class SAML_DLLLOCAL ScopingImpl : public virtual Scoping,
803             public AbstractComplexElement,
804             public AbstractDOMCachingXMLObject,
805             public AbstractXMLObjectMarshaller,
806             public AbstractXMLObjectUnmarshaller
807         {
808             void init() {
809                 m_ProxyCount=NULL;
810                 m_IDPList=NULL;
811                 m_children.push_back(NULL);
812                 m_pos_IDPList=m_children.begin();
813                 
814             }
815         public:
816             virtual ~ScopingImpl() {
817                 XMLString::release(&m_ProxyCount); 
818             }
819     
820             ScopingImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
821                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
822             {
823                 init();
824             }
825                 
826             ScopingImpl(const ScopingImpl& src)
827                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
828                 init();
829                 setProxyCount(m_ProxyCount);
830                 if (src.getIDPList())
831                     setIDPList(src.getIDPList()->cloneIDPList());
832                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
833                     if (*i) {
834                         RequesterID* reqid =dynamic_cast<RequesterID*>(*i);
835                         if (reqid) {
836                             getRequesterIDs().push_back(reqid->cloneRequesterID());
837                             continue;
838                         }
839                     }
840                 }
841             }
842             
843             IMPL_XMLOBJECT_CLONE(Scoping);
844             IMPL_INTEGER_ATTRIB(ProxyCount);
845             IMPL_TYPED_CHILD(IDPList);
846             IMPL_TYPED_CHILDREN(RequesterID,m_children.end());
847     
848         protected:
849             void marshallAttributes(DOMElement* domElement) const {
850                     MARSHALL_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,NULL);
851             }
852     
853             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
854                 PROC_TYPED_CHILD(IDPList,SAML20P_NS,false);
855                 PROC_TYPED_CHILDREN(RequesterID,SAML20P_NS,false);
856                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
857             }
858
859             void processAttribute(const DOMAttr* attribute) {
860                 PROC_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT,NULL);
861                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
862             }
863         };
864
865         class SAML_DLLLOCAL AuthnRequestImpl : public virtual AuthnRequest, public RequestAbstractTypeImpl
866         {
867             void init() {
868                 m_ForceAuthn=XML_BOOL_NULL;
869                 m_IsPassive=XML_BOOL_NULL;
870                 m_ProtocolBinding=NULL;
871                 m_AssertionConsumerServiceIndex=NULL;
872                 m_AssertionConsumerServiceURL=NULL;
873                 m_AttributeConsumingServiceIndex=NULL;
874                 m_ProviderName=NULL;
875
876                 m_Subject=NULL;
877                 m_NameIDPolicy=NULL;
878                 m_Conditions=NULL;
879                 m_RequestedAuthnContext=NULL;
880                 m_Scoping=NULL;
881                 m_children.push_back(NULL);
882                 m_children.push_back(NULL);
883                 m_children.push_back(NULL);
884                 m_children.push_back(NULL);
885                 m_children.push_back(NULL);
886                 m_pos_Subject=m_pos_Extensions;
887                 ++m_pos_Subject;
888                 m_pos_NameIDPolicy=m_pos_Subject;
889                 ++m_pos_NameIDPolicy;
890                 m_pos_Conditions=m_pos_NameIDPolicy;
891                 ++m_pos_Conditions;
892                 m_pos_RequestedAuthnContext=m_pos_Conditions;
893                 ++m_pos_RequestedAuthnContext;
894                 m_pos_Scoping=m_pos_RequestedAuthnContext;
895                 ++m_pos_Scoping;
896                 
897             }
898         public:
899             virtual ~AuthnRequestImpl() {
900                 XMLString::release(&m_ProtocolBinding);
901                 XMLString::release(&m_AssertionConsumerServiceURL);
902                 XMLString::release(&m_ProviderName);
903                 XMLString::release(&m_AssertionConsumerServiceIndex);
904                 XMLString::release(&m_AttributeConsumingServiceIndex);
905             }
906     
907             AuthnRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
908                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
909             {
910                 init();
911             }
912                 
913             AuthnRequestImpl(const AuthnRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
914                 init();
915
916                 ForceAuthn(m_ForceAuthn);
917                 IsPassive(m_IsPassive);
918                 setProtocolBinding(src.getProtocolBinding());
919                 setAssertionConsumerServiceIndex(m_AssertionConsumerServiceIndex);
920                 setAssertionConsumerServiceURL(src.getAssertionConsumerServiceURL());
921                 setAttributeConsumingServiceIndex(m_AttributeConsumingServiceIndex);
922                 setProviderName(src.getProviderName());
923
924                 if (src.getSubject())
925                     setSubject(src.getSubject()->cloneSubject());
926                 if (src.getNameIDPolicy())
927                     setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
928                 if (src.getConditions())
929                     setConditions(src.getConditions()->cloneConditions());
930                 if (src.getRequestedAuthnContext())
931                     setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
932                 if (src.getScoping())
933                     setScoping(src.getScoping()->cloneScoping());
934             }
935             
936             IMPL_XMLOBJECT_CLONE(AuthnRequest);
937             RequestAbstractType* cloneRequestAbstractType() const {
938                 return cloneAuthnRequest();
939             }
940
941             IMPL_BOOLEAN_ATTRIB(ForceAuthn);
942             IMPL_BOOLEAN_ATTRIB(IsPassive);
943             IMPL_STRING_ATTRIB(ProtocolBinding);
944             IMPL_INTEGER_ATTRIB(AssertionConsumerServiceIndex);
945             IMPL_STRING_ATTRIB(AssertionConsumerServiceURL);
946             IMPL_INTEGER_ATTRIB(AttributeConsumingServiceIndex);
947             IMPL_STRING_ATTRIB(ProviderName);
948
949             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
950             IMPL_TYPED_CHILD(NameIDPolicy);
951             IMPL_TYPED_FOREIGN_CHILD(Conditions,saml2);
952             IMPL_TYPED_CHILD(RequestedAuthnContext);
953             IMPL_TYPED_CHILD(Scoping);
954     
955         protected:
956             void marshallAttributes(DOMElement* domElement) const {
957                 MARSHALL_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,NULL);
958                 MARSHALL_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,NULL);
959                 MARSHALL_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,NULL);
960                 MARSHALL_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,NULL);
961                 MARSHALL_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,NULL);
962                 MARSHALL_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,NULL);
963                 MARSHALL_STRING_ATTRIB(ProviderName,PROVIDERNAME,NULL);
964                 RequestAbstractTypeImpl::marshallAttributes(domElement);
965             }
966     
967             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
968                 PROC_TYPED_FOREIGN_CHILD(Subject,saml2,SAML20_NS,false);
969                 PROC_TYPED_CHILD(NameIDPolicy,SAML20P_NS,false);
970                 PROC_TYPED_FOREIGN_CHILD(Conditions,saml2,SAML20_NS,false);
971                 PROC_TYPED_CHILD(RequestedAuthnContext,SAML20P_NS,false);
972                 PROC_TYPED_CHILD(Scoping,SAML20P_NS,false);
973                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
974             }
975             void processAttribute(const DOMAttr* attribute) {
976                 PROC_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN,NULL);
977                 PROC_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE,NULL);
978                 PROC_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING,NULL);
979                 PROC_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX,NULL);
980                 PROC_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL,NULL);
981                 PROC_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX,NULL);
982                 PROC_STRING_ATTRIB(ProviderName,PROVIDERNAME,NULL);
983                 RequestAbstractTypeImpl::processAttribute(attribute);
984             }
985         };
986
987         class SAML_DLLLOCAL StatusResponseTypeImpl : public virtual StatusResponseType,
988             public AbstractComplexElement,
989             public AbstractDOMCachingXMLObject,
990             public AbstractXMLObjectMarshaller,
991             public AbstractXMLObjectUnmarshaller
992         {
993             void init() {
994                 m_ID=NULL;
995                 m_InResponseTo=NULL;
996                 m_Version=NULL;
997                 m_IssueInstant=NULL;
998                 m_Destination=NULL;
999                 m_Consent=NULL;
1000                 m_Issuer=NULL;
1001                 m_Signature=NULL;
1002                 m_Extensions=NULL;
1003                 m_Status=NULL;
1004                 m_children.push_back(NULL);
1005                 m_children.push_back(NULL);
1006                 m_children.push_back(NULL);
1007                 m_children.push_back(NULL);
1008                 m_pos_Issuer=m_children.begin();
1009                 m_pos_Signature=m_pos_Issuer;
1010                 ++m_pos_Signature;
1011                 m_pos_Extensions=m_pos_Signature;
1012                 ++m_pos_Extensions;
1013                 m_pos_Status=m_pos_Extensions;
1014                 ++m_pos_Status;
1015             }
1016         protected:
1017             StatusResponseTypeImpl() {
1018                 init();
1019             }
1020         public:
1021             virtual ~StatusResponseTypeImpl() {
1022                 XMLString::release(&m_ID);
1023                 XMLString::release(&m_InResponseTo);
1024                 XMLString::release(&m_Version);
1025                 XMLString::release(&m_Destination);
1026                 XMLString::release(&m_Consent);
1027                 delete m_IssueInstant;
1028             }
1029     
1030             StatusResponseTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1031                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1032             {
1033                 init();
1034             }
1035                 
1036             StatusResponseTypeImpl(const StatusResponseTypeImpl& src)
1037                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
1038                 init();
1039                 setID(src.getID());
1040                 setInResponseTo(src.getInResponseTo());
1041                 setVersion(src.getVersion());
1042                 setIssueInstant(src.getIssueInstant());
1043                 setDestination(src.getDestination());
1044                 setConsent(src.getConsent());
1045                 if (src.getIssuer())
1046                     setIssuer(src.getIssuer()->cloneIssuer());
1047                 if (src.getSignature())
1048                     setSignature(src.getSignature()->cloneSignature());
1049                 if (src.getExtensions())
1050                     setExtensions(src.getExtensions()->cloneExtensions());
1051                 if (src.getStatus())
1052                     setStatus(src.getStatus()->cloneStatus());
1053             }
1054             
1055             //IMPL_TYPED_CHILD(Signature);
1056             // Need customized setter.
1057         protected:
1058             Signature* m_Signature;
1059             list<XMLObject*>::iterator m_pos_Signature;
1060         public:
1061             Signature* getSignature() const {
1062                 return m_Signature;
1063             }
1064             
1065             void setSignature(Signature* sig) {
1066                 prepareForAssignment(m_Signature,sig);
1067                 *m_pos_Signature=m_Signature=sig;
1068                 // Sync content reference back up.
1069                 if (m_Signature)
1070                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
1071             }
1072             
1073             IMPL_STRING_ATTRIB(Version);
1074             IMPL_ID_ATTRIB(ID);
1075             IMPL_STRING_ATTRIB(InResponseTo);
1076             IMPL_DATETIME_ATTRIB(IssueInstant,0);
1077             IMPL_STRING_ATTRIB(Destination);
1078             IMPL_STRING_ATTRIB(Consent);
1079             IMPL_TYPED_FOREIGN_CHILD(Issuer,saml2);
1080             IMPL_TYPED_CHILD(Extensions);
1081             IMPL_TYPED_CHILD(Status);
1082     
1083         protected:
1084             void marshallAttributes(DOMElement* domElement) const {
1085                 if (!m_Version)
1086                     const_cast<StatusResponseTypeImpl*>(this)->m_Version=XMLString::transcode("2.0");
1087                 MARSHALL_STRING_ATTRIB(Version,VER,NULL);
1088                 if (!m_ID)
1089                     const_cast<StatusResponseTypeImpl*>(this)->m_ID=SAMLConfig::getConfig().generateIdentifier();
1090                 MARSHALL_ID_ATTRIB(ID,ID,NULL);
1091                 if (!m_IssueInstant) {
1092                     const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
1093                     const_cast<StatusResponseTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
1094                 }
1095                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1096                 MARSHALL_STRING_ATTRIB(Destination,DESTINATION,NULL);
1097                 MARSHALL_STRING_ATTRIB(Consent,CONSENT,NULL);
1098                 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
1099             }
1100     
1101             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1102                 PROC_TYPED_FOREIGN_CHILD(Issuer,saml2,SAML20_NS,false);
1103                 PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false);
1104                 PROC_TYPED_CHILD(Extensions,SAML20P_NS,false);
1105                 PROC_TYPED_CHILD(Status,SAML20P_NS,false);
1106                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1107             }
1108     
1109             void processAttribute(const DOMAttr* attribute) {
1110                 PROC_ID_ATTRIB(ID,ID,NULL);
1111                 PROC_STRING_ATTRIB(Version,VER,NULL);
1112                 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
1113                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1114                 PROC_STRING_ATTRIB(Destination,DESTINATION,NULL);
1115                 PROC_STRING_ATTRIB(Consent,CONSENT,NULL);
1116                 AbstractXMLObjectUnmarshaller::processAttribute(attribute);
1117             }
1118         };
1119
1120         class SAML_DLLLOCAL ResponseImpl : public virtual Response, public StatusResponseTypeImpl
1121         {
1122         public:
1123             virtual ~ResponseImpl() { }
1124     
1125             ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1126                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1127                 
1128             ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1129                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
1130                     if (*i) {
1131                         saml2::Assertion* assertion=dynamic_cast<saml2::Assertion*>(*i);
1132                         if (assertion) {
1133                             getAssertions().push_back(assertion->cloneAssertion());
1134                             continue;
1135                         }
1136                         EncryptedAssertion* encAssertion=dynamic_cast<EncryptedAssertion*>(*i);
1137                         if (encAssertion) {
1138                             getEncryptedAssertions().push_back(encAssertion->cloneEncryptedAssertion());
1139                             continue;
1140                         }
1141                     }
1142                 }
1143
1144             }
1145             
1146             IMPL_XMLOBJECT_CLONE(Response);
1147             StatusResponseType* cloneStatusResponseType() const {
1148                 return cloneResponse();
1149             }
1150
1151             IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml2,m_children.end());
1152             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,m_children.end());
1153     
1154         protected:
1155             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1156                 PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml2,SAML20_NS,false);
1157                 PROC_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,SAML20_NS,false);
1158                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1159             }
1160         };
1161
1162         class SAML_DLLLOCAL ArtifactResolveImpl : public virtual ArtifactResolve, public RequestAbstractTypeImpl
1163         {
1164             void init() {
1165                 m_Artifact=NULL;
1166                 m_children.push_back(NULL);
1167                 m_pos_Artifact=m_pos_Extensions;
1168                 ++m_pos_Artifact;
1169             }
1170         public:
1171             virtual ~ArtifactResolveImpl() { }
1172     
1173             ArtifactResolveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1174                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1175             { 
1176                 init();
1177             }
1178                 
1179             ArtifactResolveImpl(const ArtifactResolveImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1180                 init();
1181                 if(src.getArtifact())
1182                     setArtifact(src.getArtifact()->cloneArtifact());
1183             }
1184             
1185             IMPL_XMLOBJECT_CLONE(ArtifactResolve);
1186             RequestAbstractType* cloneRequestAbstractType() const {
1187                 return cloneArtifactResolve();
1188             }
1189
1190             IMPL_TYPED_CHILD(Artifact);
1191     
1192         protected:
1193             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1194                 PROC_TYPED_CHILD(Artifact,SAML20P_NS,false);
1195                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1196             }
1197         };
1198
1199         class SAML_DLLLOCAL ArtifactResponseImpl : public virtual ArtifactResponse, public StatusResponseTypeImpl
1200         {
1201             void init() {
1202                 m_Payload=NULL;
1203                 m_children.push_back(NULL);
1204                 m_pos_Payload=m_pos_Status;
1205                 ++m_pos_Payload;
1206             }
1207         public:
1208             virtual ~ArtifactResponseImpl() { }
1209     
1210             ArtifactResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1211                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1212             {
1213                 init();
1214             }
1215                 
1216             ArtifactResponseImpl(const ArtifactResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1217                 init();
1218                 if (src.getPayload())
1219                     setPayload(getPayload()->clone());
1220
1221             }
1222             
1223             IMPL_XMLOBJECT_CLONE(ArtifactResponse);
1224             StatusResponseType* cloneStatusResponseType() const {
1225                 return cloneArtifactResponse();
1226             }
1227
1228             IMPL_XMLOBJECT_CHILD(Payload);
1229     
1230         protected:
1231             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1232                 // These are valid elements for the parent StatusResponseType, so don't process these.
1233                 // If not one of these, then it must be the payload.
1234                 if (
1235                     ! XMLHelper::isNodeNamed(root,SAML20_NS,saml2::Issuer::LOCAL_NAME) &&
1236                     ! XMLHelper::isNodeNamed(root,XMLSIG_NS,xmlsignature::Signature::LOCAL_NAME) &&
1237                     ! XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Extensions::LOCAL_NAME) &&
1238                     ! XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Status::LOCAL_NAME)
1239                    )
1240                 {
1241                     setPayload(childXMLObject);
1242                     return;
1243                 }
1244
1245                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1246             }
1247         };
1248
1249         class SAML_DLLLOCAL NewEncryptedIDImpl : public virtual NewEncryptedID,
1250             public AbstractComplexElement,
1251             public AbstractDOMCachingXMLObject,
1252             public AbstractXMLObjectMarshaller,
1253             public AbstractXMLObjectUnmarshaller
1254         {
1255             void init() {
1256                 m_EncryptedData=NULL;
1257                 m_children.push_back(NULL);
1258                 m_pos_EncryptedData=m_children.begin();
1259             }
1260             
1261         protected:
1262             NewEncryptedIDImpl()
1263             {
1264                 init();
1265             }
1266             
1267         public:
1268             virtual ~NewEncryptedIDImpl() {}
1269     
1270             NewEncryptedIDImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1271                     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1272             {
1273                 init();
1274             }
1275                 
1276             NewEncryptedIDImpl(const NewEncryptedIDImpl& src)
1277                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
1278                 init();
1279                 if (src.getEncryptedData())
1280                     setEncryptedData(src.getEncryptedData()->cloneEncryptedData());
1281                 VectorOf(xmlencryption::EncryptedKey) v=getEncryptedKeys();
1282                 for (vector<xmlencryption::EncryptedKey*>::const_iterator i=src.m_EncryptedKeys.begin(); i!=src.m_EncryptedKeys.end(); i++) {
1283                     if (*i) {
1284                         v.push_back((*i)->cloneEncryptedKey());
1285                     }
1286                 }
1287             }
1288     
1289             IMPL_XMLOBJECT_CLONE(NewEncryptedID);
1290             EncryptedElementType* cloneEncryptedElementType() const {
1291                 return new NewEncryptedIDImpl(*this);
1292             }
1293
1294             IMPL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
1295             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,m_children.end());
1296     
1297         protected:
1298             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1299                 PROC_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption,XMLENC_NS,false);
1300                 PROC_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption,XMLENC_NS,false);
1301                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1302             }
1303         };
1304
1305         class SAML_DLLLOCAL TerminateImpl : public virtual Terminate,
1306             public AbstractSimpleElement,
1307             public AbstractDOMCachingXMLObject,
1308             public AbstractXMLObjectMarshaller,
1309             public AbstractXMLObjectUnmarshaller
1310         {
1311             public:
1312                 virtual ~TerminateImpl() { }
1313
1314                 TerminateImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1315                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1316
1317                 TerminateImpl(const TerminateImpl& src)
1318                     : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
1319                 }
1320
1321                 IMPL_XMLOBJECT_CLONE(Terminate);
1322
1323             protected:
1324                 // has no attributes or children
1325         };
1326
1327         class SAML_DLLLOCAL ManageNameIDRequestImpl : public virtual ManageNameIDRequest, public RequestAbstractTypeImpl
1328         {
1329             void init() {
1330                 m_NameID=NULL;
1331                 m_EncryptedID=NULL;
1332                 m_NewID=NULL;
1333                 m_NewEncryptedID=NULL;
1334                 m_Terminate=NULL;
1335                 m_children.push_back(NULL);
1336                 m_children.push_back(NULL);
1337                 m_children.push_back(NULL);
1338                 m_children.push_back(NULL);
1339                 m_children.push_back(NULL);
1340                 m_pos_NameID=m_pos_Extensions;
1341                 ++m_pos_NameID;
1342                 m_pos_EncryptedID=m_pos_NameID;
1343                 ++m_pos_EncryptedID;
1344                 m_pos_NewID=m_pos_EncryptedID;
1345                 ++m_pos_NewID;
1346                 m_pos_NewEncryptedID=m_pos_NewID;
1347                 ++m_pos_NewEncryptedID;
1348                 m_pos_Terminate=m_pos_NewEncryptedID;
1349                 ++m_pos_Terminate;
1350                 
1351             }
1352         public:
1353             virtual ~ManageNameIDRequestImpl() { }
1354     
1355             ManageNameIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1356                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1357             {
1358                 init();
1359             }
1360                 
1361             ManageNameIDRequestImpl(const ManageNameIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1362                 init();
1363
1364                 if (src.getNameID())
1365                     setNameID(src.getNameID()->cloneNameID());
1366                 if (src.getEncryptedID())
1367                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1368                 if (src.getNewID())
1369                     setNewID(src.getNewID()->cloneNewID());
1370                 if (src.getNewEncryptedID())
1371                     setNewEncryptedID(src.getNewEncryptedID()->cloneNewEncryptedID());
1372                 if (src.getTerminate())
1373                     setTerminate(src.getTerminate()->cloneTerminate());
1374
1375             }
1376             
1377             IMPL_XMLOBJECT_CLONE(ManageNameIDRequest);
1378             RequestAbstractType* cloneRequestAbstractType() const {
1379                 return cloneManageNameIDRequest();
1380             }
1381
1382             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1383             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1384             IMPL_TYPED_CHILD(NewID);
1385             IMPL_TYPED_CHILD(NewEncryptedID);
1386             IMPL_TYPED_CHILD(Terminate);
1387     
1388         protected:
1389             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1390                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1391                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1392                 PROC_TYPED_CHILD(NewID,SAML20P_NS,false);
1393                 PROC_TYPED_CHILD(NewEncryptedID,SAML20P_NS,false);
1394                 PROC_TYPED_CHILD(Terminate,SAML20P_NS,false);
1395                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1396             }
1397         };
1398
1399         class SAML_DLLLOCAL ManageNameIDResponseImpl : public virtual ManageNameIDResponse, public StatusResponseTypeImpl
1400         {
1401         public:
1402             virtual ~ManageNameIDResponseImpl() { }
1403
1404             ManageNameIDResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1405                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1406             
1407             ManageNameIDResponseImpl(const ManageNameIDResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1408             }
1409
1410             IMPL_XMLOBJECT_CLONE(ManageNameIDResponse);
1411             StatusResponseType* cloneStatusResponseType() const {
1412                 return cloneManageNameIDResponse();
1413             }
1414         };
1415
1416         class SAML_DLLLOCAL LogoutRequestImpl : public virtual LogoutRequest, public RequestAbstractTypeImpl
1417         {
1418             void init() {
1419                 m_Reason=NULL;
1420                 m_NotOnOrAfter=NULL;
1421
1422                 m_BaseID=NULL;
1423                 m_NameID=NULL;
1424                 m_EncryptedID=NULL;
1425                 m_children.push_back(NULL);
1426                 m_children.push_back(NULL);
1427                 m_children.push_back(NULL);
1428                 m_pos_BaseID=m_pos_Extensions;
1429                 ++m_pos_BaseID;
1430                 m_pos_NameID=m_pos_BaseID;
1431                 ++m_pos_NameID;
1432                 m_pos_EncryptedID=m_pos_NameID;
1433                 ++m_pos_EncryptedID;
1434                 
1435             }
1436         public:
1437             virtual ~LogoutRequestImpl() {
1438                 XMLString::release(&m_Reason);
1439                 delete m_NotOnOrAfter;
1440             }
1441     
1442             LogoutRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1443                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1444             {
1445                 init();
1446             }
1447                 
1448             LogoutRequestImpl(const LogoutRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1449                 init();
1450
1451                 setReason(src.getReason());
1452                 setNotOnOrAfter(src.getNotOnOrAfter());
1453
1454                 if (src.getBaseID())
1455                     setBaseID(src.getBaseID()->cloneBaseID());
1456                 if (src.getNameID())
1457                     setNameID(src.getNameID()->cloneNameID());
1458                 if (src.getEncryptedID())
1459                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1460
1461                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
1462                     if (*i) {
1463                         SessionIndex* si = dynamic_cast<SessionIndex*>(*i);
1464                         if (si) {
1465                             getSessionIndexs().push_back(si->cloneSessionIndex());
1466                             continue;
1467                         }
1468                     }
1469                 }
1470             }
1471             
1472             IMPL_XMLOBJECT_CLONE(LogoutRequest);
1473             RequestAbstractType* cloneRequestAbstractType() const {
1474                 return cloneLogoutRequest();
1475             }
1476
1477             IMPL_STRING_ATTRIB(Reason);
1478             IMPL_DATETIME_ATTRIB(NotOnOrAfter,SAMLTIME_MAX);
1479             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
1480             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1481             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1482             IMPL_TYPED_CHILDREN(SessionIndex,m_children.end());
1483     
1484         protected:
1485             void marshallAttributes(DOMElement* domElement) const {
1486                 MARSHALL_STRING_ATTRIB(Reason,REASON,NULL);
1487                 MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
1488                 RequestAbstractTypeImpl::marshallAttributes(domElement);
1489             }
1490     
1491             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1492                 PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAML20_NS,false);
1493                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1494                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1495                 PROC_TYPED_CHILDREN(SessionIndex,SAML20P_NS,false);
1496                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1497             }
1498             void processAttribute(const DOMAttr* attribute) {
1499                 PROC_STRING_ATTRIB(Reason,REASON,NULL);
1500                 PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
1501                 RequestAbstractTypeImpl::processAttribute(attribute);
1502             }
1503         };
1504
1505         class SAML_DLLLOCAL LogoutResponseImpl : public virtual LogoutResponse, public StatusResponseTypeImpl
1506         {
1507         public:
1508             virtual ~LogoutResponseImpl() { }
1509
1510             LogoutResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1511                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
1512             
1513             LogoutResponseImpl(const LogoutResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1514             }
1515
1516             IMPL_XMLOBJECT_CLONE(LogoutResponse);
1517             StatusResponseType* cloneStatusResponseType() const {
1518                 return cloneLogoutResponse();
1519             }
1520         };
1521
1522
1523         class SAML_DLLLOCAL NameIDMappingRequestImpl : public virtual NameIDMappingRequest, public RequestAbstractTypeImpl
1524         {
1525             void init() {
1526                 m_BaseID=NULL;
1527                 m_NameID=NULL;
1528                 m_EncryptedID=NULL;
1529                 m_NameIDPolicy=NULL;
1530                 m_children.push_back(NULL);
1531                 m_children.push_back(NULL);
1532                 m_children.push_back(NULL);
1533                 m_children.push_back(NULL);
1534                 m_pos_BaseID=m_pos_Extensions;
1535                 ++m_pos_BaseID;
1536                 m_pos_NameID=m_pos_BaseID;
1537                 ++m_pos_NameID;
1538                 m_pos_EncryptedID=m_pos_NameID;
1539                 ++m_pos_EncryptedID;
1540                 m_pos_NameIDPolicy=m_pos_EncryptedID;
1541                 ++m_pos_NameIDPolicy;
1542                 
1543             }
1544         public:
1545             virtual ~NameIDMappingRequestImpl() { }
1546     
1547             NameIDMappingRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1548                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1549             {
1550                 init();
1551             }
1552                 
1553             NameIDMappingRequestImpl(const NameIDMappingRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
1554                 init();
1555
1556                 if (src.getBaseID())
1557                     setBaseID(src.getBaseID()->cloneBaseID());
1558                 if (src.getNameID())
1559                     setNameID(src.getNameID()->cloneNameID());
1560                 if (src.getEncryptedID())
1561                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
1562                 if (src.getNameIDPolicy())
1563                     setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
1564
1565             }
1566             
1567             IMPL_XMLOBJECT_CLONE(NameIDMappingRequest);
1568             RequestAbstractType* cloneRequestAbstractType() const {
1569                 return cloneNameIDMappingRequest();
1570             }
1571
1572             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
1573             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1574             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1575             IMPL_TYPED_CHILD(NameIDPolicy);
1576     
1577         protected:
1578             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1579                 PROC_TYPED_FOREIGN_CHILD(BaseID,saml2,SAML20_NS,false);
1580                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1581                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1582                 PROC_TYPED_CHILD(NameIDPolicy,SAML20P_NS,false);
1583                 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
1584             }
1585         };
1586
1587         class SAML_DLLLOCAL NameIDMappingResponseImpl : public virtual NameIDMappingResponse, public StatusResponseTypeImpl
1588         {
1589             void init() {
1590                 m_NameID=NULL;
1591                 m_EncryptedID=NULL;
1592                 m_children.push_back(NULL);
1593                 m_children.push_back(NULL);
1594                 m_pos_NameID=m_pos_Status;
1595                 ++m_pos_NameID;
1596                 m_pos_EncryptedID=m_pos_NameID;
1597                 ++m_pos_EncryptedID;
1598             }
1599         public:
1600             virtual ~NameIDMappingResponseImpl() { }
1601     
1602             NameIDMappingResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
1603                 : AbstractXMLObject(nsURI, localName, prefix, schemaType)
1604             {
1605                 init();
1606             }
1607                 
1608             NameIDMappingResponseImpl(const NameIDMappingResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
1609                 init();
1610
1611                 if (src.getNameID())
1612                     setNameID(getNameID()->cloneNameID());
1613                 if (src.getEncryptedID())
1614                     setEncryptedID(getEncryptedID()->cloneEncryptedID());
1615
1616             }
1617             
1618             IMPL_XMLOBJECT_CLONE(NameIDMappingResponse);
1619             StatusResponseType* cloneStatusResponseType() const {
1620                 return cloneNameIDMappingResponse();
1621             }
1622
1623             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
1624             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
1625     
1626         protected:
1627             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1628                 PROC_TYPED_FOREIGN_CHILD(NameID,saml2,SAML20_NS,false);
1629                 PROC_TYPED_FOREIGN_CHILD(EncryptedID,saml2,SAML20_NS,false);
1630                 StatusResponseTypeImpl::processChildElement(childXMLObject,root);
1631             }
1632         };
1633     };
1634 };
1635
1636 #if defined (_MSC_VER)
1637     #pragma warning( pop )
1638 #endif
1639
1640 // Builder Implementations
1641 IMPL_XMLOBJECTBUILDER(Artifact);
1642 IMPL_XMLOBJECTBUILDER(ArtifactResolve);
1643 IMPL_XMLOBJECTBUILDER(ArtifactResponse);
1644 IMPL_XMLOBJECTBUILDER(AssertionIDRequest);
1645 IMPL_XMLOBJECTBUILDER(AttributeQuery);
1646 IMPL_XMLOBJECTBUILDER(AuthnQuery);
1647 IMPL_XMLOBJECTBUILDER(AuthnRequest);
1648 IMPL_XMLOBJECTBUILDER(AuthzDecisionQuery);
1649 IMPL_XMLOBJECTBUILDER(Extensions);
1650 IMPL_XMLOBJECTBUILDER(GetComplete);
1651 IMPL_XMLOBJECTBUILDER(IDPEntry);
1652 IMPL_XMLOBJECTBUILDER(IDPList);
1653 IMPL_XMLOBJECTBUILDER(LogoutRequest);
1654 IMPL_XMLOBJECTBUILDER(LogoutResponse);
1655 IMPL_XMLOBJECTBUILDER(ManageNameIDRequest);
1656 IMPL_XMLOBJECTBUILDER(ManageNameIDResponse);
1657 IMPL_XMLOBJECTBUILDER(NameIDMappingRequest);
1658 IMPL_XMLOBJECTBUILDER(NameIDMappingResponse);
1659 IMPL_XMLOBJECTBUILDER(NameIDPolicy);
1660 IMPL_XMLOBJECTBUILDER(NewEncryptedID);
1661 IMPL_XMLOBJECTBUILDER(NewID);
1662 IMPL_XMLOBJECTBUILDER(RequestedAuthnContext);
1663 IMPL_XMLOBJECTBUILDER(RequesterID);
1664 IMPL_XMLOBJECTBUILDER(Response);
1665 IMPL_XMLOBJECTBUILDER(Scoping);
1666 IMPL_XMLOBJECTBUILDER(SessionIndex);
1667 IMPL_XMLOBJECTBUILDER(Status);
1668 IMPL_XMLOBJECTBUILDER(StatusCode);
1669 IMPL_XMLOBJECTBUILDER(StatusDetail);
1670 IMPL_XMLOBJECTBUILDER(StatusMessage);
1671 IMPL_XMLOBJECTBUILDER(Terminate);
1672
1673 IMPL_XMLOBJECTBUILDER(RespondTo);
1674
1675 // Unicode literals
1676 const XMLCh Artifact::LOCAL_NAME[] = UNICODE_LITERAL_8(A,r,t,i,f,a,c,t);
1677 const XMLCh ArtifactResolve::LOCAL_NAME[] = UNICODE_LITERAL_15(A,r,t,i,f,a,c,t,R,e,s,o,l,v,e);
1678 const XMLCh ArtifactResolve::TYPE_NAME[] = UNICODE_LITERAL_19(A,r,t,i,f,a,c,t,R,e,s,o,l,v,e,T,y,p,e);
1679 const XMLCh ArtifactResponse::LOCAL_NAME[] = UNICODE_LITERAL_16(A,r,t,i,f,a,c,t,R,e,s,p,o,n,s,e);
1680 const XMLCh ArtifactResponse::TYPE_NAME[] = UNICODE_LITERAL_20(A,r,t,i,f,a,c,t,R,e,s,p,o,n,s,e,T,y,p,e);
1681 const XMLCh AssertionIDRequest::LOCAL_NAME[] = UNICODE_LITERAL_18(A,s,s,e,r,t,i,o,n,I,D,R,e,q,u,e,s,t);
1682 const XMLCh AssertionIDRequest::TYPE_NAME[] = UNICODE_LITERAL_22(A,s,s,e,r,t,i,o,n,I,D,R,e,q,u,e,s,t,T,y,p,e);
1683 const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
1684 const XMLCh AttributeQuery::TYPE_NAME[] = UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,Q,u,e,r,y,T,y,p,e);
1685 const XMLCh AuthnQuery::LOCAL_NAME[] = UNICODE_LITERAL_10(A,u,t,h,n,Q,u,e,r,y);
1686 const XMLCh AuthnQuery::TYPE_NAME[] = UNICODE_LITERAL_14(A,u,t,h,n,Q,u,e,r,y,T,y,p,e);
1687 const XMLCh AuthnQuery::SESSIONINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_12(S,e,s,s,i,o,n,I,n,d,e,x);
1688 const XMLCh AuthnRequest::LOCAL_NAME[] = UNICODE_LITERAL_12(A,u,t,h,n,R,e,q,u,e,s,t);
1689 const XMLCh AuthnRequest::TYPE_NAME[] = UNICODE_LITERAL_16(A,u,t,h,n,R,e,q,u,e,s,t,T,y,p,e);
1690 const XMLCh AuthnRequest::FORCEAUTHN_ATTRIB_NAME[] = UNICODE_LITERAL_10(F,o,r,c,e,A,u,t,h,n);
1691 const XMLCh AuthnRequest::ISPASSIVE_ATTRIB_NAME[] = UNICODE_LITERAL_9(I,s,P,a,s,s,i,v,e);
1692 const XMLCh AuthnRequest::PROTOCOLBINDING_ATTRIB_NAME[] = UNICODE_LITERAL_15(P,r,o,t,o,c,o,l,B,i,n,d,i,n,g);
1693 const XMLCh AuthnRequest::ASSERTIONCONSUMERSERVICEINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_29(A,s,s,e,r,t,i,o,n,C,o,n,s,u,m,e,r,S,e,r,v,i,c,e,I,n,d,e,x);
1694 const XMLCh AuthnRequest::ASSERTIONCONSUMERSERVICEURL_ATTRIB_NAME[] = UNICODE_LITERAL_27(A,s,s,e,r,t,i,o,n,C,o,n,s,u,m,e,r,S,e,r,v,i,c,e,U,R,L);
1695 const XMLCh AuthnRequest::ATTRIBUTECONSUMINGSERVICEINDEX_ATTRIB_NAME[] = UNICODE_LITERAL_30(A,t,t,r,i,b,u,t,e,C,o,n,s,u,m,i,n,g,S,e,r,v,i,c,e,I,n,d,e,x);
1696 const XMLCh AuthnRequest::PROVIDERNAME_ATTRIB_NAME[] = UNICODE_LITERAL_12(P,r,o,v,i,d,e,r,N,a,m,e);
1697 const XMLCh AuthzDecisionQuery::LOCAL_NAME[] = UNICODE_LITERAL_18(A,u,t,h,z,D,e,c,i,s,i,o,n,Q,u,e,r,y);
1698 const XMLCh AuthzDecisionQuery::TYPE_NAME[] = UNICODE_LITERAL_22(A,u,t,h,z,D,e,c,i,s,i,o,n,Q,u,e,r,y,T,y,p,e);
1699 const XMLCh AuthzDecisionQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
1700 const XMLCh Extensions::LOCAL_NAME[] = UNICODE_LITERAL_10(E,x,t,e,n,s,i,o,n,s);
1701 const XMLCh Extensions::TYPE_NAME[] = UNICODE_LITERAL_14(E,x,t,e,n,s,i,o,n,s,T,y,p,e);
1702 const XMLCh GetComplete::LOCAL_NAME[] = UNICODE_LITERAL_11(G,e,t,C,o,m,p,l,e,t,e);
1703 const XMLCh IDPEntry::LOCAL_NAME[] = UNICODE_LITERAL_8(I,D,P,E,n,t,r,y);
1704 const XMLCh IDPEntry::TYPE_NAME[] = UNICODE_LITERAL_12(I,D,P,E,n,t,r,y,T,y,p,e);
1705 const XMLCh IDPEntry::PROVIDERID_ATTRIB_NAME[] = UNICODE_LITERAL_10(P,r,o,v,i,d,e,r,I,D);
1706 const XMLCh IDPEntry::NAME_ATTRIB_NAME[] = UNICODE_LITERAL_4(N,a,m,e);
1707 const XMLCh IDPEntry::LOC_ATTRIB_NAME[] = UNICODE_LITERAL_3(L,o,c);
1708 const XMLCh IDPList::LOCAL_NAME[] = UNICODE_LITERAL_7(I,D,P,L,i,s,t);
1709 const XMLCh IDPList::TYPE_NAME[] = UNICODE_LITERAL_11(I,D,P,L,i,s,t,T,y,p,e);
1710 const XMLCh LogoutRequest::LOCAL_NAME[] = UNICODE_LITERAL_13(L,o,g,o,u,t,R,e,q,u,e,s,t);
1711 const XMLCh LogoutRequest::TYPE_NAME[] = UNICODE_LITERAL_17(L,o,g,o,u,t,R,e,q,u,e,s,t,T,y,p,e);
1712 const XMLCh LogoutRequest::REASON_ATTRIB_NAME[] = UNICODE_LITERAL_6(R,e,a,s,o,n);
1713 const XMLCh LogoutRequest::NOTONORAFTER_ATTRIB_NAME[] = UNICODE_LITERAL_12(N,o,t,O,n,O,r,A,f,t,e,r);
1714 const XMLCh LogoutResponse::LOCAL_NAME[] = UNICODE_LITERAL_14(L,o,g,o,u,t,R,e,s,p,o,n,s,e);
1715 const XMLCh ManageNameIDRequest::LOCAL_NAME[] = UNICODE_LITERAL_19(M,a,n,a,g,e,N,a,m,e,I,D,R,e,q,u,e,s,t);
1716 const XMLCh ManageNameIDRequest::TYPE_NAME[] = UNICODE_LITERAL_23(M,a,n,a,g,e,N,a,m,e,I,D,R,e,q,u,e,s,t,T,y,p,e);
1717 const XMLCh ManageNameIDResponse::LOCAL_NAME[] = UNICODE_LITERAL_20(M,a,n,a,g,e,N,a,m,e,I,D,R,e,s,p,o,n,s,e);
1718 const XMLCh NameIDMappingRequest::LOCAL_NAME[] = UNICODE_LITERAL_20(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,q,u,e,s,t);
1719 const XMLCh NameIDMappingRequest::TYPE_NAME[] = UNICODE_LITERAL_24(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,q,u,e,s,t,T,y,p,e);
1720 const XMLCh NameIDMappingResponse::LOCAL_NAME[] = UNICODE_LITERAL_21(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,s,p,o,n,s,e);
1721 const XMLCh NameIDMappingResponse::TYPE_NAME[] = UNICODE_LITERAL_25(N,a,m,e,I,D,M,a,p,p,i,n,g,R,e,s,p,o,n,s,e,T,y,p,e);
1722 const XMLCh NameIDPolicy::LOCAL_NAME[] = UNICODE_LITERAL_12(N,a,m,e,I,D,P,o,l,i,c,y);
1723 const XMLCh NameIDPolicy::TYPE_NAME[] = UNICODE_LITERAL_16(N,a,m,e,I,D,P,o,l,i,c,y,T,y,p,e);
1724 const XMLCh NameIDPolicy::FORMAT_ATTRIB_NAME[] = UNICODE_LITERAL_6(F,o,r,m,a,t);
1725 const XMLCh NameIDPolicy::SPNAMEQUALIFIER_ATTRIB_NAME[] = UNICODE_LITERAL_15(S,P,N,a,m,e,Q,u,a,l,i,f,i,e,r);
1726 const XMLCh NameIDPolicy::ALLOWCREATE_ATTRIB_NAME[] = UNICODE_LITERAL_11(A,l,l,o,w,C,r,e,a,t,e);
1727 const XMLCh NewEncryptedID::LOCAL_NAME[] = UNICODE_LITERAL_14(N,e,w,E,n,c,r,y,p,t,e,d,I,D);
1728 const XMLCh NewID::LOCAL_NAME[] = UNICODE_LITERAL_5(N,e,w,I,D);
1729 const XMLCh RequesterID::LOCAL_NAME[] = UNICODE_LITERAL_11(R,e,q,u,e,s,t,e,r,I,D);
1730 const XMLCh RequestedAuthnContext::LOCAL_NAME[] = UNICODE_LITERAL_21(R,e,q,u,e,s,t,e,d,A,u,t,h,n,C,o,n,t,e,x,t);
1731 const XMLCh RequestedAuthnContext::TYPE_NAME[] = UNICODE_LITERAL_25(R,e,q,u,e,s,t,e,d,A,u,t,h,n,C,o,n,t,e,x,t,T,y,p,e);
1732 const XMLCh RequestedAuthnContext::COMPARISON_ATTRIB_NAME[] = UNICODE_LITERAL_10(C,o,m,p,a,r,i,s,o,n);
1733 const XMLCh RequestedAuthnContext::COMPARISON_EXACT[] = UNICODE_LITERAL_5(e,x,a,c,t);
1734 const XMLCh RequestedAuthnContext::COMPARISON_MINIMUM[] = UNICODE_LITERAL_7(m,i,n,i,m,u,m);
1735 const XMLCh RequestedAuthnContext::COMPARISON_MAXIMUM[] = UNICODE_LITERAL_7(m,a,x,i,m,u,m);
1736 const XMLCh RequestedAuthnContext::COMPARISON_BETTER[] = UNICODE_LITERAL_6(b,e,t,t,e,r);
1737 const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull};
1738 const XMLCh RequestAbstractType::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,q,u,e,s,t,A,b,s,t,r,a,c,t,T,y,p,e);
1739 const XMLCh RequestAbstractType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
1740 const XMLCh RequestAbstractType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
1741 const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1742 const XMLCh RequestAbstractType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
1743 const XMLCh RequestAbstractType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
1744 const XMLCh RespondTo::LOCAL_NAME[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,T,o);
1745 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
1746 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
1747 const XMLCh Scoping::LOCAL_NAME[] = UNICODE_LITERAL_7(S,c,o,p,i,n,g);
1748 const XMLCh Scoping::TYPE_NAME[] = UNICODE_LITERAL_11(S,c,o,p,i,n,g,T,y,p,e);
1749 const XMLCh Scoping::PROXYCOUNT_ATTRIB_NAME[] = UNICODE_LITERAL_10(P,r,o,x,y,C,o,u,n,t);
1750 const XMLCh SessionIndex::LOCAL_NAME[] = UNICODE_LITERAL_12(S,e,s,s,i,o,n,I,n,d,e,x);
1751 const XMLCh Status::LOCAL_NAME[] = UNICODE_LITERAL_6(S,t,a,t,u,s);
1752 const XMLCh Status::TYPE_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,T,y,p,e);
1753 const XMLCh StatusCode::LOCAL_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
1754 const XMLCh StatusCode::TYPE_NAME[] = UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
1755 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
1756 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
1757 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
1758 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
1759 const XMLCh StatusResponseType::LOCAL_NAME[] = {chNull};
1760 const XMLCh StatusResponseType::TYPE_NAME[] = UNICODE_LITERAL_18(S,t,a,t,u,s,R,e,s,p,o,n,s,e,T,y,p,e);
1761 const XMLCh StatusResponseType::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
1762 const XMLCh StatusResponseType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
1763 const XMLCh StatusResponseType::VER_ATTRIB_NAME[] = UNICODE_LITERAL_7(V,e,r,s,i,o,n);
1764 const XMLCh StatusResponseType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1765 const XMLCh StatusResponseType::DESTINATION_ATTRIB_NAME[] = UNICODE_LITERAL_11(D,e,s,t,i,n,a,t,i,o,n);
1766 const XMLCh StatusResponseType::CONSENT_ATTRIB_NAME[] = UNICODE_LITERAL_7(C,o,n,s,e,n,t);
1767 const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
1768 const XMLCh SubjectQuery::TYPE_NAME[] = UNICODE_LITERAL_24(S,u,b,j,e,c,t,Q,u,e,r,y,A,b,s,t,r,a,c,t,T,y,p,e);
1769 const XMLCh Terminate::LOCAL_NAME[] = UNICODE_LITERAL_9(T,e,r,m,i,n,a,t,e);
1770 const XMLCh Terminate::TYPE_NAME[] = UNICODE_LITERAL_13(T,e,r,m,i,n,a,t,e,T,y,p,e);
1771
1772 // Unicode literals: LogoutRequest element, Reason attribute
1773 const XMLCh LogoutRequest::REASON_USER[] = // urn:oasis:names:tc:SAML:2.0:logout:user
1774 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1775   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1776   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1777   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1778   chLatin_u, chLatin_s, chLatin_e, chLatin_r, chNull
1779 };
1780
1781 const XMLCh LogoutRequest::REASON_ADMIN[] = // urn:oasis:names:tc:SAML:2.0:logout:admin
1782 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1783   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1784   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1785   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1786   chLatin_a, chLatin_d, chLatin_m, chLatin_i, chLatin_n, chNull
1787 };
1788
1789
1790 const XMLCh LogoutRequest::REASON_GLOBAL_TIMEOUT[] = // urn:oasis:names:tc:SAML:2.0:logout:global-timeout
1791 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1792   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1793   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1794   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1795   chLatin_g, chLatin_l, chLatin_o, chLatin_b, chLatin_a, chLatin_l, 
1796     chDash, chLatin_t, chLatin_i, chLatin_m, chLatin_e, chLatin_o, chLatin_u, chLatin_t, chNull
1797 };
1798
1799
1800 const XMLCh LogoutRequest::REASON_SP_TIMEOUT[] = // urn:oasis:names:tc:SAML:2.0:logout:sp-timeout
1801 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1802   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1803   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1804   chLatin_l, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chColon,
1805   chLatin_s, chLatin_p, chDash, chLatin_t, chLatin_i, chLatin_m, chLatin_e, chLatin_o, chLatin_u, chLatin_t, chNull
1806 };
1807
1808
1809 // Unicode literals, StatusCode Value
1810 const XMLCh StatusCode::SUCCESS[] = //  urn:oasis:names:tc:SAML:2.0:status:Success 
1811 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1812   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1813   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1814   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1815   chLatin_S, chLatin_u, chLatin_c, chLatin_c, chLatin_e, chLatin_s, chLatin_s, chNull
1816 };
1817
1818 const XMLCh StatusCode::REQUESTER[] = //  urn:oasis:names:tc:SAML:2.0:status:Requester 
1819 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1820   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1821   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1822   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1823   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, chLatin_e, chLatin_r, chNull
1824 };
1825
1826 const XMLCh StatusCode::RESPONDER[] = //  urn:oasis:names:tc:SAML:2.0:status:Responder 
1827 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1828   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1829   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1830   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1831   chLatin_R, chLatin_e, chLatin_s, chLatin_p, chLatin_o, chLatin_n, chLatin_d, chLatin_e, chLatin_r, chNull
1832 };
1833
1834 const XMLCh StatusCode::VERSION_MISMATCH[] = //  urn:oasis:names:tc:SAML:2.0:status:VersionMismatch 
1835 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1836   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1837   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1838   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1839   chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n,
1840     chLatin_M, chLatin_i, chLatin_s, chLatin_m, chLatin_a, chLatin_t, chLatin_c, chLatin_h, chNull
1841 };
1842
1843 const XMLCh StatusCode::AUTHN_FAILED[] = //  urn:oasis:names:tc:SAML:2.0:status:AuthnFailed 
1844 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1845   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1846   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1847   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1848   chLatin_A, chLatin_u, chLatin_t, chLatin_h, chLatin_n,
1849     chLatin_F, chLatin_a, chLatin_i, chLatin_l, chLatin_e, chLatin_d, chNull
1850 };
1851
1852 const XMLCh StatusCode::INVALID_ATTR_NAME_OR_VALUE[] = //  urn:oasis:names:tc:SAML:2.0:status:InvalidAttrNameOrValue 
1853 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1854   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1855   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1856   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1857   chLatin_I, chLatin_n, chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, 
1858     chLatin_A, chLatin_t, chLatin_t, chLatin_r, chLatin_N, chLatin_a, chLatin_m, chLatin_e, 
1859     chLatin_O, chLatin_r, chLatin_V, chLatin_a, chLatin_l, chLatin_u, chLatin_e, chNull
1860 };
1861
1862 const XMLCh StatusCode::INVALID_NAMEID_POLICY[] = //  urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy 
1863 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1864   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1865   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1866   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1867   chLatin_I, chLatin_n, chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, 
1868    chLatin_N, chLatin_a, chLatin_m, chLatin_e, chLatin_I, chLatin_D, 
1869    chLatin_P, chLatin_o, chLatin_l, chLatin_i, chLatin_c, chLatin_y, chNull
1870 };
1871
1872 const XMLCh StatusCode::NO_AUTHN_CONTEXT[] = //  urn:oasis:names:tc:SAML:2.0:status:NoAuthnContext 
1873 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1874   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1875   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1876   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1877   chLatin_N, chLatin_o, chLatin_A, chLatin_u, chLatin_t, chLatin_h, chLatin_n, 
1878   chLatin_C, chLatin_o, chLatin_n, chLatin_t, chLatin_e, chLatin_x, chLatin_t, chNull
1879 };
1880
1881 const XMLCh StatusCode::NO_AVAILABLE_IDP[] = //  urn:oasis:names:tc:SAML:2.0:status:NoAvailableIDP 
1882 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1883   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1884   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1885   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1886   chLatin_N, chLatin_o, chLatin_A, chLatin_v, chLatin_a, chLatin_i, chLatin_l, chLatin_a, chLatin_b, chLatin_l, chLatin_e, 
1887    chLatin_I, chLatin_D, chLatin_P, chNull
1888 };
1889
1890 const XMLCh StatusCode::NO_PASSIVE[] = //  urn:oasis:names:tc:SAML:2.0:status:NoPassive 
1891 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1892   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1893   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1894   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1895   chLatin_N, chLatin_o, chLatin_P, chLatin_a, chLatin_s, chLatin_s, chLatin_i, chLatin_v, chLatin_e, chNull
1896 };
1897
1898 const XMLCh StatusCode::NO_SUPPORTED_IDP[] = //  urn:oasis:names:tc:SAML:2.0:status:NoSupportedIDP 
1899 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1900   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1901   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1902   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1903   chLatin_N, chLatin_o, chLatin_S, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d,
1904       chLatin_I, chLatin_D, chLatin_P, chNull
1905 };
1906
1907 const XMLCh StatusCode::PARTIAL_LOGOUT[] = //  urn:oasis:names:tc:SAML:2.0:status:PartialLogout 
1908 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1909   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1910   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1911   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1912   chLatin_P, chLatin_a, chLatin_r, chLatin_t, chLatin_i, chLatin_a, chLatin_l, 
1913     chLatin_L, chLatin_o, chLatin_g, chLatin_o, chLatin_u, chLatin_t, chNull
1914 };
1915
1916 const XMLCh StatusCode::PROXY_COUNT_EXCEEDED[] = //  urn:oasis:names:tc:SAML:2.0:status:ProxyCountExceeded 
1917 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1918   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1919   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1920   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1921   chLatin_P, chLatin_r, chLatin_o, chLatin_x, chLatin_y, chLatin_C, chLatin_o, chLatin_u, chLatin_n, chLatin_t, 
1922     chLatin_E, chLatin_x, chLatin_c, chLatin_e, chLatin_e, chLatin_d, chLatin_e, chLatin_d, chNull
1923 };
1924
1925 const XMLCh StatusCode::REQUEST_DENIED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestDenied 
1926 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1927   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1928   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1929   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1930   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1931     chLatin_D, chLatin_e, chLatin_n, chLatin_i, chLatin_e, chLatin_d, chNull
1932 };
1933
1934 const XMLCh StatusCode::REQUEST_UNSUPPORTED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported 
1935 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1936   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1937   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1938   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1939   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1940     chLatin_U, chLatin_n, chLatin_s, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d, chNull
1941 };
1942
1943 const XMLCh StatusCode::REQUEST_VERSION_DEPRECATED[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionDeprecated 
1944 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1945   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1946   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1947   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1948   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1949     chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1950     chLatin_D, chLatin_e, chLatin_p, chLatin_r, chLatin_e, chLatin_c, chLatin_a, chLatin_t, chLatin_e, chLatin_d, chNull
1951 };
1952
1953 const XMLCh StatusCode::REQUEST_VERSION_TOO_HIGH[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooHigh 
1954 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1955   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1956   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1957   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1958   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1959   chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1960   chLatin_T, chLatin_o, chLatin_o, chLatin_H, chLatin_i, chLatin_g, chLatin_h, chNull
1961 };
1962
1963 const XMLCh StatusCode::REQUEST_VERSION_TOO_LOW[] = //  urn:oasis:names:tc:SAML:2.0:status:RequestVersionTooLow 
1964 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1965   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1966   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1967   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1968   chLatin_R, chLatin_e, chLatin_q, chLatin_u, chLatin_e, chLatin_s, chLatin_t, 
1969     chLatin_V, chLatin_e, chLatin_r, chLatin_s, chLatin_i, chLatin_o, chLatin_n, 
1970     chLatin_T, chLatin_o, chLatin_o, chLatin_L, chLatin_o, chLatin_w, chNull
1971 };
1972
1973 const XMLCh StatusCode::RESOURCE_NOT_RECOGNIZED[] = //  urn:oasis:names:tc:SAML:2.0:status:ResourceNotRecognized 
1974 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1975   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1976   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1977   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1978   chLatin_R, chLatin_e, chLatin_s, chLatin_o, chLatin_u, chLatin_r, chLatin_c, chLatin_e, 
1979     chLatin_N, chLatin_o, chLatin_t, 
1980     chLatin_R, chLatin_e, chLatin_c, chLatin_o, chLatin_g, chLatin_n, chLatin_i, chLatin_z, chLatin_e, chLatin_d, chNull
1981 };
1982
1983 const XMLCh StatusCode::TOO_MANY_RESPONSES[] = //  urn:oasis:names:tc:SAML:2.0:status:TooManyResponses 
1984 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1985   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1986   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1987   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1988   chLatin_T, chLatin_o, chLatin_o, chLatin_M, chLatin_a, chLatin_n, chLatin_y, 
1989     chLatin_R, chLatin_e, chLatin_s, chLatin_p, chLatin_o, chLatin_n, chLatin_s, chLatin_e, chLatin_s, chNull
1990 };
1991
1992 const XMLCh StatusCode::UNKNOWN_ATTR_PROFILE[] = //  urn:oasis:names:tc:SAML:2.0:status:UnknownAttrProfile 
1993 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
1994   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
1995   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
1996   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
1997   chLatin_U, chLatin_n, chLatin_k, chLatin_n, chLatin_o, chLatin_w, chLatin_n, 
1998     chLatin_A, chLatin_t, chLatin_t, chLatin_r, 
1999     chLatin_P, chLatin_r, chLatin_o, chLatin_f, chLatin_i, chLatin_l, chLatin_e, chNull
2000 };
2001
2002 const XMLCh StatusCode::UNKNOWN_PRINCIPAL[] = //  urn:oasis:names:tc:SAML:2.0:status:UnknownPrincipal 
2003 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2004   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2005   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2006   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2007   chLatin_U, chLatin_n, chLatin_k, chLatin_n, chLatin_o, chLatin_w, chLatin_n, 
2008     chLatin_P, chLatin_r, chLatin_i, chLatin_n, chLatin_c, chLatin_i, chLatin_p, chLatin_a, chLatin_l, chNull
2009 };
2010
2011 const XMLCh StatusCode::UNSUPPORTED_BINDING[] = //  urn:oasis:names:tc:SAML:2.0:status:UnsupportedBinding 
2012 { chLatin_u, chLatin_r, chLatin_n, chColon, chLatin_o, chLatin_a, chLatin_s, chLatin_i, chLatin_s, chColon,
2013   chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chColon, chLatin_t, chLatin_c, chColon,
2014   chLatin_S, chLatin_A, chLatin_M, chLatin_L, chColon, chDigit_2, chPeriod, chDigit_0, chColon,
2015   chLatin_s, chLatin_t, chLatin_a, chLatin_t, chLatin_u, chLatin_s, chColon,
2016   chLatin_U, chLatin_n, chLatin_s, chLatin_u, chLatin_p, chLatin_p, chLatin_o, chLatin_r, chLatin_t, chLatin_e, chLatin_d, 
2017     chLatin_B, chLatin_i, chLatin_n, chLatin_d, chLatin_i, chLatin_n, chLatin_g, chNull
2018 };
2019