﻿//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.225
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace DotCMIS.CMISWebServicesReference {
    
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisFaultType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private enumServiceException typeField;
        
        private string codeField;
        
        private string messageField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public enumServiceException type {
            get {
                return this.typeField;
            }
            set {
                this.typeField = value;
                this.RaisePropertyChanged("type");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=1)]
        public string code {
            get {
                return this.codeField;
            }
            set {
                this.codeField = value;
                this.RaisePropertyChanged("code");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public string message {
            get {
                return this.messageField;
            }
            set {
                this.messageField = value;
                this.RaisePropertyChanged("message");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public enum enumServiceException {
        
        /// <remarks/>
        constraint,
        
        /// <remarks/>
        nameConstraintViolation,
        
        /// <remarks/>
        contentAlreadyExists,
        
        /// <remarks/>
        filterNotValid,
        
        /// <remarks/>
        invalidArgument,
        
        /// <remarks/>
        notSupported,
        
        /// <remarks/>
        objectNotFound,
        
        /// <remarks/>
        permissionDenied,
        
        /// <remarks/>
        runtime,
        
        /// <remarks/>
        storage,
        
        /// <remarks/>
        streamNotSupported,
        
        /// <remarks/>
        updateConflict,
        
        /// <remarks/>
        versioning,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisRenditionType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string streamIdField;
        
        private string mimetypeField;
        
        private string lengthField;
        
        private string kindField;
        
        private string titleField;
        
        private string heightField;
        
        private string widthField;
        
        private string renditionDocumentIdField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string streamId {
            get {
                return this.streamIdField;
            }
            set {
                this.streamIdField = value;
                this.RaisePropertyChanged("streamId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string mimetype {
            get {
                return this.mimetypeField;
            }
            set {
                this.mimetypeField = value;
                this.RaisePropertyChanged("mimetype");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
        public string length {
            get {
                return this.lengthField;
            }
            set {
                this.lengthField = value;
                this.RaisePropertyChanged("length");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public string kind {
            get {
                return this.kindField;
            }
            set {
                this.kindField = value;
                this.RaisePropertyChanged("kind");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public string title {
            get {
                return this.titleField;
            }
            set {
                this.titleField = value;
                this.RaisePropertyChanged("title");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=5)]
        public string height {
            get {
                return this.heightField;
            }
            set {
                this.heightField = value;
                this.RaisePropertyChanged("height");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=6)]
        public string width {
            get {
                return this.widthField;
            }
            set {
                this.widthField = value;
                this.RaisePropertyChanged("width");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
        public string renditionDocumentId {
            get {
                return this.renditionDocumentIdField;
            }
            set {
                this.renditionDocumentIdField = value;
                this.RaisePropertyChanged("renditionDocumentId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=8)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisListOfIdsType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string[] idField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("id", Order=0)]
        public string[] id {
            get {
                return this.idField;
            }
            set {
                this.idField = value;
                this.RaisePropertyChanged("id");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisAccessControlPrincipalType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string principalIdField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string principalId {
            get {
                return this.principalIdField;
            }
            set {
                this.principalIdField = value;
                this.RaisePropertyChanged("principalId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisAccessControlEntryType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisAccessControlPrincipalType principalField;
        
        private string[] permissionField;
        
        private bool directField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisAccessControlPrincipalType principal {
            get {
                return this.principalField;
            }
            set {
                this.principalField = value;
                this.RaisePropertyChanged("principal");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("permission", Order=1)]
        public string[] permission {
            get {
                return this.permissionField;
            }
            set {
                this.permissionField = value;
                this.RaisePropertyChanged("permission");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public bool direct {
            get {
                return this.directField;
            }
            set {
                this.directField = value;
                this.RaisePropertyChanged("direct");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisAccessControlListType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisAccessControlEntryType[] permissionField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("permission", Order=0)]
        public cmisAccessControlEntryType[] permission {
            get {
                return this.permissionField;
            }
            set {
                this.permissionField = value;
                this.RaisePropertyChanged("permission");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChangeEventType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private enumTypeOfChanges changeTypeField;
        
        private System.DateTime changeTimeField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public enumTypeOfChanges changeType {
            get {
                return this.changeTypeField;
            }
            set {
                this.changeTypeField = value;
                this.RaisePropertyChanged("changeType");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public System.DateTime changeTime {
            get {
                return this.changeTimeField;
            }
            set {
                this.changeTimeField = value;
                this.RaisePropertyChanged("changeTime");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumTypeOfChanges {
        
        /// <remarks/>
        created,
        
        /// <remarks/>
        updated,
        
        /// <remarks/>
        deleted,
        
        /// <remarks/>
        security,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisAllowableActionsType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private bool canDeleteObjectField;
        
        private bool canDeleteObjectFieldSpecified;
        
        private bool canUpdatePropertiesField;
        
        private bool canUpdatePropertiesFieldSpecified;
        
        private bool canGetFolderTreeField;
        
        private bool canGetFolderTreeFieldSpecified;
        
        private bool canGetPropertiesField;
        
        private bool canGetPropertiesFieldSpecified;
        
        private bool canGetObjectRelationshipsField;
        
        private bool canGetObjectRelationshipsFieldSpecified;
        
        private bool canGetObjectParentsField;
        
        private bool canGetObjectParentsFieldSpecified;
        
        private bool canGetFolderParentField;
        
        private bool canGetFolderParentFieldSpecified;
        
        private bool canGetDescendantsField;
        
        private bool canGetDescendantsFieldSpecified;
        
        private bool canMoveObjectField;
        
        private bool canMoveObjectFieldSpecified;
        
        private bool canDeleteContentStreamField;
        
        private bool canDeleteContentStreamFieldSpecified;
        
        private bool canCheckOutField;
        
        private bool canCheckOutFieldSpecified;
        
        private bool canCancelCheckOutField;
        
        private bool canCancelCheckOutFieldSpecified;
        
        private bool canCheckInField;
        
        private bool canCheckInFieldSpecified;
        
        private bool canSetContentStreamField;
        
        private bool canSetContentStreamFieldSpecified;
        
        private bool canGetAllVersionsField;
        
        private bool canGetAllVersionsFieldSpecified;
        
        private bool canAddObjectToFolderField;
        
        private bool canAddObjectToFolderFieldSpecified;
        
        private bool canRemoveObjectFromFolderField;
        
        private bool canRemoveObjectFromFolderFieldSpecified;
        
        private bool canGetContentStreamField;
        
        private bool canGetContentStreamFieldSpecified;
        
        private bool canApplyPolicyField;
        
        private bool canApplyPolicyFieldSpecified;
        
        private bool canGetAppliedPoliciesField;
        
        private bool canGetAppliedPoliciesFieldSpecified;
        
        private bool canRemovePolicyField;
        
        private bool canRemovePolicyFieldSpecified;
        
        private bool canGetChildrenField;
        
        private bool canGetChildrenFieldSpecified;
        
        private bool canCreateDocumentField;
        
        private bool canCreateDocumentFieldSpecified;
        
        private bool canCreateFolderField;
        
        private bool canCreateFolderFieldSpecified;
        
        private bool canCreateRelationshipField;
        
        private bool canCreateRelationshipFieldSpecified;
        
        private bool canDeleteTreeField;
        
        private bool canDeleteTreeFieldSpecified;
        
        private bool canGetRenditionsField;
        
        private bool canGetRenditionsFieldSpecified;
        
        private bool canGetACLField;
        
        private bool canGetACLFieldSpecified;
        
        private bool canApplyACLField;
        
        private bool canApplyACLFieldSpecified;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public bool canDeleteObject {
            get {
                return this.canDeleteObjectField;
            }
            set {
                this.canDeleteObjectField = value;
                this.RaisePropertyChanged("canDeleteObject");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canDeleteObjectSpecified {
            get {
                return this.canDeleteObjectFieldSpecified;
            }
            set {
                this.canDeleteObjectFieldSpecified = value;
                this.RaisePropertyChanged("canDeleteObjectSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public bool canUpdateProperties {
            get {
                return this.canUpdatePropertiesField;
            }
            set {
                this.canUpdatePropertiesField = value;
                this.RaisePropertyChanged("canUpdateProperties");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canUpdatePropertiesSpecified {
            get {
                return this.canUpdatePropertiesFieldSpecified;
            }
            set {
                this.canUpdatePropertiesFieldSpecified = value;
                this.RaisePropertyChanged("canUpdatePropertiesSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public bool canGetFolderTree {
            get {
                return this.canGetFolderTreeField;
            }
            set {
                this.canGetFolderTreeField = value;
                this.RaisePropertyChanged("canGetFolderTree");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetFolderTreeSpecified {
            get {
                return this.canGetFolderTreeFieldSpecified;
            }
            set {
                this.canGetFolderTreeFieldSpecified = value;
                this.RaisePropertyChanged("canGetFolderTreeSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public bool canGetProperties {
            get {
                return this.canGetPropertiesField;
            }
            set {
                this.canGetPropertiesField = value;
                this.RaisePropertyChanged("canGetProperties");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetPropertiesSpecified {
            get {
                return this.canGetPropertiesFieldSpecified;
            }
            set {
                this.canGetPropertiesFieldSpecified = value;
                this.RaisePropertyChanged("canGetPropertiesSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public bool canGetObjectRelationships {
            get {
                return this.canGetObjectRelationshipsField;
            }
            set {
                this.canGetObjectRelationshipsField = value;
                this.RaisePropertyChanged("canGetObjectRelationships");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetObjectRelationshipsSpecified {
            get {
                return this.canGetObjectRelationshipsFieldSpecified;
            }
            set {
                this.canGetObjectRelationshipsFieldSpecified = value;
                this.RaisePropertyChanged("canGetObjectRelationshipsSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public bool canGetObjectParents {
            get {
                return this.canGetObjectParentsField;
            }
            set {
                this.canGetObjectParentsField = value;
                this.RaisePropertyChanged("canGetObjectParents");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetObjectParentsSpecified {
            get {
                return this.canGetObjectParentsFieldSpecified;
            }
            set {
                this.canGetObjectParentsFieldSpecified = value;
                this.RaisePropertyChanged("canGetObjectParentsSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public bool canGetFolderParent {
            get {
                return this.canGetFolderParentField;
            }
            set {
                this.canGetFolderParentField = value;
                this.RaisePropertyChanged("canGetFolderParent");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetFolderParentSpecified {
            get {
                return this.canGetFolderParentFieldSpecified;
            }
            set {
                this.canGetFolderParentFieldSpecified = value;
                this.RaisePropertyChanged("canGetFolderParentSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
        public bool canGetDescendants {
            get {
                return this.canGetDescendantsField;
            }
            set {
                this.canGetDescendantsField = value;
                this.RaisePropertyChanged("canGetDescendants");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetDescendantsSpecified {
            get {
                return this.canGetDescendantsFieldSpecified;
            }
            set {
                this.canGetDescendantsFieldSpecified = value;
                this.RaisePropertyChanged("canGetDescendantsSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
        public bool canMoveObject {
            get {
                return this.canMoveObjectField;
            }
            set {
                this.canMoveObjectField = value;
                this.RaisePropertyChanged("canMoveObject");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canMoveObjectSpecified {
            get {
                return this.canMoveObjectFieldSpecified;
            }
            set {
                this.canMoveObjectFieldSpecified = value;
                this.RaisePropertyChanged("canMoveObjectSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
        public bool canDeleteContentStream {
            get {
                return this.canDeleteContentStreamField;
            }
            set {
                this.canDeleteContentStreamField = value;
                this.RaisePropertyChanged("canDeleteContentStream");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canDeleteContentStreamSpecified {
            get {
                return this.canDeleteContentStreamFieldSpecified;
            }
            set {
                this.canDeleteContentStreamFieldSpecified = value;
                this.RaisePropertyChanged("canDeleteContentStreamSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
        public bool canCheckOut {
            get {
                return this.canCheckOutField;
            }
            set {
                this.canCheckOutField = value;
                this.RaisePropertyChanged("canCheckOut");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canCheckOutSpecified {
            get {
                return this.canCheckOutFieldSpecified;
            }
            set {
                this.canCheckOutFieldSpecified = value;
                this.RaisePropertyChanged("canCheckOutSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
        public bool canCancelCheckOut {
            get {
                return this.canCancelCheckOutField;
            }
            set {
                this.canCancelCheckOutField = value;
                this.RaisePropertyChanged("canCancelCheckOut");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canCancelCheckOutSpecified {
            get {
                return this.canCancelCheckOutFieldSpecified;
            }
            set {
                this.canCancelCheckOutFieldSpecified = value;
                this.RaisePropertyChanged("canCancelCheckOutSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
        public bool canCheckIn {
            get {
                return this.canCheckInField;
            }
            set {
                this.canCheckInField = value;
                this.RaisePropertyChanged("canCheckIn");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canCheckInSpecified {
            get {
                return this.canCheckInFieldSpecified;
            }
            set {
                this.canCheckInFieldSpecified = value;
                this.RaisePropertyChanged("canCheckInSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
        public bool canSetContentStream {
            get {
                return this.canSetContentStreamField;
            }
            set {
                this.canSetContentStreamField = value;
                this.RaisePropertyChanged("canSetContentStream");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canSetContentStreamSpecified {
            get {
                return this.canSetContentStreamFieldSpecified;
            }
            set {
                this.canSetContentStreamFieldSpecified = value;
                this.RaisePropertyChanged("canSetContentStreamSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=14)]
        public bool canGetAllVersions {
            get {
                return this.canGetAllVersionsField;
            }
            set {
                this.canGetAllVersionsField = value;
                this.RaisePropertyChanged("canGetAllVersions");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetAllVersionsSpecified {
            get {
                return this.canGetAllVersionsFieldSpecified;
            }
            set {
                this.canGetAllVersionsFieldSpecified = value;
                this.RaisePropertyChanged("canGetAllVersionsSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=15)]
        public bool canAddObjectToFolder {
            get {
                return this.canAddObjectToFolderField;
            }
            set {
                this.canAddObjectToFolderField = value;
                this.RaisePropertyChanged("canAddObjectToFolder");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canAddObjectToFolderSpecified {
            get {
                return this.canAddObjectToFolderFieldSpecified;
            }
            set {
                this.canAddObjectToFolderFieldSpecified = value;
                this.RaisePropertyChanged("canAddObjectToFolderSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=16)]
        public bool canRemoveObjectFromFolder {
            get {
                return this.canRemoveObjectFromFolderField;
            }
            set {
                this.canRemoveObjectFromFolderField = value;
                this.RaisePropertyChanged("canRemoveObjectFromFolder");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canRemoveObjectFromFolderSpecified {
            get {
                return this.canRemoveObjectFromFolderFieldSpecified;
            }
            set {
                this.canRemoveObjectFromFolderFieldSpecified = value;
                this.RaisePropertyChanged("canRemoveObjectFromFolderSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=17)]
        public bool canGetContentStream {
            get {
                return this.canGetContentStreamField;
            }
            set {
                this.canGetContentStreamField = value;
                this.RaisePropertyChanged("canGetContentStream");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetContentStreamSpecified {
            get {
                return this.canGetContentStreamFieldSpecified;
            }
            set {
                this.canGetContentStreamFieldSpecified = value;
                this.RaisePropertyChanged("canGetContentStreamSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=18)]
        public bool canApplyPolicy {
            get {
                return this.canApplyPolicyField;
            }
            set {
                this.canApplyPolicyField = value;
                this.RaisePropertyChanged("canApplyPolicy");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canApplyPolicySpecified {
            get {
                return this.canApplyPolicyFieldSpecified;
            }
            set {
                this.canApplyPolicyFieldSpecified = value;
                this.RaisePropertyChanged("canApplyPolicySpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=19)]
        public bool canGetAppliedPolicies {
            get {
                return this.canGetAppliedPoliciesField;
            }
            set {
                this.canGetAppliedPoliciesField = value;
                this.RaisePropertyChanged("canGetAppliedPolicies");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetAppliedPoliciesSpecified {
            get {
                return this.canGetAppliedPoliciesFieldSpecified;
            }
            set {
                this.canGetAppliedPoliciesFieldSpecified = value;
                this.RaisePropertyChanged("canGetAppliedPoliciesSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=20)]
        public bool canRemovePolicy {
            get {
                return this.canRemovePolicyField;
            }
            set {
                this.canRemovePolicyField = value;
                this.RaisePropertyChanged("canRemovePolicy");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canRemovePolicySpecified {
            get {
                return this.canRemovePolicyFieldSpecified;
            }
            set {
                this.canRemovePolicyFieldSpecified = value;
                this.RaisePropertyChanged("canRemovePolicySpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=21)]
        public bool canGetChildren {
            get {
                return this.canGetChildrenField;
            }
            set {
                this.canGetChildrenField = value;
                this.RaisePropertyChanged("canGetChildren");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetChildrenSpecified {
            get {
                return this.canGetChildrenFieldSpecified;
            }
            set {
                this.canGetChildrenFieldSpecified = value;
                this.RaisePropertyChanged("canGetChildrenSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=22)]
        public bool canCreateDocument {
            get {
                return this.canCreateDocumentField;
            }
            set {
                this.canCreateDocumentField = value;
                this.RaisePropertyChanged("canCreateDocument");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canCreateDocumentSpecified {
            get {
                return this.canCreateDocumentFieldSpecified;
            }
            set {
                this.canCreateDocumentFieldSpecified = value;
                this.RaisePropertyChanged("canCreateDocumentSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=23)]
        public bool canCreateFolder {
            get {
                return this.canCreateFolderField;
            }
            set {
                this.canCreateFolderField = value;
                this.RaisePropertyChanged("canCreateFolder");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canCreateFolderSpecified {
            get {
                return this.canCreateFolderFieldSpecified;
            }
            set {
                this.canCreateFolderFieldSpecified = value;
                this.RaisePropertyChanged("canCreateFolderSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=24)]
        public bool canCreateRelationship {
            get {
                return this.canCreateRelationshipField;
            }
            set {
                this.canCreateRelationshipField = value;
                this.RaisePropertyChanged("canCreateRelationship");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canCreateRelationshipSpecified {
            get {
                return this.canCreateRelationshipFieldSpecified;
            }
            set {
                this.canCreateRelationshipFieldSpecified = value;
                this.RaisePropertyChanged("canCreateRelationshipSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=25)]
        public bool canDeleteTree {
            get {
                return this.canDeleteTreeField;
            }
            set {
                this.canDeleteTreeField = value;
                this.RaisePropertyChanged("canDeleteTree");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canDeleteTreeSpecified {
            get {
                return this.canDeleteTreeFieldSpecified;
            }
            set {
                this.canDeleteTreeFieldSpecified = value;
                this.RaisePropertyChanged("canDeleteTreeSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=26)]
        public bool canGetRenditions {
            get {
                return this.canGetRenditionsField;
            }
            set {
                this.canGetRenditionsField = value;
                this.RaisePropertyChanged("canGetRenditions");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetRenditionsSpecified {
            get {
                return this.canGetRenditionsFieldSpecified;
            }
            set {
                this.canGetRenditionsFieldSpecified = value;
                this.RaisePropertyChanged("canGetRenditionsSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=27)]
        public bool canGetACL {
            get {
                return this.canGetACLField;
            }
            set {
                this.canGetACLField = value;
                this.RaisePropertyChanged("canGetACL");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canGetACLSpecified {
            get {
                return this.canGetACLFieldSpecified;
            }
            set {
                this.canGetACLFieldSpecified = value;
                this.RaisePropertyChanged("canGetACLSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=28)]
        public bool canApplyACL {
            get {
                return this.canApplyACLField;
            }
            set {
                this.canApplyACLField = value;
                this.RaisePropertyChanged("canApplyACL");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool canApplyACLSpecified {
            get {
                return this.canApplyACLFieldSpecified;
            }
            set {
                this.canApplyACLFieldSpecified = value;
                this.RaisePropertyChanged("canApplyACLSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=29)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyUri))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyString))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyHtml))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDecimal))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDateTime))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyInteger))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyId))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyBoolean))]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisProperty : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string propertyDefinitionIdField;
        
        private string localNameField;
        
        private string displayNameField;
        
        private string queryNameField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string propertyDefinitionId {
            get {
                return this.propertyDefinitionIdField;
            }
            set {
                this.propertyDefinitionIdField = value;
                this.RaisePropertyChanged("propertyDefinitionId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string localName {
            get {
                return this.localNameField;
            }
            set {
                this.localNameField = value;
                this.RaisePropertyChanged("localName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string displayName {
            get {
                return this.displayNameField;
            }
            set {
                this.displayNameField = value;
                this.RaisePropertyChanged("displayName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string queryName {
            get {
                return this.queryNameField;
            }
            set {
                this.queryNameField = value;
                this.RaisePropertyChanged("queryName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyUri : cmisProperty {
        
        private string[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", DataType="anyURI", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyString : cmisProperty {
        
        private string[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyHtml : cmisProperty {
        
        private string[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyDecimal : cmisProperty {
        
        private decimal[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public decimal[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyDateTime : cmisProperty {
        
        private System.DateTime[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public System.DateTime[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyInteger : cmisProperty {
        
        private string[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", DataType="integer", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyId : cmisProperty {
        
        private string[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyBoolean : cmisProperty {
        
        private bool[] valueField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public bool[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertiesType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisProperty[] itemsField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("propertyBoolean", typeof(cmisPropertyBoolean), IsNullable=true, Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("propertyDateTime", typeof(cmisPropertyDateTime), IsNullable=true, Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("propertyDecimal", typeof(cmisPropertyDecimal), IsNullable=true, Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("propertyHtml", typeof(cmisPropertyHtml), IsNullable=true, Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("propertyId", typeof(cmisPropertyId), IsNullable=true, Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("propertyInteger", typeof(cmisPropertyInteger), IsNullable=true, Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("propertyString", typeof(cmisPropertyString), IsNullable=true, Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("propertyUri", typeof(cmisPropertyUri), IsNullable=true, Order=0)]
        public cmisProperty[] Items {
            get {
                return this.itemsField;
            }
            set {
                this.itemsField = value;
                this.RaisePropertyChanged("Items");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisObjectType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisPropertiesType propertiesField;
        
        private cmisAllowableActionsType allowableActionsField;
        
        private cmisObjectType[] relationshipField;
        
        private cmisChangeEventType changeEventInfoField;
        
        private cmisAccessControlListType aclField;
        
        private bool exactACLField;
        
        private bool exactACLFieldSpecified;
        
        private cmisListOfIdsType policyIdsField;
        
        private cmisRenditionType[] renditionField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertiesType properties {
            get {
                return this.propertiesField;
            }
            set {
                this.propertiesField = value;
                this.RaisePropertyChanged("properties");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public cmisAllowableActionsType allowableActions {
            get {
                return this.allowableActionsField;
            }
            set {
                this.allowableActionsField = value;
                this.RaisePropertyChanged("allowableActions");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("relationship", Order=2)]
        public cmisObjectType[] relationship {
            get {
                return this.relationshipField;
            }
            set {
                this.relationshipField = value;
                this.RaisePropertyChanged("relationship");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public cmisChangeEventType changeEventInfo {
            get {
                return this.changeEventInfoField;
            }
            set {
                this.changeEventInfoField = value;
                this.RaisePropertyChanged("changeEventInfo");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public cmisAccessControlListType acl {
            get {
                return this.aclField;
            }
            set {
                this.aclField = value;
                this.RaisePropertyChanged("acl");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public bool exactACL {
            get {
                return this.exactACLField;
            }
            set {
                this.exactACLField = value;
                this.RaisePropertyChanged("exactACL");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool exactACLSpecified {
            get {
                return this.exactACLFieldSpecified;
            }
            set {
                this.exactACLFieldSpecified = value;
                this.RaisePropertyChanged("exactACLSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public cmisListOfIdsType policyIds {
            get {
                return this.policyIdsField;
            }
            set {
                this.policyIdsField = value;
                this.RaisePropertyChanged("policyIds");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("rendition", Order=7)]
        public cmisRenditionType[] rendition {
            get {
                return this.renditionField;
            }
            set {
                this.renditionField = value;
                this.RaisePropertyChanged("rendition");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=8)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisObjectListType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisObjectType[] objectsField;
        
        private bool hasMoreItemsField;
        
        private string numItemsField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("objects", Order=0)]
        public cmisObjectType[] objects {
            get {
                return this.objectsField;
            }
            set {
                this.objectsField = value;
                this.RaisePropertyChanged("objects");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public bool hasMoreItems {
            get {
                return this.hasMoreItemsField;
            }
            set {
                this.hasMoreItemsField = value;
                this.RaisePropertyChanged("hasMoreItems");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
        public string numItems {
            get {
                return this.numItemsField;
            }
            set {
                this.numItemsField = value;
                this.RaisePropertyChanged("numItems");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisExtensionType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=0)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.DiscoveryServicePort")]
    internal interface DiscoveryServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message queryRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.queryResponse query(DotCMIS.CMISWebServicesReference.queryRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getContentChangesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getContentChangesResponse getContentChanges(DotCMIS.CMISWebServicesReference.getContentChangesRequest request);
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumIncludeRelationships {
        
        /// <remarks/>
        none,
        
        /// <remarks/>
        source,
        
        /// <remarks/>
        target,
        
        /// <remarks/>
        both,
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="query", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class queryRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string statement;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> searchAllVersions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string maxItems;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string skipCount;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=9)]
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr;
        
        public queryRequest() {
        }
        
        public queryRequest(string repositoryId, string statement, System.Nullable<bool> searchAllVersions, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension, System.Xml.XmlAttribute[] AnyAttr) {
            this.repositoryId = repositoryId;
            this.statement = statement;
            this.searchAllVersions = searchAllVersions;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.maxItems = maxItems;
            this.skipCount = skipCount;
            this.extension = extension;
            this.AnyAttr = AnyAttr;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="queryResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class queryResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
        
        public queryResponse() {
        }
        
        public queryResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects) {
            this.objects = objects;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentChanges", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getContentChangesRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string changeLogToken;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeProperties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePolicyIds;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeACL;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string maxItems;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getContentChangesRequest() {
        }
        
        public getContentChangesRequest(string repositoryId, string changeLogToken, System.Nullable<bool> includeProperties, string filter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, string maxItems, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.changeLogToken = changeLogToken;
            this.includeProperties = includeProperties;
            this.filter = filter;
            this.includePolicyIds = includePolicyIds;
            this.includeACL = includeACL;
            this.maxItems = maxItems;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentChangesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getContentChangesResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string changeLogToken;
        
        public getContentChangesResponse() {
        }
        
        public getContentChangesResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects, string changeLogToken) {
            this.objects = objects;
            this.changeLogToken = changeLogToken;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface DiscoveryServicePortChannel : DotCMIS.CMISWebServicesReference.DiscoveryServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class DiscoveryServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.DiscoveryServicePort>, DotCMIS.CMISWebServicesReference.DiscoveryServicePort {
        
        public DiscoveryServicePortClient() {
        }
        
        public DiscoveryServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public DiscoveryServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public DiscoveryServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public DiscoveryServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.queryResponse DotCMIS.CMISWebServicesReference.DiscoveryServicePort.query(DotCMIS.CMISWebServicesReference.queryRequest request) {
            return base.Channel.query(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectListType query(string repositoryId, string statement, System.Nullable<bool> searchAllVersions, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension, System.Xml.XmlAttribute[] AnyAttr) {
            DotCMIS.CMISWebServicesReference.queryRequest inValue = new DotCMIS.CMISWebServicesReference.queryRequest();
            inValue.repositoryId = repositoryId;
            inValue.statement = statement;
            inValue.searchAllVersions = searchAllVersions;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.maxItems = maxItems;
            inValue.skipCount = skipCount;
            inValue.extension = extension;
            inValue.AnyAttr = AnyAttr;
            DotCMIS.CMISWebServicesReference.queryResponse retVal = ((DotCMIS.CMISWebServicesReference.DiscoveryServicePort)(this)).query(inValue);
            return retVal.objects;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getContentChangesResponse DotCMIS.CMISWebServicesReference.DiscoveryServicePort.getContentChanges(DotCMIS.CMISWebServicesReference.getContentChangesRequest request) {
            return base.Channel.getContentChanges(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectListType getContentChanges(string repositoryId, ref string changeLogToken, System.Nullable<bool> includeProperties, string filter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, string maxItems, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getContentChangesRequest inValue = new DotCMIS.CMISWebServicesReference.getContentChangesRequest();
            inValue.repositoryId = repositoryId;
            inValue.changeLogToken = changeLogToken;
            inValue.includeProperties = includeProperties;
            inValue.filter = filter;
            inValue.includePolicyIds = includePolicyIds;
            inValue.includeACL = includeACL;
            inValue.maxItems = maxItems;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getContentChangesResponse retVal = ((DotCMIS.CMISWebServicesReference.DiscoveryServicePort)(this)).getContentChanges(inValue);
            changeLogToken = retVal.changeLogToken;
            return retVal.objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.MultiFilingServicePort")]
    internal interface MultiFilingServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message addObjectToFolderRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.addObjectToFolderResponse addObjectToFolder(DotCMIS.CMISWebServicesReference.addObjectToFolderRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message removeObjectFromFolderRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.removeObjectFromFolderResponse removeObjectFromFolder(DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest request);
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="addObjectToFolder", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class addObjectToFolderRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        public bool allVersions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public addObjectToFolderRequest() {
        }
        
        public addObjectToFolderRequest(string repositoryId, string objectId, string folderId, bool allVersions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.folderId = folderId;
            this.allVersions = allVersions;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="addObjectToFolderResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class addObjectToFolderResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public addObjectToFolderResponse() {
        }
        
        public addObjectToFolderResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="removeObjectFromFolder", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class removeObjectFromFolderRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public removeObjectFromFolderRequest() {
        }
        
        public removeObjectFromFolderRequest(string repositoryId, string objectId, string folderId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.folderId = folderId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="removeObjectFromFolderResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class removeObjectFromFolderResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public removeObjectFromFolderResponse() {
        }
        
        public removeObjectFromFolderResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.extension = extension;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface MultiFilingServicePortChannel : DotCMIS.CMISWebServicesReference.MultiFilingServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class MultiFilingServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.MultiFilingServicePort>, DotCMIS.CMISWebServicesReference.MultiFilingServicePort {
        
        public MultiFilingServicePortClient() {
        }
        
        public MultiFilingServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public MultiFilingServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public MultiFilingServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public MultiFilingServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.addObjectToFolderResponse DotCMIS.CMISWebServicesReference.MultiFilingServicePort.addObjectToFolder(DotCMIS.CMISWebServicesReference.addObjectToFolderRequest request) {
            return base.Channel.addObjectToFolder(request);
        }
        
        public void addObjectToFolder(string repositoryId, string objectId, string folderId, bool allVersions, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.addObjectToFolderRequest inValue = new DotCMIS.CMISWebServicesReference.addObjectToFolderRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.folderId = folderId;
            inValue.allVersions = allVersions;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.addObjectToFolderResponse retVal = ((DotCMIS.CMISWebServicesReference.MultiFilingServicePort)(this)).addObjectToFolder(inValue);
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.removeObjectFromFolderResponse DotCMIS.CMISWebServicesReference.MultiFilingServicePort.removeObjectFromFolder(DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest request) {
            return base.Channel.removeObjectFromFolder(request);
        }
        
        public void removeObjectFromFolder(string repositoryId, string objectId, string folderId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest inValue = new DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.folderId = folderId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.removeObjectFromFolderResponse retVal = ((DotCMIS.CMISWebServicesReference.MultiFilingServicePort)(this)).removeObjectFromFolder(inValue);
            extension = retVal.extension;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.NavigationServicePort")]
    internal interface NavigationServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getDescendantsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getDescendantsResponse getDescendants(DotCMIS.CMISWebServicesReference.getDescendantsRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getChildrenRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getChildrenResponse getChildren(DotCMIS.CMISWebServicesReference.getChildrenRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getFolderParentRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getFolderParentResponse getFolderParent(DotCMIS.CMISWebServicesReference.getFolderParentRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getFolderTreeRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getFolderTreeResponse getFolderTree(DotCMIS.CMISWebServicesReference.getFolderTreeRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectParentsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getObjectParentsResponse getObjectParents(DotCMIS.CMISWebServicesReference.getObjectParentsRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getCheckedOutDocsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getCheckedOutDocsResponse getCheckedOutDocs(DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest request);
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisObjectInFolderContainerType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisObjectInFolderType objectInFolderField;
        
        private cmisObjectInFolderContainerType[] childrenField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisObjectInFolderType objectInFolder {
            get {
                return this.objectInFolderField;
            }
            set {
                this.objectInFolderField = value;
                this.RaisePropertyChanged("objectInFolder");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("children", Order=1)]
        public cmisObjectInFolderContainerType[] children {
            get {
                return this.childrenField;
            }
            set {
                this.childrenField = value;
                this.RaisePropertyChanged("children");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisObjectInFolderType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisObjectType objectField;
        
        private string pathSegmentField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisObjectType @object {
            get {
                return this.objectField;
            }
            set {
                this.objectField = value;
                this.RaisePropertyChanged("object");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string pathSegment {
            get {
                return this.pathSegmentField;
            }
            set {
                this.pathSegmentField = value;
                this.RaisePropertyChanged("pathSegment");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getDescendants", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getDescendantsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string depth;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePathSegment;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getDescendantsRequest() {
        }
        
        public getDescendantsRequest(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.folderId = folderId;
            this.depth = depth;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.includePathSegment = includePathSegment;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getDescendantsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getDescendantsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("objects")]
        public cmisObjectInFolderContainerType[] objects;
        
        public getDescendantsResponse() {
        }
        
        public getDescendantsResponse(cmisObjectInFolderContainerType[] objects) {
            this.objects = objects;
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisObjectInFolderListType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisObjectInFolderType[] objectsField;
        
        private bool hasMoreItemsField;
        
        private string numItemsField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("objects", Order=0)]
        public cmisObjectInFolderType[] objects {
            get {
                return this.objectsField;
            }
            set {
                this.objectsField = value;
                this.RaisePropertyChanged("objects");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public bool hasMoreItems {
            get {
                return this.hasMoreItemsField;
            }
            set {
                this.hasMoreItemsField = value;
                this.RaisePropertyChanged("hasMoreItems");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
        public string numItems {
            get {
                return this.numItemsField;
            }
            set {
                this.numItemsField = value;
                this.RaisePropertyChanged("numItems");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getChildren", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getChildrenRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string orderBy;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePathSegment;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string maxItems;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string skipCount;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=10)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getChildrenRequest() {
        }
        
        public getChildrenRequest(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.folderId = folderId;
            this.filter = filter;
            this.orderBy = orderBy;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.includePathSegment = includePathSegment;
            this.maxItems = maxItems;
            this.skipCount = skipCount;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getChildrenResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getChildrenResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType objects;
        
        public getChildrenResponse() {
        }
        
        public getChildrenResponse(DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType objects) {
            this.objects = objects;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderParent", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getFolderParentRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getFolderParentRequest() {
        }
        
        public getFolderParentRequest(string repositoryId, string folderId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.folderId = folderId;
            this.filter = filter;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderParentResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getFolderParentResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
        
        public getFolderParentResponse() {
        }
        
        public getFolderParentResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
            this.@object = @object;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderTree", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getFolderTreeRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string depth;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePathSegment;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getFolderTreeRequest() {
        }
        
        public getFolderTreeRequest(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.folderId = folderId;
            this.depth = depth;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.includePathSegment = includePathSegment;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderTreeResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getFolderTreeResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("objects")]
        public cmisObjectInFolderContainerType[] objects;
        
        public getFolderTreeResponse() {
        }
        
        public getFolderTreeResponse(cmisObjectInFolderContainerType[] objects) {
            this.objects = objects;
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisObjectParentsType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisObjectType objectField;
        
        private string relativePathSegmentField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisObjectType @object {
            get {
                return this.objectField;
            }
            set {
                this.objectField = value;
                this.RaisePropertyChanged("object");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string relativePathSegment {
            get {
                return this.relativePathSegmentField;
            }
            set {
                this.relativePathSegmentField = value;
                this.RaisePropertyChanged("relativePathSegment");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectParents", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectParentsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeRelativePathSegment;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getObjectParentsRequest() {
        }
        
        public getObjectParentsRequest(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includeRelativePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.includeRelativePathSegment = includeRelativePathSegment;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectParentsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectParentsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("parents")]
        public cmisObjectParentsType[] parents;
        
        public getObjectParentsResponse() {
        }
        
        public getObjectParentsResponse(cmisObjectParentsType[] parents) {
            this.parents = parents;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getCheckedOutDocs", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getCheckedOutDocsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string orderBy;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string maxItems;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string skipCount;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getCheckedOutDocsRequest() {
        }
        
        public getCheckedOutDocsRequest(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.folderId = folderId;
            this.filter = filter;
            this.orderBy = orderBy;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.maxItems = maxItems;
            this.skipCount = skipCount;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getCheckedOutDocsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getCheckedOutDocsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
        
        public getCheckedOutDocsResponse() {
        }
        
        public getCheckedOutDocsResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects) {
            this.objects = objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface NavigationServicePortChannel : DotCMIS.CMISWebServicesReference.NavigationServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class NavigationServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.NavigationServicePort>, DotCMIS.CMISWebServicesReference.NavigationServicePort {
        
        public NavigationServicePortClient() {
        }
        
        public NavigationServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public NavigationServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public NavigationServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public NavigationServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getDescendantsResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getDescendants(DotCMIS.CMISWebServicesReference.getDescendantsRequest request) {
            return base.Channel.getDescendants(request);
        }
        
        public cmisObjectInFolderContainerType[] getDescendants(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getDescendantsRequest inValue = new DotCMIS.CMISWebServicesReference.getDescendantsRequest();
            inValue.repositoryId = repositoryId;
            inValue.folderId = folderId;
            inValue.depth = depth;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.includePathSegment = includePathSegment;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getDescendantsResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getDescendants(inValue);
            return retVal.objects;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getChildrenResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getChildren(DotCMIS.CMISWebServicesReference.getChildrenRequest request) {
            return base.Channel.getChildren(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType getChildren(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getChildrenRequest inValue = new DotCMIS.CMISWebServicesReference.getChildrenRequest();
            inValue.repositoryId = repositoryId;
            inValue.folderId = folderId;
            inValue.filter = filter;
            inValue.orderBy = orderBy;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.includePathSegment = includePathSegment;
            inValue.maxItems = maxItems;
            inValue.skipCount = skipCount;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getChildrenResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getChildren(inValue);
            return retVal.objects;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getFolderParentResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getFolderParent(DotCMIS.CMISWebServicesReference.getFolderParentRequest request) {
            return base.Channel.getFolderParent(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectType getFolderParent(string repositoryId, string folderId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getFolderParentRequest inValue = new DotCMIS.CMISWebServicesReference.getFolderParentRequest();
            inValue.repositoryId = repositoryId;
            inValue.folderId = folderId;
            inValue.filter = filter;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getFolderParentResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getFolderParent(inValue);
            return retVal.@object;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getFolderTreeResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getFolderTree(DotCMIS.CMISWebServicesReference.getFolderTreeRequest request) {
            return base.Channel.getFolderTree(request);
        }
        
        public cmisObjectInFolderContainerType[] getFolderTree(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getFolderTreeRequest inValue = new DotCMIS.CMISWebServicesReference.getFolderTreeRequest();
            inValue.repositoryId = repositoryId;
            inValue.folderId = folderId;
            inValue.depth = depth;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.includePathSegment = includePathSegment;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getFolderTreeResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getFolderTree(inValue);
            return retVal.objects;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getObjectParentsResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getObjectParents(DotCMIS.CMISWebServicesReference.getObjectParentsRequest request) {
            return base.Channel.getObjectParents(request);
        }
        
        public cmisObjectParentsType[] getObjectParents(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includeRelativePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getObjectParentsRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectParentsRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.includeRelativePathSegment = includeRelativePathSegment;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getObjectParentsResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getObjectParents(inValue);
            return retVal.parents;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getCheckedOutDocsResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getCheckedOutDocs(DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest request) {
            return base.Channel.getCheckedOutDocs(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectListType getCheckedOutDocs(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest inValue = new DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest();
            inValue.repositoryId = repositoryId;
            inValue.folderId = folderId;
            inValue.filter = filter;
            inValue.orderBy = orderBy;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.maxItems = maxItems;
            inValue.skipCount = skipCount;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getCheckedOutDocsResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getCheckedOutDocs(inValue);
            return retVal.objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.ObjectServicePort")]
    internal interface ObjectServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createDocumentRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.createDocumentResponse createDocument(DotCMIS.CMISWebServicesReference.createDocumentRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createDocumentFromSourceRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.createDocumentFromSourceResponse createDocumentFromSource(DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createFolderRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.createFolderResponse createFolder(DotCMIS.CMISWebServicesReference.createFolderRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createRelationshipRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.createRelationshipResponse createRelationship(DotCMIS.CMISWebServicesReference.createRelationshipRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createPolicyRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.createPolicyResponse createPolicy(DotCMIS.CMISWebServicesReference.createPolicyRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getAllowableActionsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getAllowableActionsResponse getAllowableActions(DotCMIS.CMISWebServicesReference.getAllowableActionsRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getObjectResponse getObject(DotCMIS.CMISWebServicesReference.getObjectRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getPropertiesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getPropertiesResponse getProperties(DotCMIS.CMISWebServicesReference.getPropertiesRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getRenditionsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getRenditionsResponse getRenditions(DotCMIS.CMISWebServicesReference.getRenditionsRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectByPathRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getObjectByPathResponse getObjectByPath(DotCMIS.CMISWebServicesReference.getObjectByPathRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getContentStreamRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getContentStreamResponse getContentStream(DotCMIS.CMISWebServicesReference.getContentStreamRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message updatePropertiesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.updatePropertiesResponse updateProperties(DotCMIS.CMISWebServicesReference.updatePropertiesRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message moveObjectRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.moveObjectResponse moveObject(DotCMIS.CMISWebServicesReference.moveObjectRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message deleteObjectRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.deleteObjectResponse deleteObject(DotCMIS.CMISWebServicesReference.deleteObjectRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message deleteTreeRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.deleteTreeResponse deleteTree(DotCMIS.CMISWebServicesReference.deleteTreeRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message setContentStreamRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.setContentStreamResponse setContentStream(DotCMIS.CMISWebServicesReference.setContentStreamRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message deleteContentStreamRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.deleteContentStreamResponse deleteContentStream(DotCMIS.CMISWebServicesReference.deleteContentStreamRequest request);
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisContentStreamType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string lengthField;
        
        private string mimeTypeField;
        
        private string filenameField;
        
        private byte[] streamField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=0)]
        public string length {
            get {
                return this.lengthField;
            }
            set {
                this.lengthField = value;
                this.RaisePropertyChanged("length");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string mimeType {
            get {
                return this.mimeTypeField;
            }
            set {
                this.mimeTypeField = value;
                this.RaisePropertyChanged("mimeType");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public string filename {
            get {
                return this.filenameField;
            }
            set {
                this.filenameField = value;
                this.RaisePropertyChanged("filename");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary", Order=3)]
        public byte[] stream {
            get {
                return this.streamField;
            }
            set {
                this.streamField = value;
                this.RaisePropertyChanged("stream");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=4)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumVersioningState {
        
        /// <remarks/>
        none,
        
        /// <remarks/>
        checkedout,
        
        /// <remarks/>
        minor,
        
        /// <remarks/>
        major,
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocument", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createDocumentRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumVersioningState> versioningState;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
        public string[] policies;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createDocumentRequest() {
        }
        
        public createDocumentRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.properties = properties;
            this.folderId = folderId;
            this.contentStream = contentStream;
            this.versioningState = versioningState;
            this.policies = policies;
            this.addACEs = addACEs;
            this.removeACEs = removeACEs;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocumentResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createDocumentResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createDocumentResponse() {
        }
        
        public createDocumentResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocumentFromSource", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createDocumentFromSourceRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string sourceId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumVersioningState> versioningState;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
        public string[] policies;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createDocumentFromSourceRequest() {
        }
        
        public createDocumentFromSourceRequest(string repositoryId, string sourceId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.sourceId = sourceId;
            this.properties = properties;
            this.folderId = folderId;
            this.versioningState = versioningState;
            this.policies = policies;
            this.addACEs = addACEs;
            this.removeACEs = removeACEs;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocumentFromSourceResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createDocumentFromSourceResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createDocumentFromSourceResponse() {
        }
        
        public createDocumentFromSourceResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createFolder", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createFolderRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
        public string[] policies;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createFolderRequest() {
        }
        
        public createFolderRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.properties = properties;
            this.folderId = folderId;
            this.policies = policies;
            this.addACEs = addACEs;
            this.removeACEs = removeACEs;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createFolderResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createFolderResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createFolderResponse() {
        }
        
        public createFolderResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createRelationship", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createRelationshipRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
        public string[] policies;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createRelationshipRequest() {
        }
        
        public createRelationshipRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.properties = properties;
            this.policies = policies;
            this.addACEs = addACEs;
            this.removeACEs = removeACEs;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createRelationshipResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createRelationshipResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createRelationshipResponse() {
        }
        
        public createRelationshipResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createPolicy", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createPolicyRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
        public string[] policies;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createPolicyRequest() {
        }
        
        public createPolicyRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.properties = properties;
            this.folderId = folderId;
            this.policies = policies;
            this.addACEs = addACEs;
            this.removeACEs = removeACEs;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="createPolicyResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class createPolicyResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public createPolicyResponse() {
        }
        
        public createPolicyResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllowableActions", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getAllowableActionsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getAllowableActionsRequest() {
        }
        
        public getAllowableActionsRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllowableActionsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getAllowableActionsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisAllowableActionsType allowableActions;
        
        public getAllowableActionsResponse() {
        }
        
        public getAllowableActionsResponse(DotCMIS.CMISWebServicesReference.cmisAllowableActionsType allowableActions) {
            this.allowableActions = allowableActions;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObject", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePolicyIds;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeACL;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getObjectRequest() {
        }
        
        public getObjectRequest(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.includePolicyIds = includePolicyIds;
            this.includeACL = includeACL;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
        
        public getObjectResponse() {
        }
        
        public getObjectResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
            this.@object = @object;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getProperties", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getPropertiesRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getPropertiesRequest() {
        }
        
        public getPropertiesRequest(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.filter = filter;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getPropertiesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getPropertiesResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        public getPropertiesResponse() {
        }
        
        public getPropertiesResponse(DotCMIS.CMISWebServicesReference.cmisPropertiesType properties) {
            this.properties = properties;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getRenditions", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getRenditionsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string maxItems;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string skipCount;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getRenditionsRequest() {
        }
        
        public getRenditionsRequest(string repositoryId, string objectId, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.renditionFilter = renditionFilter;
            this.maxItems = maxItems;
            this.skipCount = skipCount;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getRenditionsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getRenditionsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("renditions")]
        public cmisRenditionType[] renditions;
        
        public getRenditionsResponse() {
        }
        
        public getRenditionsResponse(cmisRenditionType[] renditions) {
            this.renditions = renditions;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectByPath", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectByPathRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string path;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePolicyIds;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeACL;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getObjectByPathRequest() {
        }
        
        public getObjectByPathRequest(string repositoryId, string path, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.path = path;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.includePolicyIds = includePolicyIds;
            this.includeACL = includeACL;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectByPathResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectByPathResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
        
        public getObjectByPathResponse() {
        }
        
        public getObjectByPathResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
            this.@object = @object;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentStream", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getContentStreamRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string streamId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string offset;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string length;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getContentStreamRequest() {
        }
        
        public getContentStreamRequest(string repositoryId, string objectId, string streamId, string offset, string length, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.streamId = streamId;
            this.offset = offset;
            this.length = length;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentStreamResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getContentStreamResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
        
        public getContentStreamResponse() {
        }
        
        public getContentStreamResponse(DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream) {
            this.contentStream = contentStream;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="updateProperties", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class updatePropertiesRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string changeToken;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public updatePropertiesRequest() {
        }
        
        public updatePropertiesRequest(string repositoryId, string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.changeToken = changeToken;
            this.properties = properties;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="updatePropertiesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class updatePropertiesResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string changeToken;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public updatePropertiesResponse() {
        }
        
        public updatePropertiesResponse(string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.changeToken = changeToken;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="moveObject", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class moveObjectRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public string targetFolderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        public string sourceFolderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public moveObjectRequest() {
        }
        
        public moveObjectRequest(string repositoryId, string objectId, string targetFolderId, string sourceFolderId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.targetFolderId = targetFolderId;
            this.sourceFolderId = sourceFolderId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="moveObjectResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class moveObjectResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public moveObjectResponse() {
        }
        
        public moveObjectResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteObject", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class deleteObjectRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> allVersions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public deleteObjectRequest() {
        }
        
        public deleteObjectRequest(string repositoryId, string objectId, System.Nullable<bool> allVersions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.allVersions = allVersions;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteObjectResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class deleteObjectResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public deleteObjectResponse() {
        }
        
        public deleteObjectResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.extension = extension;
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumUnfileObject {
        
        /// <remarks/>
        unfile,
        
        /// <remarks/>
        deletesinglefiled,
        
        /// <remarks/>
        delete,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class deleteTreeResponseFailedToDelete : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string[] objectIdsField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("objectIds", Order=0)]
        public string[] objectIds {
            get {
                return this.objectIdsField;
            }
            set {
                this.objectIdsField = value;
                this.RaisePropertyChanged("objectIds");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteTree", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class deleteTreeRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string folderId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> allVersions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumUnfileObject> unfileObjects;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> continueOnFailure;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public deleteTreeRequest() {
        }
        
        public deleteTreeRequest(string repositoryId, string folderId, System.Nullable<bool> allVersions, System.Nullable<enumUnfileObject> unfileObjects, System.Nullable<bool> continueOnFailure, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.folderId = folderId;
            this.allVersions = allVersions;
            this.unfileObjects = unfileObjects;
            this.continueOnFailure = continueOnFailure;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteTreeResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class deleteTreeResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete failedToDelete;
        
        public deleteTreeResponse() {
        }
        
        public deleteTreeResponse(DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete failedToDelete) {
            this.failedToDelete = failedToDelete;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="setContentStream", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class setContentStreamRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> overwriteFlag;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string changeToken;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public setContentStreamRequest() {
        }
        
        public setContentStreamRequest(string repositoryId, string objectId, System.Nullable<bool> overwriteFlag, string changeToken, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.overwriteFlag = overwriteFlag;
            this.changeToken = changeToken;
            this.contentStream = contentStream;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="setContentStreamResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class setContentStreamResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string changeToken;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public setContentStreamResponse() {
        }
        
        public setContentStreamResponse(string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.changeToken = changeToken;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteContentStream", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class deleteContentStreamRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public string changeToken;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public deleteContentStreamRequest() {
        }
        
        public deleteContentStreamRequest(string repositoryId, string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.changeToken = changeToken;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteContentStreamResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class deleteContentStreamResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string changeToken;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public deleteContentStreamResponse() {
        }
        
        public deleteContentStreamResponse(string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.changeToken = changeToken;
            this.extension = extension;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface ObjectServicePortChannel : DotCMIS.CMISWebServicesReference.ObjectServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class ObjectServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.ObjectServicePort>, DotCMIS.CMISWebServicesReference.ObjectServicePort {
        
        public ObjectServicePortClient() {
        }
        
        public ObjectServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public ObjectServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public ObjectServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public ObjectServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.createDocumentResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createDocument(DotCMIS.CMISWebServicesReference.createDocumentRequest request) {
            return base.Channel.createDocument(request);
        }
        
        public string createDocument(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.createDocumentRequest inValue = new DotCMIS.CMISWebServicesReference.createDocumentRequest();
            inValue.repositoryId = repositoryId;
            inValue.properties = properties;
            inValue.folderId = folderId;
            inValue.contentStream = contentStream;
            inValue.versioningState = versioningState;
            inValue.policies = policies;
            inValue.addACEs = addACEs;
            inValue.removeACEs = removeACEs;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.createDocumentResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createDocument(inValue);
            extension = retVal.extension;
            return retVal.objectId;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.createDocumentFromSourceResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createDocumentFromSource(DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest request) {
            return base.Channel.createDocumentFromSource(request);
        }
        
        public string createDocumentFromSource(string repositoryId, string sourceId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest inValue = new DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest();
            inValue.repositoryId = repositoryId;
            inValue.sourceId = sourceId;
            inValue.properties = properties;
            inValue.folderId = folderId;
            inValue.versioningState = versioningState;
            inValue.policies = policies;
            inValue.addACEs = addACEs;
            inValue.removeACEs = removeACEs;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.createDocumentFromSourceResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createDocumentFromSource(inValue);
            extension = retVal.extension;
            return retVal.objectId;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.createFolderResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createFolder(DotCMIS.CMISWebServicesReference.createFolderRequest request) {
            return base.Channel.createFolder(request);
        }
        
        public string createFolder(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.createFolderRequest inValue = new DotCMIS.CMISWebServicesReference.createFolderRequest();
            inValue.repositoryId = repositoryId;
            inValue.properties = properties;
            inValue.folderId = folderId;
            inValue.policies = policies;
            inValue.addACEs = addACEs;
            inValue.removeACEs = removeACEs;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.createFolderResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createFolder(inValue);
            extension = retVal.extension;
            return retVal.objectId;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.createRelationshipResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createRelationship(DotCMIS.CMISWebServicesReference.createRelationshipRequest request) {
            return base.Channel.createRelationship(request);
        }
        
        public string createRelationship(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.createRelationshipRequest inValue = new DotCMIS.CMISWebServicesReference.createRelationshipRequest();
            inValue.repositoryId = repositoryId;
            inValue.properties = properties;
            inValue.policies = policies;
            inValue.addACEs = addACEs;
            inValue.removeACEs = removeACEs;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.createRelationshipResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createRelationship(inValue);
            extension = retVal.extension;
            return retVal.objectId;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.createPolicyResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createPolicy(DotCMIS.CMISWebServicesReference.createPolicyRequest request) {
            return base.Channel.createPolicy(request);
        }
        
        public string createPolicy(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.createPolicyRequest inValue = new DotCMIS.CMISWebServicesReference.createPolicyRequest();
            inValue.repositoryId = repositoryId;
            inValue.properties = properties;
            inValue.folderId = folderId;
            inValue.policies = policies;
            inValue.addACEs = addACEs;
            inValue.removeACEs = removeACEs;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.createPolicyResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createPolicy(inValue);
            extension = retVal.extension;
            return retVal.objectId;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getAllowableActionsResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getAllowableActions(DotCMIS.CMISWebServicesReference.getAllowableActionsRequest request) {
            return base.Channel.getAllowableActions(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisAllowableActionsType getAllowableActions(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getAllowableActionsRequest inValue = new DotCMIS.CMISWebServicesReference.getAllowableActionsRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getAllowableActionsResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getAllowableActions(inValue);
            return retVal.allowableActions;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getObjectResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getObject(DotCMIS.CMISWebServicesReference.getObjectRequest request) {
            return base.Channel.getObject(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectType getObject(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getObjectRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.includePolicyIds = includePolicyIds;
            inValue.includeACL = includeACL;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getObjectResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getObject(inValue);
            return retVal.@object;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getPropertiesResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getProperties(DotCMIS.CMISWebServicesReference.getPropertiesRequest request) {
            return base.Channel.getProperties(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType getProperties(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getPropertiesRequest inValue = new DotCMIS.CMISWebServicesReference.getPropertiesRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.filter = filter;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getPropertiesResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getProperties(inValue);
            return retVal.properties;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getRenditionsResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getRenditions(DotCMIS.CMISWebServicesReference.getRenditionsRequest request) {
            return base.Channel.getRenditions(request);
        }
        
        public cmisRenditionType[] getRenditions(string repositoryId, string objectId, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getRenditionsRequest inValue = new DotCMIS.CMISWebServicesReference.getRenditionsRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.renditionFilter = renditionFilter;
            inValue.maxItems = maxItems;
            inValue.skipCount = skipCount;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getRenditionsResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getRenditions(inValue);
            return retVal.renditions;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getObjectByPathResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getObjectByPath(DotCMIS.CMISWebServicesReference.getObjectByPathRequest request) {
            return base.Channel.getObjectByPath(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectType getObjectByPath(string repositoryId, string path, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getObjectByPathRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectByPathRequest();
            inValue.repositoryId = repositoryId;
            inValue.path = path;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.includePolicyIds = includePolicyIds;
            inValue.includeACL = includeACL;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getObjectByPathResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getObjectByPath(inValue);
            return retVal.@object;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getContentStreamResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getContentStream(DotCMIS.CMISWebServicesReference.getContentStreamRequest request) {
            return base.Channel.getContentStream(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisContentStreamType getContentStream(string repositoryId, string objectId, string streamId, string offset, string length, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getContentStreamRequest inValue = new DotCMIS.CMISWebServicesReference.getContentStreamRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.streamId = streamId;
            inValue.offset = offset;
            inValue.length = length;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getContentStreamResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getContentStream(inValue);
            return retVal.contentStream;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.updatePropertiesResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.updateProperties(DotCMIS.CMISWebServicesReference.updatePropertiesRequest request) {
            return base.Channel.updateProperties(request);
        }
        
        public void updateProperties(string repositoryId, ref string objectId, ref string changeToken, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.updatePropertiesRequest inValue = new DotCMIS.CMISWebServicesReference.updatePropertiesRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.changeToken = changeToken;
            inValue.properties = properties;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.updatePropertiesResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).updateProperties(inValue);
            objectId = retVal.objectId;
            changeToken = retVal.changeToken;
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.moveObjectResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.moveObject(DotCMIS.CMISWebServicesReference.moveObjectRequest request) {
            return base.Channel.moveObject(request);
        }
        
        public void moveObject(string repositoryId, ref string objectId, string targetFolderId, string sourceFolderId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.moveObjectRequest inValue = new DotCMIS.CMISWebServicesReference.moveObjectRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.targetFolderId = targetFolderId;
            inValue.sourceFolderId = sourceFolderId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.moveObjectResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).moveObject(inValue);
            objectId = retVal.objectId;
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.deleteObjectResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.deleteObject(DotCMIS.CMISWebServicesReference.deleteObjectRequest request) {
            return base.Channel.deleteObject(request);
        }
        
        public void deleteObject(string repositoryId, string objectId, System.Nullable<bool> allVersions, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.deleteObjectRequest inValue = new DotCMIS.CMISWebServicesReference.deleteObjectRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.allVersions = allVersions;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.deleteObjectResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).deleteObject(inValue);
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.deleteTreeResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.deleteTree(DotCMIS.CMISWebServicesReference.deleteTreeRequest request) {
            return base.Channel.deleteTree(request);
        }
        
        public DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete deleteTree(string repositoryId, string folderId, System.Nullable<bool> allVersions, System.Nullable<enumUnfileObject> unfileObjects, System.Nullable<bool> continueOnFailure, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.deleteTreeRequest inValue = new DotCMIS.CMISWebServicesReference.deleteTreeRequest();
            inValue.repositoryId = repositoryId;
            inValue.folderId = folderId;
            inValue.allVersions = allVersions;
            inValue.unfileObjects = unfileObjects;
            inValue.continueOnFailure = continueOnFailure;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.deleteTreeResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).deleteTree(inValue);
            return retVal.failedToDelete;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.setContentStreamResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.setContentStream(DotCMIS.CMISWebServicesReference.setContentStreamRequest request) {
            return base.Channel.setContentStream(request);
        }
        
        public void setContentStream(string repositoryId, ref string objectId, System.Nullable<bool> overwriteFlag, ref string changeToken, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.setContentStreamRequest inValue = new DotCMIS.CMISWebServicesReference.setContentStreamRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.overwriteFlag = overwriteFlag;
            inValue.changeToken = changeToken;
            inValue.contentStream = contentStream;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.setContentStreamResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).setContentStream(inValue);
            objectId = retVal.objectId;
            changeToken = retVal.changeToken;
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.deleteContentStreamResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.deleteContentStream(DotCMIS.CMISWebServicesReference.deleteContentStreamRequest request) {
            return base.Channel.deleteContentStream(request);
        }
        
        public void deleteContentStream(string repositoryId, ref string objectId, ref string changeToken, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.deleteContentStreamRequest inValue = new DotCMIS.CMISWebServicesReference.deleteContentStreamRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.changeToken = changeToken;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.deleteContentStreamResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).deleteContentStream(inValue);
            objectId = retVal.objectId;
            changeToken = retVal.changeToken;
            extension = retVal.extension;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.PolicyServicePort")]
    internal interface PolicyServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message applyPolicyRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.applyPolicyResponse applyPolicy(DotCMIS.CMISWebServicesReference.applyPolicyRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message removePolicyRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.removePolicyResponse removePolicy(DotCMIS.CMISWebServicesReference.removePolicyRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getAppliedPoliciesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getAppliedPoliciesResponse getAppliedPolicies(DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest request);
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="applyPolicy", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class applyPolicyRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string policyId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public applyPolicyRequest() {
        }
        
        public applyPolicyRequest(string repositoryId, string policyId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.policyId = policyId;
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="applyPolicyResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class applyPolicyResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public applyPolicyResponse() {
        }
        
        public applyPolicyResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="removePolicy", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class removePolicyRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string policyId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public removePolicyRequest() {
        }
        
        public removePolicyRequest(string repositoryId, string policyId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.policyId = policyId;
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="removePolicyResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class removePolicyResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public removePolicyResponse() {
        }
        
        public removePolicyResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getAppliedPolicies", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getAppliedPoliciesRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getAppliedPoliciesRequest() {
        }
        
        public getAppliedPoliciesRequest(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.filter = filter;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getAppliedPoliciesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getAppliedPoliciesResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("objects")]
        public cmisObjectType[] objects;
        
        public getAppliedPoliciesResponse() {
        }
        
        public getAppliedPoliciesResponse(cmisObjectType[] objects) {
            this.objects = objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface PolicyServicePortChannel : DotCMIS.CMISWebServicesReference.PolicyServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class PolicyServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.PolicyServicePort>, DotCMIS.CMISWebServicesReference.PolicyServicePort {
        
        public PolicyServicePortClient() {
        }
        
        public PolicyServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public PolicyServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public PolicyServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public PolicyServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.applyPolicyResponse DotCMIS.CMISWebServicesReference.PolicyServicePort.applyPolicy(DotCMIS.CMISWebServicesReference.applyPolicyRequest request) {
            return base.Channel.applyPolicy(request);
        }
        
        public void applyPolicy(string repositoryId, string policyId, string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.applyPolicyRequest inValue = new DotCMIS.CMISWebServicesReference.applyPolicyRequest();
            inValue.repositoryId = repositoryId;
            inValue.policyId = policyId;
            inValue.objectId = objectId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.applyPolicyResponse retVal = ((DotCMIS.CMISWebServicesReference.PolicyServicePort)(this)).applyPolicy(inValue);
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.removePolicyResponse DotCMIS.CMISWebServicesReference.PolicyServicePort.removePolicy(DotCMIS.CMISWebServicesReference.removePolicyRequest request) {
            return base.Channel.removePolicy(request);
        }
        
        public void removePolicy(string repositoryId, string policyId, string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.removePolicyRequest inValue = new DotCMIS.CMISWebServicesReference.removePolicyRequest();
            inValue.repositoryId = repositoryId;
            inValue.policyId = policyId;
            inValue.objectId = objectId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.removePolicyResponse retVal = ((DotCMIS.CMISWebServicesReference.PolicyServicePort)(this)).removePolicy(inValue);
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getAppliedPoliciesResponse DotCMIS.CMISWebServicesReference.PolicyServicePort.getAppliedPolicies(DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest request) {
            return base.Channel.getAppliedPolicies(request);
        }
        
        public cmisObjectType[] getAppliedPolicies(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest inValue = new DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.filter = filter;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getAppliedPoliciesResponse retVal = ((DotCMIS.CMISWebServicesReference.PolicyServicePort)(this)).getAppliedPolicies(inValue);
            return retVal.objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.RelationshipServicePort")]
    internal interface RelationshipServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectRelationshipsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getObjectRelationshipsResponse getObjectRelationships(DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest request);
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumRelationshipDirection {
        
        /// <remarks/>
        source,
        
        /// <remarks/>
        target,
        
        /// <remarks/>
        either,
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectRelationships", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectRelationshipsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public bool includeSubRelationshipTypes;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumRelationshipDirection> relationshipDirection;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string typeId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string maxItems;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string skipCount;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getObjectRelationshipsRequest() {
        }
        
        public getObjectRelationshipsRequest(string repositoryId, string objectId, bool includeSubRelationshipTypes, System.Nullable<enumRelationshipDirection> relationshipDirection, string typeId, string filter, System.Nullable<bool> includeAllowableActions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.includeSubRelationshipTypes = includeSubRelationshipTypes;
            this.relationshipDirection = relationshipDirection;
            this.typeId = typeId;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.maxItems = maxItems;
            this.skipCount = skipCount;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectRelationshipsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectRelationshipsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
        
        public getObjectRelationshipsResponse() {
        }
        
        public getObjectRelationshipsResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects) {
            this.objects = objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface RelationshipServicePortChannel : DotCMIS.CMISWebServicesReference.RelationshipServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class RelationshipServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.RelationshipServicePort>, DotCMIS.CMISWebServicesReference.RelationshipServicePort {
        
        public RelationshipServicePortClient() {
        }
        
        public RelationshipServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public RelationshipServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public RelationshipServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public RelationshipServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getObjectRelationshipsResponse DotCMIS.CMISWebServicesReference.RelationshipServicePort.getObjectRelationships(DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest request) {
            return base.Channel.getObjectRelationships(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectListType getObjectRelationships(string repositoryId, string objectId, bool includeSubRelationshipTypes, System.Nullable<enumRelationshipDirection> relationshipDirection, string typeId, string filter, System.Nullable<bool> includeAllowableActions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.includeSubRelationshipTypes = includeSubRelationshipTypes;
            inValue.relationshipDirection = relationshipDirection;
            inValue.typeId = typeId;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.maxItems = maxItems;
            inValue.skipCount = skipCount;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getObjectRelationshipsResponse retVal = ((DotCMIS.CMISWebServicesReference.RelationshipServicePort)(this)).getObjectRelationships(inValue);
            return retVal.objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.RepositoryServicePort")]
    internal interface RepositoryServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getRepositoriesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getRepositoriesResponse getRepositories(DotCMIS.CMISWebServicesReference.getRepositoriesRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getRepositoryInfoRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getRepositoryInfoResponse getRepositoryInfo(DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getTypeChildrenRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getTypeChildrenResponse getTypeChildren(DotCMIS.CMISWebServicesReference.getTypeChildrenRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getTypeDescendantsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getTypeDescendantsResponse getTypeDescendants(DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getTypeDefinitionRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getTypeDefinitionResponse getTypeDefinition(DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest request);
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisRepositoryEntryType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string repositoryIdField;
        
        private string repositoryNameField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string repositoryId {
            get {
                return this.repositoryIdField;
            }
            set {
                this.repositoryIdField = value;
                this.RaisePropertyChanged("repositoryId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string repositoryName {
            get {
                return this.repositoryNameField;
            }
            set {
                this.repositoryNameField = value;
                this.RaisePropertyChanged("repositoryName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositories", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getRepositoriesRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getRepositoriesRequest() {
        }
        
        public getRepositoriesRequest(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositoriesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getRepositoriesResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("repositories", IsNullable=true)]
        public cmisRepositoryEntryType[] repositories;
        
        public getRepositoriesResponse() {
        }
        
        public getRepositoriesResponse(cmisRepositoryEntryType[] repositories) {
            this.repositories = repositories;
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisRepositoryInfoType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string repositoryIdField;
        
        private string repositoryNameField;
        
        private string repositoryDescriptionField;
        
        private string vendorNameField;
        
        private string productNameField;
        
        private string productVersionField;
        
        private string rootFolderIdField;
        
        private string latestChangeLogTokenField;
        
        private cmisRepositoryCapabilitiesType capabilitiesField;
        
        private cmisACLCapabilityType aclCapabilityField;
        
        private string cmisVersionSupportedField;
        
        private string thinClientURIField;
        
        private bool changesIncompleteField;
        
        private bool changesIncompleteFieldSpecified;
        
        private enumBaseObjectTypeIds[] changesOnTypeField;
        
        private string principalAnonymousField;
        
        private string principalAnyoneField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string repositoryId {
            get {
                return this.repositoryIdField;
            }
            set {
                this.repositoryIdField = value;
                this.RaisePropertyChanged("repositoryId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string repositoryName {
            get {
                return this.repositoryNameField;
            }
            set {
                this.repositoryNameField = value;
                this.RaisePropertyChanged("repositoryName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public string repositoryDescription {
            get {
                return this.repositoryDescriptionField;
            }
            set {
                this.repositoryDescriptionField = value;
                this.RaisePropertyChanged("repositoryDescription");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public string vendorName {
            get {
                return this.vendorNameField;
            }
            set {
                this.vendorNameField = value;
                this.RaisePropertyChanged("vendorName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public string productName {
            get {
                return this.productNameField;
            }
            set {
                this.productNameField = value;
                this.RaisePropertyChanged("productName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public string productVersion {
            get {
                return this.productVersionField;
            }
            set {
                this.productVersionField = value;
                this.RaisePropertyChanged("productVersion");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public string rootFolderId {
            get {
                return this.rootFolderIdField;
            }
            set {
                this.rootFolderIdField = value;
                this.RaisePropertyChanged("rootFolderId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
        public string latestChangeLogToken {
            get {
                return this.latestChangeLogTokenField;
            }
            set {
                this.latestChangeLogTokenField = value;
                this.RaisePropertyChanged("latestChangeLogToken");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
        public cmisRepositoryCapabilitiesType capabilities {
            get {
                return this.capabilitiesField;
            }
            set {
                this.capabilitiesField = value;
                this.RaisePropertyChanged("capabilities");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
        public cmisACLCapabilityType aclCapability {
            get {
                return this.aclCapabilityField;
            }
            set {
                this.aclCapabilityField = value;
                this.RaisePropertyChanged("aclCapability");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
        public string cmisVersionSupported {
            get {
                return this.cmisVersionSupportedField;
            }
            set {
                this.cmisVersionSupportedField = value;
                this.RaisePropertyChanged("cmisVersionSupported");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI", Order=11)]
        public string thinClientURI {
            get {
                return this.thinClientURIField;
            }
            set {
                this.thinClientURIField = value;
                this.RaisePropertyChanged("thinClientURI");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
        public bool changesIncomplete {
            get {
                return this.changesIncompleteField;
            }
            set {
                this.changesIncompleteField = value;
                this.RaisePropertyChanged("changesIncomplete");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool changesIncompleteSpecified {
            get {
                return this.changesIncompleteFieldSpecified;
            }
            set {
                this.changesIncompleteFieldSpecified = value;
                this.RaisePropertyChanged("changesIncompleteSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("changesOnType", Order=13)]
        public enumBaseObjectTypeIds[] changesOnType {
            get {
                return this.changesOnTypeField;
            }
            set {
                this.changesOnTypeField = value;
                this.RaisePropertyChanged("changesOnType");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=14)]
        public string principalAnonymous {
            get {
                return this.principalAnonymousField;
            }
            set {
                this.principalAnonymousField = value;
                this.RaisePropertyChanged("principalAnonymous");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=15)]
        public string principalAnyone {
            get {
                return this.principalAnyoneField;
            }
            set {
                this.principalAnyoneField = value;
                this.RaisePropertyChanged("principalAnyone");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=16)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisRepositoryCapabilitiesType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private enumCapabilityACL capabilityACLField;
        
        private bool capabilityAllVersionsSearchableField;
        
        private enumCapabilityChanges capabilityChangesField;
        
        private enumCapabilityContentStreamUpdates capabilityContentStreamUpdatabilityField;
        
        private bool capabilityGetDescendantsField;
        
        private bool capabilityGetFolderTreeField;
        
        private bool capabilityMultifilingField;
        
        private bool capabilityPWCSearchableField;
        
        private bool capabilityPWCUpdatableField;
        
        private enumCapabilityQuery capabilityQueryField;
        
        private enumCapabilityRendition capabilityRenditionsField;
        
        private bool capabilityUnfilingField;
        
        private bool capabilityVersionSpecificFilingField;
        
        private enumCapabilityJoin capabilityJoinField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public enumCapabilityACL capabilityACL {
            get {
                return this.capabilityACLField;
            }
            set {
                this.capabilityACLField = value;
                this.RaisePropertyChanged("capabilityACL");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public bool capabilityAllVersionsSearchable {
            get {
                return this.capabilityAllVersionsSearchableField;
            }
            set {
                this.capabilityAllVersionsSearchableField = value;
                this.RaisePropertyChanged("capabilityAllVersionsSearchable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public enumCapabilityChanges capabilityChanges {
            get {
                return this.capabilityChangesField;
            }
            set {
                this.capabilityChangesField = value;
                this.RaisePropertyChanged("capabilityChanges");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public enumCapabilityContentStreamUpdates capabilityContentStreamUpdatability {
            get {
                return this.capabilityContentStreamUpdatabilityField;
            }
            set {
                this.capabilityContentStreamUpdatabilityField = value;
                this.RaisePropertyChanged("capabilityContentStreamUpdatability");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public bool capabilityGetDescendants {
            get {
                return this.capabilityGetDescendantsField;
            }
            set {
                this.capabilityGetDescendantsField = value;
                this.RaisePropertyChanged("capabilityGetDescendants");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public bool capabilityGetFolderTree {
            get {
                return this.capabilityGetFolderTreeField;
            }
            set {
                this.capabilityGetFolderTreeField = value;
                this.RaisePropertyChanged("capabilityGetFolderTree");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public bool capabilityMultifiling {
            get {
                return this.capabilityMultifilingField;
            }
            set {
                this.capabilityMultifilingField = value;
                this.RaisePropertyChanged("capabilityMultifiling");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
        public bool capabilityPWCSearchable {
            get {
                return this.capabilityPWCSearchableField;
            }
            set {
                this.capabilityPWCSearchableField = value;
                this.RaisePropertyChanged("capabilityPWCSearchable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
        public bool capabilityPWCUpdatable {
            get {
                return this.capabilityPWCUpdatableField;
            }
            set {
                this.capabilityPWCUpdatableField = value;
                this.RaisePropertyChanged("capabilityPWCUpdatable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
        public enumCapabilityQuery capabilityQuery {
            get {
                return this.capabilityQueryField;
            }
            set {
                this.capabilityQueryField = value;
                this.RaisePropertyChanged("capabilityQuery");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
        public enumCapabilityRendition capabilityRenditions {
            get {
                return this.capabilityRenditionsField;
            }
            set {
                this.capabilityRenditionsField = value;
                this.RaisePropertyChanged("capabilityRenditions");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
        public bool capabilityUnfiling {
            get {
                return this.capabilityUnfilingField;
            }
            set {
                this.capabilityUnfilingField = value;
                this.RaisePropertyChanged("capabilityUnfiling");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
        public bool capabilityVersionSpecificFiling {
            get {
                return this.capabilityVersionSpecificFilingField;
            }
            set {
                this.capabilityVersionSpecificFilingField = value;
                this.RaisePropertyChanged("capabilityVersionSpecificFiling");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
        public enumCapabilityJoin capabilityJoin {
            get {
                return this.capabilityJoinField;
            }
            set {
                this.capabilityJoinField = value;
                this.RaisePropertyChanged("capabilityJoin");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=14)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumCapabilityACL {
        
        /// <remarks/>
        none,
        
        /// <remarks/>
        discover,
        
        /// <remarks/>
        manage,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumCapabilityChanges {
        
        /// <remarks/>
        none,
        
        /// <remarks/>
        objectidsonly,
        
        /// <remarks/>
        properties,
        
        /// <remarks/>
        all,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumCapabilityContentStreamUpdates {
        
        /// <remarks/>
        anytime,
        
        /// <remarks/>
        pwconly,
        
        /// <remarks/>
        none,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumCapabilityQuery {
        
        /// <remarks/>
        none,
        
        /// <remarks/>
        metadataonly,
        
        /// <remarks/>
        fulltextonly,
        
        /// <remarks/>
        bothseparate,
        
        /// <remarks/>
        bothcombined,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumCapabilityRendition {
        
        /// <remarks/>
        none,
        
        /// <remarks/>
        read,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumCapabilityJoin {
        
        /// <remarks/>
        none,
        
        /// <remarks/>
        inneronly,
        
        /// <remarks/>
        innerandouter,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisACLCapabilityType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private enumSupportedPermissions supportedPermissionsField;
        
        private enumACLPropagation propagationField;
        
        private cmisPermissionDefinition[] permissionsField;
        
        private cmisPermissionMapping[] mappingField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public enumSupportedPermissions supportedPermissions {
            get {
                return this.supportedPermissionsField;
            }
            set {
                this.supportedPermissionsField = value;
                this.RaisePropertyChanged("supportedPermissions");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public enumACLPropagation propagation {
            get {
                return this.propagationField;
            }
            set {
                this.propagationField = value;
                this.RaisePropertyChanged("propagation");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("permissions", Order=2)]
        public cmisPermissionDefinition[] permissions {
            get {
                return this.permissionsField;
            }
            set {
                this.permissionsField = value;
                this.RaisePropertyChanged("permissions");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("mapping", Order=3)]
        public cmisPermissionMapping[] mapping {
            get {
                return this.mappingField;
            }
            set {
                this.mappingField = value;
                this.RaisePropertyChanged("mapping");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumSupportedPermissions {
        
        /// <remarks/>
        basic,
        
        /// <remarks/>
        repository,
        
        /// <remarks/>
        both,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumACLPropagation {
        
        /// <remarks/>
        repositorydetermined,
        
        /// <remarks/>
        objectonly,
        
        /// <remarks/>
        propagate,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPermissionDefinition : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string permissionField;
        
        private string descriptionField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string permission {
            get {
                return this.permissionField;
            }
            set {
                this.permissionField = value;
                this.RaisePropertyChanged("permission");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string description {
            get {
                return this.descriptionField;
            }
            set {
                this.descriptionField = value;
                this.RaisePropertyChanged("description");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPermissionMapping : object, System.ComponentModel.INotifyPropertyChanged {
        
        private enumAllowableActionsKey keyField;
        
        private string[] permissionField;
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public enumAllowableActionsKey key {
            get {
                return this.keyField;
            }
            set {
                this.keyField = value;
                this.RaisePropertyChanged("key");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("permission", Order=1)]
        public string[] permission {
            get {
                return this.permissionField;
            }
            set {
                this.permissionField = value;
                this.RaisePropertyChanged("permission");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumAllowableActionsKey {
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetDescendents.Folder")]
        canGetDescendentsFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetChildren.Folder")]
        canGetChildrenFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetParents.Folder")]
        canGetParentsFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetFolderParent.Object")]
        canGetFolderParentObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canCreateDocument.Folder")]
        canCreateDocumentFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canCreateFolder.Folder")]
        canCreateFolderFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canCreateRelationship.Source")]
        canCreateRelationshipSource,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canCreateRelationship.Target")]
        canCreateRelationshipTarget,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetProperties.Object")]
        canGetPropertiesObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canViewContent.Object")]
        canViewContentObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canUpdateProperties.Object")]
        canUpdatePropertiesObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canMove.Object")]
        canMoveObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canMove.Target")]
        canMoveTarget,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canMove.Source")]
        canMoveSource,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canDelete.Object")]
        canDeleteObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canDeleteTree.Folder")]
        canDeleteTreeFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canSetContent.Document")]
        canSetContentDocument,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canDeleteContent.Document")]
        canDeleteContentDocument,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canAddToFolder.Object")]
        canAddToFolderObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canAddToFolder.Folder")]
        canAddToFolderFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canRemoveFromFolder.Object")]
        canRemoveFromFolderObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canRemoveFromFolder.Folder")]
        canRemoveFromFolderFolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canCheckout.Document")]
        canCheckoutDocument,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canCancelCheckout.Document")]
        canCancelCheckoutDocument,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canCheckin.Document")]
        canCheckinDocument,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetAllVersions.VersionSeries")]
        canGetAllVersionsVersionSeries,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetObjectRelationships.Object")]
        canGetObjectRelationshipsObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canAddPolicy.Object")]
        canAddPolicyObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canAddPolicy.Policy")]
        canAddPolicyPolicy,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canRemovePolicy.Object")]
        canRemovePolicyObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canRemovePolicy.Policy")]
        canRemovePolicyPolicy,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetAppliedPolicies.Object")]
        canGetAppliedPoliciesObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canGetACL.Object")]
        canGetACLObject,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("canApplyACL.Object")]
        canApplyACLObject,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumBaseObjectTypeIds {
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("cmis:document")]
        cmisdocument,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("cmis:folder")]
        cmisfolder,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("cmis:relationship")]
        cmisrelationship,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("cmis:policy")]
        cmispolicy,
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositoryInfo", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getRepositoryInfoRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getRepositoryInfoRequest() {
        }
        
        public getRepositoryInfoRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositoryInfoResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getRepositoryInfoResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType repositoryInfo;
        
        public getRepositoryInfoResponse() {
        }
        
        public getRepositoryInfoResponse(DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType repositoryInfo) {
            this.repositoryInfo = repositoryInfo;
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisTypeDefinitionListType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisTypeDefinitionType[] typesField;
        
        private bool hasMoreItemsField;
        
        private string numItemsField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("types", Order=0)]
        public cmisTypeDefinitionType[] types {
            get {
                return this.typesField;
            }
            set {
                this.typesField = value;
                this.RaisePropertyChanged("types");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public bool hasMoreItems {
            get {
                return this.hasMoreItemsField;
            }
            set {
                this.hasMoreItemsField = value;
                this.RaisePropertyChanged("hasMoreItems");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
        public string numItems {
            get {
                return this.numItemsField;
            }
            set {
                this.numItemsField = value;
                this.RaisePropertyChanged("numItems");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypePolicyDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypeRelationshipDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypeFolderDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypeDocumentDefinitionType))]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisTypeDefinitionType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string idField;
        
        private string localNameField;
        
        private string localNamespaceField;
        
        private string displayNameField;
        
        private string queryNameField;
        
        private string descriptionField;
        
        private enumBaseObjectTypeIds baseIdField;
        
        private string parentIdField;
        
        private bool creatableField;
        
        private bool fileableField;
        
        private bool queryableField;
        
        private bool fulltextIndexedField;
        
        private bool includedInSupertypeQueryField;
        
        private bool controllablePolicyField;
        
        private bool controllableACLField;
        
        private cmisPropertyDefinitionType[] itemsField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        public cmisTypeDefinitionType() {
            this.includedInSupertypeQueryField = true;
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string id {
            get {
                return this.idField;
            }
            set {
                this.idField = value;
                this.RaisePropertyChanged("id");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string localName {
            get {
                return this.localNameField;
            }
            set {
                this.localNameField = value;
                this.RaisePropertyChanged("localName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI", IsNullable=true, Order=2)]
        public string localNamespace {
            get {
                return this.localNamespaceField;
            }
            set {
                this.localNamespaceField = value;
                this.RaisePropertyChanged("localNamespace");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public string displayName {
            get {
                return this.displayNameField;
            }
            set {
                this.displayNameField = value;
                this.RaisePropertyChanged("displayName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public string queryName {
            get {
                return this.queryNameField;
            }
            set {
                this.queryNameField = value;
                this.RaisePropertyChanged("queryName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public string description {
            get {
                return this.descriptionField;
            }
            set {
                this.descriptionField = value;
                this.RaisePropertyChanged("description");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public enumBaseObjectTypeIds baseId {
            get {
                return this.baseIdField;
            }
            set {
                this.baseIdField = value;
                this.RaisePropertyChanged("baseId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
        public string parentId {
            get {
                return this.parentIdField;
            }
            set {
                this.parentIdField = value;
                this.RaisePropertyChanged("parentId");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
        public bool creatable {
            get {
                return this.creatableField;
            }
            set {
                this.creatableField = value;
                this.RaisePropertyChanged("creatable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
        public bool fileable {
            get {
                return this.fileableField;
            }
            set {
                this.fileableField = value;
                this.RaisePropertyChanged("fileable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
        public bool queryable {
            get {
                return this.queryableField;
            }
            set {
                this.queryableField = value;
                this.RaisePropertyChanged("queryable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
        public bool fulltextIndexed {
            get {
                return this.fulltextIndexedField;
            }
            set {
                this.fulltextIndexedField = value;
                this.RaisePropertyChanged("fulltextIndexed");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
        public bool includedInSupertypeQuery {
            get {
                return this.includedInSupertypeQueryField;
            }
            set {
                this.includedInSupertypeQueryField = value;
                this.RaisePropertyChanged("includedInSupertypeQuery");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
        public bool controllablePolicy {
            get {
                return this.controllablePolicyField;
            }
            set {
                this.controllablePolicyField = value;
                this.RaisePropertyChanged("controllablePolicy");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=14)]
        public bool controllableACL {
            get {
                return this.controllableACLField;
            }
            set {
                this.controllableACLField = value;
                this.RaisePropertyChanged("controllableACL");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("propertyBooleanDefinition", typeof(cmisPropertyBooleanDefinitionType), Order=15)]
        [System.Xml.Serialization.XmlElementAttribute("propertyDateTimeDefinition", typeof(cmisPropertyDateTimeDefinitionType), Order=15)]
        [System.Xml.Serialization.XmlElementAttribute("propertyDecimalDefinition", typeof(cmisPropertyDecimalDefinitionType), Order=15)]
        [System.Xml.Serialization.XmlElementAttribute("propertyHtmlDefinition", typeof(cmisPropertyHtmlDefinitionType), Order=15)]
        [System.Xml.Serialization.XmlElementAttribute("propertyIdDefinition", typeof(cmisPropertyIdDefinitionType), Order=15)]
        [System.Xml.Serialization.XmlElementAttribute("propertyIntegerDefinition", typeof(cmisPropertyIntegerDefinitionType), Order=15)]
        [System.Xml.Serialization.XmlElementAttribute("propertyStringDefinition", typeof(cmisPropertyStringDefinitionType), Order=15)]
        [System.Xml.Serialization.XmlElementAttribute("propertyUriDefinition", typeof(cmisPropertyUriDefinitionType), Order=15)]
        public cmisPropertyDefinitionType[] Items {
            get {
                return this.itemsField;
            }
            set {
                this.itemsField = value;
                this.RaisePropertyChanged("Items");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=16)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyBooleanDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyBoolean defaultValueField;
        
        private cmisChoiceBoolean[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyBoolean defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceBoolean[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceBoolean : cmisChoice {
        
        private bool[] valueField;
        
        private cmisChoiceBoolean[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public bool[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceBoolean[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceUri))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceString))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceHtml))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceDecimal))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceDateTime))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceInteger))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceId))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceBoolean))]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoice : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string displayNameField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string displayName {
            get {
                return this.displayNameField;
            }
            set {
                this.displayNameField = value;
                this.RaisePropertyChanged("displayName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceUri : cmisChoice {
        
        private string[] valueField;
        
        private cmisChoiceUri[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", DataType="anyURI", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceUri[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceString : cmisChoice {
        
        private string[] valueField;
        
        private cmisChoiceString[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceString[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceHtml : cmisChoice {
        
        private string[] valueField;
        
        private cmisChoiceHtml[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceHtml[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceDecimal : cmisChoice {
        
        private decimal[] valueField;
        
        private cmisChoiceDecimal[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public decimal[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceDecimal[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceDateTime : cmisChoice {
        
        private System.DateTime[] valueField;
        
        private cmisChoiceDateTime[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public System.DateTime[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceDateTime[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceInteger : cmisChoice {
        
        private string[] valueField;
        
        private cmisChoiceInteger[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", DataType="integer", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceInteger[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisChoiceId : cmisChoice {
        
        private string[] valueField;
        
        private cmisChoiceId[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
        public string[] value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
                this.RaisePropertyChanged("value");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceId[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyUriDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyStringDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyHtmlDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDecimalDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDateTimeDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyIntegerDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyIdDefinitionType))]
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyBooleanDefinitionType))]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyDefinitionType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string idField;
        
        private string localNameField;
        
        private string localNamespaceField;
        
        private string displayNameField;
        
        private string queryNameField;
        
        private string descriptionField;
        
        private enumPropertyType propertyTypeField;
        
        private enumCardinality cardinalityField;
        
        private enumUpdatability updatabilityField;
        
        private bool inheritedField;
        
        private bool inheritedFieldSpecified;
        
        private bool requiredField;
        
        private bool queryableField;
        
        private bool orderableField;
        
        private bool openChoiceField;
        
        private bool openChoiceFieldSpecified;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string id {
            get {
                return this.idField;
            }
            set {
                this.idField = value;
                this.RaisePropertyChanged("id");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string localName {
            get {
                return this.localNameField;
            }
            set {
                this.localNameField = value;
                this.RaisePropertyChanged("localName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI", Order=2)]
        public string localNamespace {
            get {
                return this.localNamespaceField;
            }
            set {
                this.localNamespaceField = value;
                this.RaisePropertyChanged("localNamespace");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public string displayName {
            get {
                return this.displayNameField;
            }
            set {
                this.displayNameField = value;
                this.RaisePropertyChanged("displayName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public string queryName {
            get {
                return this.queryNameField;
            }
            set {
                this.queryNameField = value;
                this.RaisePropertyChanged("queryName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public string description {
            get {
                return this.descriptionField;
            }
            set {
                this.descriptionField = value;
                this.RaisePropertyChanged("description");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public enumPropertyType propertyType {
            get {
                return this.propertyTypeField;
            }
            set {
                this.propertyTypeField = value;
                this.RaisePropertyChanged("propertyType");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
        public enumCardinality cardinality {
            get {
                return this.cardinalityField;
            }
            set {
                this.cardinalityField = value;
                this.RaisePropertyChanged("cardinality");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
        public enumUpdatability updatability {
            get {
                return this.updatabilityField;
            }
            set {
                this.updatabilityField = value;
                this.RaisePropertyChanged("updatability");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
        public bool inherited {
            get {
                return this.inheritedField;
            }
            set {
                this.inheritedField = value;
                this.RaisePropertyChanged("inherited");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool inheritedSpecified {
            get {
                return this.inheritedFieldSpecified;
            }
            set {
                this.inheritedFieldSpecified = value;
                this.RaisePropertyChanged("inheritedSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
        public bool required {
            get {
                return this.requiredField;
            }
            set {
                this.requiredField = value;
                this.RaisePropertyChanged("required");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
        public bool queryable {
            get {
                return this.queryableField;
            }
            set {
                this.queryableField = value;
                this.RaisePropertyChanged("queryable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
        public bool orderable {
            get {
                return this.orderableField;
            }
            set {
                this.orderableField = value;
                this.RaisePropertyChanged("orderable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
        public bool openChoice {
            get {
                return this.openChoiceField;
            }
            set {
                this.openChoiceField = value;
                this.RaisePropertyChanged("openChoice");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool openChoiceSpecified {
            get {
                return this.openChoiceFieldSpecified;
            }
            set {
                this.openChoiceFieldSpecified = value;
                this.RaisePropertyChanged("openChoiceSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=14)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumPropertyType {
        
        /// <remarks/>
        boolean,
        
        /// <remarks/>
        id,
        
        /// <remarks/>
        integer,
        
        /// <remarks/>
        datetime,
        
        /// <remarks/>
        @decimal,
        
        /// <remarks/>
        html,
        
        /// <remarks/>
        @string,
        
        /// <remarks/>
        uri,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumCardinality {
        
        /// <remarks/>
        single,
        
        /// <remarks/>
        multi,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumUpdatability {
        
        /// <remarks/>
        @readonly,
        
        /// <remarks/>
        readwrite,
        
        /// <remarks/>
        whencheckedout,
        
        /// <remarks/>
        oncreate,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyUriDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyUri defaultValueField;
        
        private cmisChoiceUri[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyUri defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceUri[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyStringDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyString defaultValueField;
        
        private string maxLengthField;
        
        private cmisChoiceString[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyString defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=1)]
        public string maxLength {
            get {
                return this.maxLengthField;
            }
            set {
                this.maxLengthField = value;
                this.RaisePropertyChanged("maxLength");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=2)]
        public cmisChoiceString[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyHtmlDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyHtml defaultValueField;
        
        private cmisChoiceHtml[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyHtml defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceHtml[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyDecimalDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyDecimal defaultValueField;
        
        private decimal maxValueField;
        
        private bool maxValueFieldSpecified;
        
        private decimal minValueField;
        
        private bool minValueFieldSpecified;
        
        private enumDecimalPrecision precisionField;
        
        private bool precisionFieldSpecified;
        
        private cmisChoiceDecimal[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyDecimal defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public decimal maxValue {
            get {
                return this.maxValueField;
            }
            set {
                this.maxValueField = value;
                this.RaisePropertyChanged("maxValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxValueSpecified {
            get {
                return this.maxValueFieldSpecified;
            }
            set {
                this.maxValueFieldSpecified = value;
                this.RaisePropertyChanged("maxValueSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public decimal minValue {
            get {
                return this.minValueField;
            }
            set {
                this.minValueField = value;
                this.RaisePropertyChanged("minValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool minValueSpecified {
            get {
                return this.minValueFieldSpecified;
            }
            set {
                this.minValueFieldSpecified = value;
                this.RaisePropertyChanged("minValueSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public enumDecimalPrecision precision {
            get {
                return this.precisionField;
            }
            set {
                this.precisionField = value;
                this.RaisePropertyChanged("precision");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool precisionSpecified {
            get {
                return this.precisionFieldSpecified;
            }
            set {
                this.precisionFieldSpecified = value;
                this.RaisePropertyChanged("precisionSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=4)]
        public cmisChoiceDecimal[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumDecimalPrecision {
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("32")]
        Item32,
        
        /// <remarks/>
        [System.Xml.Serialization.XmlEnumAttribute("64")]
        Item64,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyDateTimeDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyDateTime defaultValueField;
        
        private enumDateTimeResolution resolutionField;
        
        private bool resolutionFieldSpecified;
        
        private cmisChoiceDateTime[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyDateTime defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public enumDateTimeResolution resolution {
            get {
                return this.resolutionField;
            }
            set {
                this.resolutionField = value;
                this.RaisePropertyChanged("resolution");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool resolutionSpecified {
            get {
                return this.resolutionFieldSpecified;
            }
            set {
                this.resolutionFieldSpecified = value;
                this.RaisePropertyChanged("resolutionSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=2)]
        public cmisChoiceDateTime[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumDateTimeResolution {
        
        /// <remarks/>
        year,
        
        /// <remarks/>
        date,
        
        /// <remarks/>
        time,
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyIntegerDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyInteger defaultValueField;
        
        private string maxValueField;
        
        private string minValueField;
        
        private cmisChoiceInteger[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyInteger defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=1)]
        public string maxValue {
            get {
                return this.maxValueField;
            }
            set {
                this.maxValueField = value;
                this.RaisePropertyChanged("maxValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
        public string minValue {
            get {
                return this.minValueField;
            }
            set {
                this.minValueField = value;
                this.RaisePropertyChanged("minValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=3)]
        public cmisChoiceInteger[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisPropertyIdDefinitionType : cmisPropertyDefinitionType {
        
        private cmisPropertyId defaultValueField;
        
        private cmisChoiceId[] choiceField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisPropertyId defaultValue {
            get {
                return this.defaultValueField;
            }
            set {
                this.defaultValueField = value;
                this.RaisePropertyChanged("defaultValue");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
        public cmisChoiceId[] choice {
            get {
                return this.choiceField;
            }
            set {
                this.choiceField = value;
                this.RaisePropertyChanged("choice");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisTypePolicyDefinitionType : cmisTypeDefinitionType {
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisTypeRelationshipDefinitionType : cmisTypeDefinitionType {
        
        private string[] allowedSourceTypesField;
        
        private string[] allowedTargetTypesField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("allowedSourceTypes", Order=0)]
        public string[] allowedSourceTypes {
            get {
                return this.allowedSourceTypesField;
            }
            set {
                this.allowedSourceTypesField = value;
                this.RaisePropertyChanged("allowedSourceTypes");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("allowedTargetTypes", Order=1)]
        public string[] allowedTargetTypes {
            get {
                return this.allowedTargetTypesField;
            }
            set {
                this.allowedTargetTypesField = value;
                this.RaisePropertyChanged("allowedTargetTypes");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisTypeFolderDefinitionType : cmisTypeDefinitionType {
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public partial class cmisTypeDocumentDefinitionType : cmisTypeDefinitionType {
        
        private bool versionableField;
        
        private enumContentStreamAllowed contentStreamAllowedField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public bool versionable {
            get {
                return this.versionableField;
            }
            set {
                this.versionableField = value;
                this.RaisePropertyChanged("versionable");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public enumContentStreamAllowed contentStreamAllowed {
            get {
                return this.contentStreamAllowedField;
            }
            set {
                this.contentStreamAllowedField = value;
                this.RaisePropertyChanged("contentStreamAllowed");
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
    public enum enumContentStreamAllowed {
        
        /// <remarks/>
        notallowed,
        
        /// <remarks/>
        allowed,
        
        /// <remarks/>
        required,
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeChildren", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getTypeChildrenRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string typeId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePropertyDefinitions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string maxItems;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string skipCount;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getTypeChildrenRequest() {
        }
        
        public getTypeChildrenRequest(string repositoryId, string typeId, System.Nullable<bool> includePropertyDefinitions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.typeId = typeId;
            this.includePropertyDefinitions = includePropertyDefinitions;
            this.maxItems = maxItems;
            this.skipCount = skipCount;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeChildrenResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getTypeChildrenResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType types;
        
        public getTypeChildrenResponse() {
        }
        
        public getTypeChildrenResponse(DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType types) {
            this.types = types;
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisTypeContainer : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisTypeDefinitionType typeField;
        
        private cmisTypeContainer[] childrenField;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisTypeDefinitionType type {
            get {
                return this.typeField;
            }
            set {
                this.typeField = value;
                this.RaisePropertyChanged("type");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("children", Order=1)]
        public cmisTypeContainer[] children {
            get {
                return this.childrenField;
            }
            set {
                this.childrenField = value;
                this.RaisePropertyChanged("children");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDescendants", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getTypeDescendantsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string typeId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
        public string depth;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePropertyDefinitions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getTypeDescendantsRequest() {
        }
        
        public getTypeDescendantsRequest(string repositoryId, string typeId, string depth, System.Nullable<bool> includePropertyDefinitions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.typeId = typeId;
            this.depth = depth;
            this.includePropertyDefinitions = includePropertyDefinitions;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDescendantsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getTypeDescendantsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("types")]
        public cmisTypeContainer[] types;
        
        public getTypeDescendantsResponse() {
        }
        
        public getTypeDescendantsResponse(cmisTypeContainer[] types) {
            this.types = types;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDefinition", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getTypeDefinitionRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string typeId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getTypeDefinitionRequest() {
        }
        
        public getTypeDefinitionRequest(string repositoryId, string typeId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.typeId = typeId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDefinitionResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getTypeDefinitionResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType type;
        
        public getTypeDefinitionResponse() {
        }
        
        public getTypeDefinitionResponse(DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType type) {
            this.type = type;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface RepositoryServicePortChannel : DotCMIS.CMISWebServicesReference.RepositoryServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class RepositoryServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.RepositoryServicePort>, DotCMIS.CMISWebServicesReference.RepositoryServicePort {
        
        public RepositoryServicePortClient() {
        }
        
        public RepositoryServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public RepositoryServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public RepositoryServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public RepositoryServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getRepositoriesResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getRepositories(DotCMIS.CMISWebServicesReference.getRepositoriesRequest request) {
            return base.Channel.getRepositories(request);
        }
        
        public cmisRepositoryEntryType[] getRepositories(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getRepositoriesRequest inValue = new DotCMIS.CMISWebServicesReference.getRepositoriesRequest();
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getRepositoriesResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getRepositories(inValue);
            return retVal.repositories;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getRepositoryInfoResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getRepositoryInfo(DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest request) {
            return base.Channel.getRepositoryInfo(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType getRepositoryInfo(string repositoryId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest inValue = new DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest();
            inValue.repositoryId = repositoryId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getRepositoryInfoResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getRepositoryInfo(inValue);
            return retVal.repositoryInfo;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getTypeChildrenResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getTypeChildren(DotCMIS.CMISWebServicesReference.getTypeChildrenRequest request) {
            return base.Channel.getTypeChildren(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType getTypeChildren(string repositoryId, string typeId, System.Nullable<bool> includePropertyDefinitions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getTypeChildrenRequest inValue = new DotCMIS.CMISWebServicesReference.getTypeChildrenRequest();
            inValue.repositoryId = repositoryId;
            inValue.typeId = typeId;
            inValue.includePropertyDefinitions = includePropertyDefinitions;
            inValue.maxItems = maxItems;
            inValue.skipCount = skipCount;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getTypeChildrenResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getTypeChildren(inValue);
            return retVal.types;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getTypeDescendantsResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getTypeDescendants(DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest request) {
            return base.Channel.getTypeDescendants(request);
        }
        
        public cmisTypeContainer[] getTypeDescendants(string repositoryId, string typeId, string depth, System.Nullable<bool> includePropertyDefinitions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest inValue = new DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest();
            inValue.repositoryId = repositoryId;
            inValue.typeId = typeId;
            inValue.depth = depth;
            inValue.includePropertyDefinitions = includePropertyDefinitions;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getTypeDescendantsResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getTypeDescendants(inValue);
            return retVal.types;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getTypeDefinitionResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getTypeDefinition(DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest request) {
            return base.Channel.getTypeDefinition(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType getTypeDefinition(string repositoryId, string typeId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest inValue = new DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest();
            inValue.repositoryId = repositoryId;
            inValue.typeId = typeId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getTypeDefinitionResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getTypeDefinition(inValue);
            return retVal.type;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.VersioningServicePort")]
    internal interface VersioningServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message checkOutRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.checkOutResponse checkOut(DotCMIS.CMISWebServicesReference.checkOutRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message cancelCheckOutRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.cancelCheckOutResponse cancelCheckOut(DotCMIS.CMISWebServicesReference.cancelCheckOutRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message checkInRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.checkInResponse checkIn(DotCMIS.CMISWebServicesReference.checkInRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectOfLatestVersionRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionResponse getObjectOfLatestVersion(DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getPropertiesOfLatestVersionRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionResponse getPropertiesOfLatestVersion(DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getAllVersionsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getAllVersionsResponse getAllVersions(DotCMIS.CMISWebServicesReference.getAllVersionsRequest request);
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="checkOut", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class checkOutRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public checkOutRequest() {
        }
        
        public checkOutRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="checkOutResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class checkOutResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public bool contentCopied;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public checkOutResponse() {
        }
        
        public checkOutResponse(string objectId, bool contentCopied, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.contentCopied = contentCopied;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="cancelCheckOut", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class cancelCheckOutRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public cancelCheckOutRequest() {
        }
        
        public cancelCheckOutRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="cancelCheckOutResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class cancelCheckOutResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public cancelCheckOutResponse() {
        }
        
        public cancelCheckOutResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="checkIn", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class checkInRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> major;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string checkinComment;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
        public string[] policies;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public checkInRequest() {
        }
        
        public checkInRequest(string repositoryId, string objectId, System.Nullable<bool> major, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, string checkinComment, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.major = major;
            this.properties = properties;
            this.contentStream = contentStream;
            this.checkinComment = checkinComment;
            this.policies = policies;
            this.addACEs = addACEs;
            this.removeACEs = removeACEs;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="checkInResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class checkInResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public checkInResponse() {
        }
        
        public checkInResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.objectId = objectId;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectOfLatestVersion", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectOfLatestVersionRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public bool major;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumIncludeRelationships> includeRelationships;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string renditionFilter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includePolicyIds;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeACL;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getObjectOfLatestVersionRequest() {
        }
        
        public getObjectOfLatestVersionRequest(string repositoryId, string objectId, bool major, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.major = major;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.includeRelationships = includeRelationships;
            this.renditionFilter = renditionFilter;
            this.includePolicyIds = includePolicyIds;
            this.includeACL = includeACL;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectOfLatestVersionResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getObjectOfLatestVersionResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
        
        public getObjectOfLatestVersionResponse() {
        }
        
        public getObjectOfLatestVersionResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
            this.@object = @object;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getPropertiesOfLatestVersion", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getPropertiesOfLatestVersionRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public bool major;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getPropertiesOfLatestVersionRequest() {
        }
        
        public getPropertiesOfLatestVersionRequest(string repositoryId, string objectId, bool major, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.major = major;
            this.filter = filter;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getPropertiesOfLatestVersionResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getPropertiesOfLatestVersionResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
        
        public getPropertiesOfLatestVersionResponse() {
        }
        
        public getPropertiesOfLatestVersionResponse(DotCMIS.CMISWebServicesReference.cmisPropertiesType properties) {
            this.properties = properties;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllVersions", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getAllVersionsRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string filter;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> includeAllowableActions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getAllVersionsRequest() {
        }
        
        public getAllVersionsRequest(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.filter = filter;
            this.includeAllowableActions = includeAllowableActions;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllVersionsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getAllVersionsResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        [System.Xml.Serialization.XmlElementAttribute("objects")]
        public cmisObjectType[] objects;
        
        public getAllVersionsResponse() {
        }
        
        public getAllVersionsResponse(cmisObjectType[] objects) {
            this.objects = objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface VersioningServicePortChannel : DotCMIS.CMISWebServicesReference.VersioningServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class VersioningServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.VersioningServicePort>, DotCMIS.CMISWebServicesReference.VersioningServicePort {
        
        public VersioningServicePortClient() {
        }
        
        public VersioningServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public VersioningServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public VersioningServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public VersioningServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.checkOutResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.checkOut(DotCMIS.CMISWebServicesReference.checkOutRequest request) {
            return base.Channel.checkOut(request);
        }
        
        public bool checkOut(string repositoryId, ref string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.checkOutRequest inValue = new DotCMIS.CMISWebServicesReference.checkOutRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.checkOutResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).checkOut(inValue);
            objectId = retVal.objectId;
            extension = retVal.extension;
            return retVal.contentCopied;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.cancelCheckOutResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.cancelCheckOut(DotCMIS.CMISWebServicesReference.cancelCheckOutRequest request) {
            return base.Channel.cancelCheckOut(request);
        }
        
        public void cancelCheckOut(string repositoryId, string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.cancelCheckOutRequest inValue = new DotCMIS.CMISWebServicesReference.cancelCheckOutRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.cancelCheckOutResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).cancelCheckOut(inValue);
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.checkInResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.checkIn(DotCMIS.CMISWebServicesReference.checkInRequest request) {
            return base.Channel.checkIn(request);
        }
        
        public void checkIn(string repositoryId, ref string objectId, System.Nullable<bool> major, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, string checkinComment, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.checkInRequest inValue = new DotCMIS.CMISWebServicesReference.checkInRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.major = major;
            inValue.properties = properties;
            inValue.contentStream = contentStream;
            inValue.checkinComment = checkinComment;
            inValue.policies = policies;
            inValue.addACEs = addACEs;
            inValue.removeACEs = removeACEs;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.checkInResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).checkIn(inValue);
            objectId = retVal.objectId;
            extension = retVal.extension;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.getObjectOfLatestVersion(DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest request) {
            return base.Channel.getObjectOfLatestVersion(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisObjectType getObjectOfLatestVersion(string repositoryId, string objectId, bool major, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.major = major;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.includeRelationships = includeRelationships;
            inValue.renditionFilter = renditionFilter;
            inValue.includePolicyIds = includePolicyIds;
            inValue.includeACL = includeACL;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).getObjectOfLatestVersion(inValue);
            return retVal.@object;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.getPropertiesOfLatestVersion(DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest request) {
            return base.Channel.getPropertiesOfLatestVersion(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisPropertiesType getPropertiesOfLatestVersion(string repositoryId, string objectId, bool major, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest inValue = new DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.major = major;
            inValue.filter = filter;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).getPropertiesOfLatestVersion(inValue);
            return retVal.properties;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getAllVersionsResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.getAllVersions(DotCMIS.CMISWebServicesReference.getAllVersionsRequest request) {
            return base.Channel.getAllVersions(request);
        }
        
        public cmisObjectType[] getAllVersions(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getAllVersionsRequest inValue = new DotCMIS.CMISWebServicesReference.getAllVersionsRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.filter = filter;
            inValue.includeAllowableActions = includeAllowableActions;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getAllVersionsResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).getAllVersions(inValue);
            return retVal.objects;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.ACLServicePort")]
    internal interface ACLServicePort {
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getACLRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.getACLResponse getACL(DotCMIS.CMISWebServicesReference.getACLRequest request);
        
        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message applyACLRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
        DotCMIS.CMISWebServicesReference.applyACLResponse applyACL(DotCMIS.CMISWebServicesReference.applyACLRequest request);
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
    public partial class cmisACLType : object, System.ComponentModel.INotifyPropertyChanged {
        
        private cmisAccessControlListType aCLField;
        
        private bool exactField;
        
        private bool exactFieldSpecified;
        
        private System.Xml.XmlElement[] anyField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public cmisAccessControlListType ACL {
            get {
                return this.aCLField;
            }
            set {
                this.aCLField = value;
                this.RaisePropertyChanged("ACL");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public bool exact {
            get {
                return this.exactField;
            }
            set {
                this.exactField = value;
                this.RaisePropertyChanged("exact");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool exactSpecified {
            get {
                return this.exactFieldSpecified;
            }
            set {
                this.exactFieldSpecified = value;
                this.RaisePropertyChanged("exactSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
        public System.Xml.XmlElement[] Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
                this.RaisePropertyChanged("Any");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
        public System.Xml.XmlAttribute[] AnyAttr {
            get {
                return this.anyAttrField;
            }
            set {
                this.anyAttrField = value;
                this.RaisePropertyChanged("AnyAttr");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getACL", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getACLRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<bool> onlyBasicPermissions;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public getACLRequest() {
        }
        
        public getACLRequest(string repositoryId, string objectId, System.Nullable<bool> onlyBasicPermissions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.onlyBasicPermissions = onlyBasicPermissions;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="getACLResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class getACLResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisACLType ACL;
        
        public getACLResponse() {
        }
        
        public getACLResponse(DotCMIS.CMISWebServicesReference.cmisACLType ACL) {
            this.ACL = ACL;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="applyACL", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class applyACLRequest {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public string repositoryId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
        public string objectId;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public System.Nullable<enumACLPropagation> ACLPropagation;
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
        
        public applyACLRequest() {
        }
        
        public applyACLRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, System.Nullable<enumACLPropagation> ACLPropagation, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            this.repositoryId = repositoryId;
            this.objectId = objectId;
            this.addACEs = addACEs;
            this.removeACEs = removeACEs;
            this.ACLPropagation = ACLPropagation;
            this.extension = extension;
        }
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(WrapperName="applyACLResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
    internal partial class applyACLResponse {
        
        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
        public DotCMIS.CMISWebServicesReference.cmisACLType ACL;
        
        public applyACLResponse() {
        }
        
        public applyACLResponse(DotCMIS.CMISWebServicesReference.cmisACLType ACL) {
            this.ACL = ACL;
        }
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal interface ACLServicePortChannel : DotCMIS.CMISWebServicesReference.ACLServicePort, System.ServiceModel.IClientChannel {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    internal partial class ACLServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.ACLServicePort>, DotCMIS.CMISWebServicesReference.ACLServicePort {
        
        public ACLServicePortClient() {
        }
        
        public ACLServicePortClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }
        
        public ACLServicePortClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public ACLServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }
        
        public ACLServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.getACLResponse DotCMIS.CMISWebServicesReference.ACLServicePort.getACL(DotCMIS.CMISWebServicesReference.getACLRequest request) {
            return base.Channel.getACL(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisACLType getACL(string repositoryId, string objectId, System.Nullable<bool> onlyBasicPermissions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.getACLRequest inValue = new DotCMIS.CMISWebServicesReference.getACLRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.onlyBasicPermissions = onlyBasicPermissions;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.getACLResponse retVal = ((DotCMIS.CMISWebServicesReference.ACLServicePort)(this)).getACL(inValue);
            return retVal.ACL;
        }
        
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        DotCMIS.CMISWebServicesReference.applyACLResponse DotCMIS.CMISWebServicesReference.ACLServicePort.applyACL(DotCMIS.CMISWebServicesReference.applyACLRequest request) {
            return base.Channel.applyACL(request);
        }
        
        public DotCMIS.CMISWebServicesReference.cmisACLType applyACL(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, System.Nullable<enumACLPropagation> ACLPropagation, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
            DotCMIS.CMISWebServicesReference.applyACLRequest inValue = new DotCMIS.CMISWebServicesReference.applyACLRequest();
            inValue.repositoryId = repositoryId;
            inValue.objectId = objectId;
            inValue.addACEs = addACEs;
            inValue.removeACEs = removeACEs;
            inValue.ACLPropagation = ACLPropagation;
            inValue.extension = extension;
            DotCMIS.CMISWebServicesReference.applyACLResponse retVal = ((DotCMIS.CMISWebServicesReference.ACLServicePort)(this)).applyACL(inValue);
            return retVal.ACL;
        }
    }
}
