java导入ldif文件

Posted dqcer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java导入ldif文件相关的知识,希望对你有一定的参考价值。

网上导入ldif文件的方式都是基于命令,或者相应工具如LDAP Browser \Editor v2.8.2。

但用java去实现这样的功能好像网上很少,于是我参照相应的开源代码并整理了一下,亲自测试通过,若有疑问欢迎留言!!!

将ldap.jar导入到项目中

LDIFReader.java

package com.cn.ccc.ggg.ldap.core.common;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPControl;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPLocalException;
import com.novell.ldap.LDAPMessage;
import com.novell.ldap.LDAPModification;
import com.novell.ldap.LDAPSearchResult;
import com.novell.ldap.LDAPAddRequest;
import com.novell.ldap.LDAPDeleteRequest;
import com.novell.ldap.LDAPModifyDNRequest;
import com.novell.ldap.LDAPModifyRequest;
import com.novell.ldap.util.Base64;
import com.novell.ldap.util.LDAPReader;

/**
 * 处理inputStream对象以读取LDIF文件的类
 *
 * <p>该calss从LDIF文件读取LDAP条目和LDAP请求</p>
 *
 * <p>构造函数使用默认大小值8,192来创建 缓冲字符输入流并假定大小很大足以容纳下一个字段的dn字段和第一行当前正在阅读的LDIF文件中的第一条记录</p>
 *
 * <p>构造函数使用‘1‘作为默认的LDIF文件版本</p>
 */
public class LDIFReader implements LDAPReader {

    private boolean            requestFile=true;          // request file=true
    private String             version;                   // LDIF file version
    private int                reqType;                   // int rep. of name
    private int                lNumber;                   // line number
    private int                dnlNumber;                  // dn line number
    private int                fNumber = 0;               // number of fields
    private byte[]             bytes= new byte[0];        // for any byte value
    private boolean            control = false;            // is control field
    private String             entryDN;                   // entry dn
    private String[]           modInfo;                   // for moddn
    private ArrayList          rFields = new ArrayList(); // record fields
    private ArrayList          cList = new ArrayList();   // control list
    private BufferedReader     bufReader;
    private LDAPControl[]      controls = null;           // req controls
    private LDAPEntry          currentEntry = null;
    private LDAPModification[] mods;
    private LDAPMessage        currentRequest = null;

    /**
     * 通过初始化LDIF_VERSION,isRequest构造LDIFReader对象,
     * InputStreamReader和BufferedReader
     *
     * @param in The InputStream object to be processed by LDIFReader
     */
    public LDIFReader( InputStream in )
                throws IOException, LDAPLocalException
    {
        this( in, 1, 8192 );
        return;
    }

    /**
     * 通过初始化LDIF_VERSION,isRequest构造LDIFReader对象,
     * InputStreamReader和BufferedReader
     *
     * @param in The   Inputstream object to be processed by LDIFReader
     * @param version  The version currently used in the LDIF file
     */
    public LDIFReader( InputStream in, int version )
                throws IOException, LDAPLocalException
    {
        this( in, version, 8192 );
        return;
    }
    /**
     * 通过初始化LDIF_VERSION,isRequest构造LDIFReader对象,
     * InputStreamReader和BufferedReader
     *
     * @param in The   Inputstream object to be processed by LDIFReader
     * @param version  The version currently used in the LDIF file
     * @param bufSize  The size used to create a buffering character-input
     *                 stream. The defaule value is 8,192.
     */
    public LDIFReader(InputStream in, int version, int bufSize)
                throws IOException, LDAPLocalException
    {

        super();

        String line = null;

        if ( version != 1 ) {  // check LDIF file version
            throw new RuntimeException("com.novell.ldap.ldif_dsml.LDIFReader:"
                              + "found: " + version + ", Should be: 1");
        }

        setVersion( version );
        InputStreamReader isr = new InputStreamReader(in, "US-ASCII");
        bufReader = new BufferedReader(isr);

        //为了确定它是否是LDIF内容文件或LDIF更改
        //文件,dn字段的第一行和旁边的有意义的行
        // dn字段被读入内存。

        //在版本行之前跳过前面的空行和注释行
       /* while( (line = bufReader.readLine())!= null &&
               (line.length() == 0 || line.startsWith("#")) ) {
            this.lNumber++;
        }

        //已经到达文件的末尾

        if ( line == null ) {
            throw new LDAPLocalException(
                "com.novell.ldap.ldif_dsml.LDIFReader:"
                    + " The file contains no LDIF info",
                        LDAPException.LOCAL_ERROR);
        }

       //需要增加行号
        this.lNumber++; //    1

      //第一个有效行(版本行)。 检查版本行
        
        if (line.startsWith("version:")) {
            this.version = line.substring("version:".length()).trim();
            if ( !this.version.equals( "1") ) {
                throw new LDAPLocalException(
                    "com.novell.ldap.ldif_dsml.LDIFReader: "
                        + "version: found ‘" + version + "‘ (on line "
                            + this.lNumber + " of the file), should be ‘1‘",
                                LDAPException.LOCAL_ERROR);
            }
        }else { // 第一行有效行不是版本行
            throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
                + " Version line must be the first meaningful line(on line " +
                    this.lNumber + " of the file)",
                        LDAPException.LOCAL_ERROR);
        }
        */

        //    跳过版本行和之间的空行和注释行
        //    LDIF的第一个记录中的dn字段的第一行
        //    文件,读取第一条记录的dn字段的第一行
        do {
            //标记第一个dn行,所以我们以后可以回到这里
            bufReader.mark( bufSize );
            line=bufReader.readLine();

            if ( line == null) {  // end of file
                throw new LDAPLocalException( "com.novell.ldap.ldif_dsml."
                    + "LDIFReader: the LDIF file only contains version line.",
                        LDAPException.LOCAL_ERROR);
            }
            this.lNumber++;
        } while((line.length()== 0) || line.startsWith("#"));

        //稍后会检查dn字段; 现在忽略了其余的一行
        // dn字段,并在dn字段后面读取有效行
        while ( (line = bufReader.readLine()) != null ) {

            // ! a part of dn field       ! a comment line
            if ( !line.startsWith(" ") && !line.startsWith("#") ) {
                //到第一个记录的结尾
                 if ( line.length() == 0 ) {
                    //空行 这个记录只有dn字段
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: the first record only has dn field(line "
                            + this.lNumber + " of the file)",
                                LDAPException.LOCAL_ERROR);
                 }
               //刚刚读取的行应该是开头的行
               //‘control‘, ‘changetype‘, 属性名
                break;
            }
        }

        if ( line == null) { // end of file
            throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: the first record only has dn field(line "
                            + this.lNumber + " of the file)",
                                LDAPException.LOCAL_ERROR);
        }

        if(line.startsWith("changetype")||line.startsWith("control")){
            setRequest(true);  // LDIF使用LDAP操作请求更改文件
        }
        else {
            setRequest(false); // 带有LDAP条目的LDIF内容文件
        }
        
        setRequest(true);
        
        
        //返回到LDIF文件的第一个记录的开头
        //稍后读取可以从第一条记录开始
        bufReader.reset();

        //
        this.lNumber--;
        return;
    }

    /**
     * 获取与输入流相关联的LDIF数据的版本
     *
     * @return the version number
     */
    public String getVersion()
    {
        return version;
    }

    /**
     * 获取与输入流相关联的LDIF数据的版本
     *
     * @param value the version number
     */
    private void setVersion(int value)
    {
        version = String.valueOf(value);
        return;
    }

    /**
     * 如果请求数据与输入流相关联,则返回true,
     * 或如果内容数据为false。
     *
     * @return true if input stream contains request data.
     */
    public boolean isRequest()
    {
        return requestFile;
    }

    /**
     * 设置正在读取的文件的请求类型,如果请求数据为true
     * 或如果内容数据为false。
     *
     * @param type sets the type of file to content or request data.
     */
    private void setRequest( boolean type)
    {
        requestFile = type;
        return;
    }

    /**
     * 从LDIF请求(更改)文件或内容文件读取LDAP请求。.
     *
     * @return LDAPMessage specified by the record
     */
    public LDAPMessage readMessage()
                throws IOException, LDAPException
    {
        readRecordFields();           // 读取记录字段
        if ( this.rFields == null ) { // 文件结尾
            return null;
        }
        toRecordProperties();         // 设置记录属性


        if (!isRequest()) {
            return new LDAPSearchResult(currentEntry, null);
        }

        switch( this.reqType ) {
            case LDAPMessage.SEARCH_RESPONSE :
                this.currentRequest = new LDAPAddRequest(currentEntry, controls);
                break;
            case LDAPMessage.ADD_REQUEST :
                this.currentRequest = new LDAPAddRequest(currentEntry, controls);
                break;
            case LDAPMessage.DEL_REQUEST :
                this.currentRequest = new LDAPDeleteRequest(this.entryDN, controls);
                break;
            case LDAPMessage.MODIFY_RDN_REQUEST :
                boolean  delOldRdn;

                if ( Integer.parseInt(this.modInfo[1]) == 1 ) {
                    delOldRdn = true;
                } else {
                    delOldRdn = false;
                }

                if((modInfo[2].length())==0 ) {
                    this.currentRequest = new LDAPModifyDNRequest( this.entryDN,
                                     this.modInfo[0], null, delOldRdn, controls);
                } else {
                    this.currentRequest = new LDAPModifyDNRequest(this.entryDN,
                         this.modInfo[0], modInfo[2], delOldRdn, controls);
                }
                break;
            case LDAPMessage.MODIFY_REQUEST :
                this.currentRequest =
                          new LDAPModifyRequest(this.entryDN, mods, controls);
                break;
            default:
        }

        return this.currentRequest;
    }


    /**
     * 读取当前记录中的所有行,将记录行转换为
     * 记录字段,并修剪记录字段中的多余空格。
     */
    private void  readRecordFields()
                throws IOException, LDAPException
    {

        String line;
        StringBuffer bLine = new StringBuffer(80);

        // clean rFields
        this.rFields.clear();

        //跳过空和注释行并读取第一个dn
        //行记录
        while( (line = bufReader.readLine())!= null &&
               (line.length() == 0 || line.startsWith("#")) ) {
            this.lNumber++;
        }

        this.lNumber++;
        this.dnlNumber = this.lNumber;

        if (line == null) { // 文件结尾
            this.rFields = null;
        }
        else {
            //检查dn行是否以‘dn:‘开头
            if (!line.startsWith("dn:")) {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml." +
                    "LDIFReacer: Any record should start with ‘dn:‘(on line "
                        + this.lNumber + " of the file).",
                            LDAPException.LOCAL_ERROR);
            }

            //保存第一个dn行
            bLine.append(line);

            //读取除注释行之外的记录的其他行。
            //读取停止在用于分隔的空行
            //当前记录与下一个
            while ((line = bufReader.readLine())!=null && line.length()!=0 ) {
                if ( !line.startsWith("#") ) {       //跳过注释行
                    if ( line.startsWith(" ") ) {    //续行?
                        // trim off leading ‘ ‘ and append it to previous line
                        bLine.append(line.substring(1, line.length()));
                    }
                    else { // 新的一行
                        // handle pewvious field
                        bLine = trimField(bLine);    // trime上一个字段
                        if(!this.control) {          // 如果不是,保存它
                            this.rFields.add(bLine); // 一个控制字段
                        }
                        //处理新行
                        bLine = new StringBuffer(80);// create a new buffer
                        bLine.append(line);          // to hold new line
                    }
                }
                this.lNumber++;
            }
            //修剪并保存最后一个字段
            bLine = trimField(bLine);
            this.rFields.add(bLine);

            this.lNumber++;                      // 增加行号
            this.fNumber = this.rFields.size();  // 获取字段数
        }
        return;
    }


    /**
     * 设置记录属性。
     * <p>对于LDIF内容记录,创建由此记录指定的LDAPEntry</p>
     *
     * <p>对于LDIF更改记录,根据请求类型,将创建LDAPEntry,modInfo或LDAPModifiction数组以及与请求相关联的控件</p>
     */
    private void toRecordProperties()
                throws IOException, LDAPException
    {

        int index;
        String req;

        // set entry DN
        StringBuffer dnField = (StringBuffer)this.rFields.get(0);
        if (dnField.charAt(3) != ‘:‘) {
            // commom string value
            this.entryDN = dnField.substring( 3, dnField.length());
        }
        else {
            // base64 encoded
            this.bytes = Base64.decode(dnField, 4, dnField.length());
            try {
                this.entryDN = new String(this.bytes, "UTF-8");
            } catch( UnsupportedEncodingException ue) {
                throw new RuntimeException(
                    "UTF-8 String encoding not supported by JVM");
            }
        }

        if ( !isRequest() ) {  // 是一个内容LDIF文件
            toLDAPEntry();
        } else {  // 是一个更改LDIF文件
            index = 10; // length of ‘changetype‘
            // ctField - changetype field
            StringBuffer ctField = (StringBuffer)this.rFields.get(1);

            this.reqType = LDAPMessage.ADD_REQUEST;
            toLDAPEntry();
            
            
            /*if(!ctField.substring(0, index).equalsIgnoreCase("changetype")) {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                    +"LDIFReader: malformed changetype field in record starting"
                        + " on line " + this.dnlNumber + " of the file).",
                            LDAPException.LOCAL_ERROR);
            }
            // 获取类型: ‘add‘, ‘delete‘,‘moddn‘, ‘modrdn‘, or ‘modify‘
            req = ctField.substring(index+1);

            // 设置请求类型
            if ( req.equalsIgnoreCase("add") ) {
                this.reqType = LDAPMessage.ADD_REQUEST;
                toLDAPEntry();
            }
            else if ( req.equalsIgnoreCase("delete") ) {
                this.reqType = LDAPMessage.DEL_REQUEST;
            }
            else if ( req.equalsIgnoreCase("modrdn") ) {
                this.reqType = LDAPMessage.MODIFY_RDN_REQUEST;
                toModInfo();
            }
            else if ( req.equalsIgnoreCase("moddn") ) {
                this.reqType = LDAPMessage.MODIFY_RDN_REQUEST;
                toModInfo();
            }
            else if ( req.equalsIgnoreCase("modify") ) {
                this.reqType = LDAPMessage.MODIFY_REQUEST;
                toLDAPModifications();
            }
            else {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                    + "LDIFReader: unsupported request type ‘" + req
                    + "‘ specified in changetype filed of the record starting "
                    + "on line " + this.dnlNumber + " of the file.",
                    LDAPException.LOCAL_ERROR);
            }*/


            if (this.cList.size() > 0) {
                this.controls = new LDAPControl[this.cList.size()];
            }
        }
        return;
    }


    /**
     * 处理LDIF记录字段以生成LDAPEntry。
     */
    private void toLDAPEntry()
                throws LDAPLocalException
    {
        int i, index, fieldIndex;
        String attrName = null;
        StringBuffer currentField;
        LDAPAttributeSet attrSet = new LDAPAttributeSet();

        if ( !isRequest() ) { // 跳过 dn 字段
            fieldIndex = 0;
        }
        else { // 跳过dn,control和changetype字段
            fieldIndex = 1;
        }

        for (i=fieldIndex; i<this.fNumber; i++) {
            currentField = (StringBuffer)this.rFields.get(i);
            // ‘:‘ 分离属性名称和属性值
            index = IndexOf(currentField, ‘:‘);
            if (index == -1) { // ‘:‘ not found
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                    + "LDIFReader: missing ‘:‘ after attribute name in record "
                        + "starting on line " + this.dnlNumber +" of the file.",
                            LDAPException.LOCAL_ERROR);
            }

            // 获取属性名称
            attrName = currentField.substring(0,index);
            // 如果属性名称不存在,则添加 
            if ( attrSet.getAttribute(attrName) == null ) {
                // add it to attrSet with no value
                attrSet.add(new LDAPAttribute(attrName));
            }

            if(currentField.length() > index+1){
                // 将属性值添加到属性中
                if (currentField.charAt(index+1)==‘:‘) {
                    // base64编码的属性值
                    attrSet.getAttribute(attrName).addBase64Value(currentField. substring(index+2));
                } else if (currentField.charAt(index+1)==‘<‘){
                    // 文件URL属性值
                    attrSet.getAttribute(attrName).addBase64Value(currentField. substring(index+2));
                } else {
                    // 字符串值
                    String vals=currentField.substring(index+1).trim();
                    attrSet.getAttribute(attrName).addValue(vals);
//                  attrSet.getAttribute(attrName).addValue(currentField.
//                                                           substring(index+1));
                }
            } else if(currentField.length() == index+1){
                String vals=new String("");
                attrSet.getAttribute(attrName).addValue(vals);
            }

        }
        // 构造currentEntry
        this.currentEntry = new LDAPEntry(this.entryDN, attrSet);
        return;
    }


    /**
     * 构建包含moddn信息的String数组对象。
     */
    private void toModInfo() throws LDAPLocalException {

        int index = 6;      // length of "newrdn"
        int fieldIndex = 2; // reference newrdn field
        this.modInfo = new String[3];
        StringBuffer currentField = (StringBuffer)this.rFields.get(fieldIndex);



        if( ! currentField.substring(0, index+1).equalsIgnoreCase("newrdn:")) {
             throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
                 + " malformed newrdn field in record starting on line "
                 + this.dnlNumber + " of the file.", LDAPException.LOCAL_ERROR);
        }

        // get newrdn
        if ( currentField.charAt(index+1) != ‘:‘) {
            // common string value
            this.modInfo[0] = currentField.substring(index+1);
        }
        else {
            // decode newrdn
            this.bytes = Base64.decode( currentField, index+2,
                                                        currentField.length());
            try {
                this.modInfo[0] = new String(this.bytes, "UTF-8");
            } catch( UnsupportedEncodingException ue) {
                throw new RuntimeException(
                    "UTF-8 String encoding not supported by JVM");
            }
        }

        fieldIndex++;   // reference deleteOleRDN field
        index = 13;     // length of "deleteoldrdn"
        currentField = (StringBuffer)this.rFields.get(fieldIndex);

        if( ! currentField.substring(0, index).equalsIgnoreCase(
                                                           "deleteoldrdn:") ) {
            throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
                + " malformed deleteoldrdn field in record starting on line "
                + this.dnlNumber + " of the file.", LDAPException.LOCAL_ERROR);
        }

        char c = currentField.charAt(index);
        if (c == ‘1‘) {
            this.modInfo[1] = new String("1");
        }
        else if (c == ‘0‘){
            this.modInfo[1] = new String("0");
        }
        else {
            throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
               + " value for deleteoldrdn field should ‘0‘ or ‘1‘, found ‘" + c
               + "‘ in the record starting on line " + this.dnlNumber
               + " of the file.", LDAPException.LOCAL_ERROR);
        }

        fieldIndex++;   // reference newsuperior field
        
        if (fieldIndex == this.fNumber) { // no newsuperior spefified
            this.modInfo[2] = new String("");
        }
        else { // there is a newsuperior
            currentField = (StringBuffer)this.rFields.get(fieldIndex);
            index = 12;   // length of "newsuperior:"
            if( ! currentField.substring(0, index).equalsIgnoreCase(
                                                             "newsuperior:")) {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                    + "LDIFReader: malformed newsuperior field in the record "
                    + "starting on line " + this.dnlNumber + " of the file.",
                    LDAPException.LOCAL_ERROR);
            }

            if ( currentField.charAt(index) != ‘:‘) {
                // commom string value
                this.modInfo[2] = currentField.substring(index);
            }
            else {
                // base64 encoded value
                this.bytes = Base64.decode( currentField, index+1,
                                                       currentField.length());
                this.modInfo[2] = new String(this.bytes);;
            }
        }
        return;
    }

    /**
     * 基于LDIF修改记录的内容构建LDAPModification数组。
     */
    private void toLDAPModifications()throws LDAPLocalException{

        int        i, index;
        int        fieldIndex = 2;    // 跳过 dn, control, and changetype 字段
        String     attrName, opName;
        LDAPAttribute attr = null;
        ArrayList modList = new ArrayList();

        if (!(this.rFields.get(this.fNumber-1)).toString().
                                                      equalsIgnoreCase("-") ) {
            throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                  + "LDIFReader: modify record not ends with ‘-‘ in the record"
                  + " starting on line " + this.dnlNumber + " of the file.",
                    LDAPException.LOCAL_ERROR);
        }

        // 填充LDAPModification数组对象
        for (i=fieldIndex; i<this.fNumber; i++) {
            // 找到":"分开mod操作和attr名称
            index = IndexOf((StringBuffer)this.rFields.get(i), ‘:‘);
            if (index == -1) { // ‘:‘ not found
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                   + "LDIFReader: malformed opName:attrName field in the record"
                   + " starting on line " + this.dnlNumber + " of the file.",
                    LDAPException.LOCAL_ERROR);
            }

            StringBuffer nextField = (StringBuffer)this.rFields.get(i);
            opName= nextField.substring(0, index);
            attrName= nextField.substring(index+1);

            i++; // 指向attrName:attrValue字段
            nextField = (StringBuffer)this.rFields.get(i);

            // 构建每个LDAPModification对象并将其添加到modList
            if (nextField.charAt(0)!=‘-‘) {
                // 至少有一个 属性名称:属性值 字段
                for ( ; nextField.charAt(0)!=‘-‘;
                        i++, nextField = (StringBuffer)this.rFields.get(i)) {
                    // 下标分离属性名称和属性值
                    if ((index=IndexOf(nextField, ‘:‘)) == -1) {
                        throw new LDAPLocalException("com.novell.ldap."
                            + "ldif_dsml.LDIFReader : no ‘:‘ found in attrName:"
                            + "attrValue field in the record starting on line "
                            + this.dnlNumber + " of the file.",
                            LDAPException.LOCAL_ERROR);
                    }
                    else {
                        // 比较opName:attrName和 attrName:attrValue字段
                        String aName = nextField.substring(0, index);
                        if (!aName.equalsIgnoreCase(attrName)) {
                            throw new LDAPLocalException("com.novell.ldap."
                            + "ldif_dsml.LDIFReader : found attribute name ‘"
                            + aName + "‘, should be ‘" + attrName
                            + "‘ in attrName:attrValue field in the record "
                            + "starting on line " + this.dnlNumber
                            + " of the file.", LDAPException.LOCAL_ERROR);
                        }

                        // create attr and add value to it
                        attr = new LDAPAttribute(attrName);
                        if (nextField.charAt(index+1)==‘:‘) {
                            // base64 encoded attribute value
                            attr.addBase64Value(nextField.substring(index+2));
                        }
                        else if (nextField.charAt(index+1)==‘<‘){
                            // file URL attribute value
                            attr.addBase64Value(nextField.substring(index+2));
                        }
                        else {
                            // string value
                            attr.addValue(nextField.substring(index+1));
                        }


                        if ( opName.equalsIgnoreCase("add") ) {
                            modList.add( new LDAPModification(
                                                  LDAPModification.ADD, attr));
                        }
                        else if ( opName.equalsIgnoreCase("delete") ) {
                            modList.add( new LDAPModification(
                                               LDAPModification.DELETE, attr));
                        }
                        else if ( opName.equalsIgnoreCase("replace") ) {
                            modList.add( new LDAPModification(
                                              LDAPModification.REPLACE, attr));
                        }
                        else {
                            throw new LDAPLocalException("com.novell.ldap."
                                + "ldif_dsml.LDIFReader : Not supported modify "
                                + " request (" + opName + ") specified in "
                                + "record starting on line " + this.dnlNumber
                                + " of the file.", LDAPException.LOCAL_ERROR);
                        }
                    }
                }
            } else {
                // there is no attribute value specified; this could be
                // true for ‘delete‘ and ‘replace‘ modify operation
                attr = new LDAPAttribute(attrName);

                if ( opName.equalsIgnoreCase("delete") ) {
                    modList.add( new LDAPModification(
                                               LDAPModification.DELETE, attr));
                }
                else if ( opName.equalsIgnoreCase("replace") ) {
                    modList.add( new LDAPModification(
                                              LDAPModification.REPLACE, attr));
                }
                else {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: For ‘" + opName + "‘, no value "
                        + "specified for atribute ‘" + attrName
                        + "‘ in the record starting on line "
                        + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
                }
            }
        }
        this.mods = new LDAPModification[modList.size()];
        this.mods = (LDAPModification[])modList.toArray(this.mods);
        return;
    }

    /**
     * 返回指定字符首次出现的StringBuffer对象内的索引。
     *
     * @param bl  The StringBuffer object
     * @param ch   The character to look for in the StringBuffer object
     *
     * @return The index of the first occurence of the character in the
     * StringBuffer object, or -1 if the character does not occur.
     */
    private int IndexOf(StringBuffer bl, int ch)
    {

        if (bl != null ) {
            for (int i=0;i<bl.length(); i++) {
                if(bl.charAt(i) == ch) {
                    return i;
                }
            }
        }
        return -1;
    }


    /**
     * <tt>去空字段<tt> 修剪一个字段中的多余空格。
     */
    private StringBuffer trimField( StringBuffer line)
                throws LDAPLocalException
    {
        int c, lastChar = 0, charIndex = 0;
        char t;
        char[] newChars;
        boolean isEncoded=false, isURL=false, criticality = false;
        String oid = null;

        if ((line == null)||((c=IndexOf(line,‘:‘))==-1)) {
            // not all fields contain ‘:‘
            return line;
        }

        // elminate any trailing spaces
        lastChar = line.length() - 1;
        while( line.charAt(lastChar) == ‘ ‘) {
            lastChar--;
        }

        // create newChars
        newChars = new char[lastChar+1];

        if( (c > 6) && (line.substring(0,c).equals("control"))) {
            // this is a control field
            this.control = true;
            c++;            // skip past ‘:‘
            // eliminate any spaces after ‘:‘
            while( (c <= lastChar) && (line.charAt(c) == ‘ ‘)) {
                c++;
            }
        }
        else {
            // not a control field. it‘s ‘dn‘,
            //‘changetype‘, or ‘attrName‘ field
            this.control = false;

            // copy field name and ‘:‘, eg. ‘dn:‘, ‘changetype:‘, or ‘attrName:‘
            line.getChars(0, c+1, newChars, 0);
            // skip over copied chars
            charIndex += c + 1;
            // c points to char right after first ‘:‘
            c++;
        }

        if(!this.control) {
            // // not a control field. check if ‘::‘ or ‘:<‘
            if( c <= lastChar) {
                t = line.charAt(c);
                if( t == ‘:‘) {
                    newChars[charIndex++] = ‘:‘; // save the ‘:‘ to
                    c++;                         // point to value
                }
                else if( t == ‘<‘) {
                    newChars[charIndex++] = ‘<‘; // save the ‘<‘ to
                    c++;                         // point to value
                }
            }

            // for case like attr: <value>
            boolean nonfile=false;
            String fredir= line.substring(c);            
            if(fredir.length()>0 && fredir.charAt(0) != ‘<‘){
                     String cstr=fredir.trim();
                     if(cstr.length()>0 && cstr.charAt(0) == ‘<‘){
                          nonfile=true;
                     }
                }
                
            // eliminate any space(s) after ‘:‘ or ‘<‘
            while( (c <= lastChar) && (line.charAt(c) == ‘ ‘)) {
                c++;
            }
            
            // for case like attr: <value>            
            if(nonfile==true){
                c--;
            }
            

            if( c <= lastChar) {  // thers is a value specified
                // copy field value
                line.getChars(c, lastChar+1, newChars, charIndex);

                charIndex += lastChar - c + 1;
                // create a new StringBuffer object with capacity of lastChar
                StringBuffer newBuf = new StringBuffer(lastChar);
                // copy the filed represented by newChars
                newBuf.append( newChars, 0, charIndex);
                // return the trimed field
                return newBuf;
            }
            else if ( line.length() == c){
                StringBuffer newBuf= new StringBuffer();
                line.getChars(c, lastChar+1, newChars, charIndex);
                charIndex += lastChar - c + 1;
                newBuf.append( newChars, 0, charIndex);    
                return newBuf;
            }
            
            else {  // there is no value specified
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: a field contains no value after ‘:‘. the "
                        + "field is in the record starting on line "
                        + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
            }
        }
        else {  // a control field
            // process values for control. a control field may looks like
            //    1. control: 1.2.3.4 true: control value
            //    2. control: 1.2.3.4: control value
            //    3. control: 1.2.3.4
            // extra spaces are possible between oid, criticality, and value.
            // oid is a must, while criticalitty and value can be absent.

            // get control oid
            int b = c;
            while(c <= lastChar) {
                // an oid consists of dots and digits
                t = line.charAt(c);
                if( (t == ‘.‘) || (Character.isDigit(t))) {
                    c++;
                    continue;
                }
                break;
            }

            if( b == c) {  // control with no oid
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                    + "LDIFReader: Control with no oid in the record "
                        + "starting on line " + this.dnlNumber
                        + " of the file.", LDAPException.LOCAL_ERROR);
            }
            else {  // control has iod, get local copy of oid
                char[] chars = new char[c-b];
                line.getChars(b, c, chars, 0);
                oid = new String(chars);
            }

            if ( c > lastChar) {
                // control only has an oid. create LDAPControl object
                // with oid, ‘false‘ and empty byte array
                LDAPControl ctrl = new LDAPControl(oid, false, new byte[0]);
                // add it to cList
                this.cList.add(ctrl);
                return null;  // return value has no use
            }

            // get control criticality
            t = line.charAt(c);
            if( t == ‘ ‘) {
                // see a space, skip over any spaces
                while( (c <= lastChar) && (line.charAt(c) == ‘ ‘)) {
                    c++;
                }
            }
            // what we see now? ‘true‘, ‘false‘, or ‘:‘ ?
            if(((c + 3) <= lastChar)&&(line.substring(c,c+4).equals("true"))) {
                // found ‘true‘
                c += 4;
                criticality = true;
            }
            else if(((c+4)<=lastChar)&&(line.substring(c,c+5).equals("false"))){
                // found ‘false‘
                c += 5;
                criticality = false;
            }

            if (c > lastChar) {  // to the end of the control field
                // create LDAPControl object with oid,
                // criticality, and empty byte array
                LDAPControl ctrl=new LDAPControl(oid, criticality, new byte[0]);
                // add it to cList
                this.cList.add(ctrl);
                return null;
            }

            if ((t=line.charAt(c)) != ‘:‘) {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: Unexcepted char ‘" + t + "‘. Expecting "
                        + "to see ‘:‘ in the record starting on line "
                        + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
            }

            // get control value
            c++;  // go to enst char after ‘:‘
            if (c > lastChar) {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                    + "LDIFReader: No control value after ‘:‘ "
                    + "in the record starting on line "
                    + this.dnlNumber + " of the file.",
                    LDAPException.LOCAL_ERROR);
            }

            // positioned at the first char right after ‘:‘
            // check if ‘::‘ or ‘:<‘
            t = line.charAt(c);
            if( t == ‘:‘) {
                isEncoded = true;            // indicate encoded value
                c++;                         // point to value
                if (c > lastChar) {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: No control value after ‘::‘ "
                        + "in the record starting on line "
                        + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
                }
            }
            else if( t == ‘<‘) {
                isURL = true;                // indicate file URL value
                c++;                         // point to value
                if (c > lastChar) {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: No control value after ‘:<‘ "
                        + "in the record starting on line "
                        + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
                }
            }

            // eliminate any space(s) after ‘:‘, ‘::‘ or ‘:<‘
            while((c <= lastChar) && (line.charAt(c) == ‘ ‘)) {
                c++;
            }

            if(c <= lastChar) {  // thers is a value spec specified
                char[] chars = new char[lastChar+1-c];
                line.getChars(c, lastChar+1, chars, 0);

                if (isEncoded) {
                    this.bytes = Base64.decode(chars);
                }
                else if (isURL) {
                    // if isURL, what to do?
                    this.bytes = (new String(chars)).getBytes();
                }
                else {
                    this.bytes = (new String(chars)).getBytes();
                }
            }
            // create LDAPControl object
            LDAPControl ctrl = new LDAPControl(oid, criticality, this.bytes);
            // add it to cList
            this.cList.add(ctrl);
        }
        return null;
    }
}

LdifImport.java 完整代码

package com.cn.ccc.ggg.ldap.core.common;

import java.util.Enumeration;

import java.util.Iterator;

import javax.naming.directory.DirContext;

import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.directory.server.protocol.shared.store.LdifFileLoader;

import com.novell.ldap.LDAPAddRequest;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPDeleteRequest;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPMessage;
import com.novell.ldap.LDAPMessageQueue;
import com.novell.ldap.LDAPModifyDNRequest;
import com.novell.ldap.LDAPModifyRequest;
import com.novell.ldap.LDAPResponse;
import com.novell.ldap.LDAPSearchResult;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;


public class LdifImport {
    
    protected final Log logger = LogFactory.getLog(getClass());
   /**
     * @param args
     * @date 2017?年?10?月?12?日17:33:03
     */
    public boolean importLdif(String [] args){
        if (args.length != 4) {
            usage();
            return false;
        }
        int  version = 1;
        int ldapPort = LDAPConnection.DEFAULT_PORT;
        int ldapVersion  = LDAPConnection.LDAP_V3;
        String fileName = args[0];
        String ldapHost = args[1];
        String loginDN  = args[2];
        String password = args[3];
        LDIFReader reader = null;
        LDAPEntry entry;
        LDAPMessage msg, retMsg;
        LdifImport readerTest = new LdifImport();
        LDAPConnection lc = new LDAPConnection();
        File file = new File(fileName);  
        if(!file.exists()){  
            logger.error("要读取的文件不存在");  
            return false;
        }  
        try {
            FileInputStream fis = new FileInputStream(new File(fileName));
            reader = new LDIFReader(fis, version);
        } catch (Exception e) {
            logger.error("读取 " + fileName +"文件失败");
            return false;
        }
        try {
            // 连接LDAP服务
            lc.connect( ldapHost, ldapPort );
            // 绑定LDAP服务
            lc.bind( ldapVersion, loginDN, password.getBytes("UTF8") );
            
            if (!reader.isRequest()) {

                System.out.println("\nLDIF content file\n");



                while ( (msg = reader.readMessage()) != null) {

                    entry = ((LDAPSearchResult)msg).getEntry();

                    System.out.println("\nEntry DN:" + entry.getDN());

                    readerTest.showAttributes(entry);

                }

            }

            else {

                System.out.println("\nLDIF change file\n");



                while ( (msg = reader.readMessage()) != null) {

                    if (msg instanceof LDAPAddRequest) {

                       System.out.println("Adding entry...");

                    }

                    else if (msg instanceof LDAPDeleteRequest) {

                        System.out.println("Deleting entry...");

                    }

                    else if (msg instanceof LDAPModifyDNRequest) {

                        System.out.println("Modifying entry‘s RDN...");

                    }

                    else if (msg instanceof LDAPModifyRequest) {

                        System.out.println("Modifying entry‘s attribute(s)...");

                    }



                    LDAPMessageQueue queue = lc.sendRequest(msg, null, null);

                    if ((retMsg = queue.getResponse()) != null) {

                        LDAPResponse response = (LDAPResponse)retMsg;

                        int status = response.getResultCode();



                       // the return code is LDAP success


                        if ( status == LDAPException.SUCCESS ) {

                            System.out.println("Directory information has been"

                                                               + " modified.");

                        }

                       // the reutrn code is referral exception


                        else if ( status == LDAPException.REFERRAL ) {

                            String urls[]=((LDAPResponse)retMsg).getReferrals();

                            System.out.println("Referrals:");

                            for ( int i = 0; i < urls.length; i++ )

                                System.out.println("    " + urls[i]);

                        }

                       // general error


                        else {

                            System.out.println( response.getErrorMessage());

                        }

                    }

                    System.out.println();

                }

            }

            
        } catch( UnsupportedEncodingException e ) {
            logger.error( "错误信息为:UnsupportedEncodingException");
        } catch ( IOException ioe ) {
            logger.error("错误信息为:IOException");
        } catch ( LDAPException le ) {
            logger.error("错误信息为:LDAPException"+le.getMessage());
        }
        return false;
    }
    
    public  void usage() {

        logger.error("用法:   <文件名称>     <IP> <登录名> <密码>");
        logger.error("例如: demo.ldif  192.168.0.254 \"cn=Manager,c=中华人民共和国\" 123456" );

    }
    
    public void showAttributes(LDAPEntry entry) {



        String value;

        LDAPAttributeSet as = null;

        LDAPAttribute[]  attrs = null;

        LDAPAttribute attr = null;

        Iterator allAttrs;

        Enumeration allAttrValues;



        as = entry.getAttributeSet();

        allAttrs = as.iterator();

        System.out.println("    Attributes:");

        while(allAttrs.hasNext()) {

            attr = (LDAPAttribute)allAttrs.next();

            System.out.println("        " + attr.getName());

            allAttrValues = attr.getStringValues();

            if( allAttrValues != null) {

                while(allAttrValues.hasMoreElements()) {

                    value = (String) allAttrValues.nextElement();

                    System.out.println("            " + value);

                }

            }

        }

    }
    
    public static void main(String[] args) {
        LdifImport ldifImport = new LdifImport();
        String[] arg = {"C:/Users/Administrator/Desktop/Ldif Datacenter/dq.ldif","192.168.0.254","cn=Manager,c=cn","123456"};
        //测试导入ldif文件
        ldifImport.importLdif(arg);
        
    }
}

dq.ldif文件内容为:

dn:: bz3mtbfljZfnnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9Y24=
objectClass: organization
o:: 5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6F

dn:: b3U955S15a2Q5pS/5Yqh5Yqe5YWs5a6kLG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs
 5Y6FLCBjPWNu
ou:: 55S15a2Q5pS/5Yqh5Yqe5YWs5a6k
objectClass: organizationalUnit

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf57uT54K56K6k6K+B57O757ufLG91PeeU
 teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
 bg==
EncryptnotAfter: 20200614115959DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgdgxHjAcBgNVBAY
 MFeS4reWNjuS6uuawkeWFseWSjOWbvTESMBAGA1UECAwJ5rW35Y2X55yBMScwJQYDVQQKDB7mtbf
 ljZfnnIHkurrmsJHmlL/lupzlip7lhazljoUxHjAcBgNVBAsMFeeUteWtkOaUv+WKoeWKnuWFrOW
 upDE2MDQGA1UEAwwt55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf57uT54K56K6k6K+B57O757u
 fMSEwHwYJKoZIhvcNAQkBDBJsaXhpb25nQGJndC5obi5nb3YwdjAQBgcqhkjOPQIBBgUrgQQAIgN
 iAARuWaJE4jO7gBZypBzQUYBjqtqGn/JGG7om2H8T7uz9SZcaIfL+h5Lu75pyN5Yqh57O757uf6L
 qr5Lu96K6k6K+B57O757ufMSIwIAYJKoZIhvcNAQkBDBNsaXV4aW9uZ0BiZ3QuaG4uZ292MHYwEA
 YHKoZIzj0CAQYFK4EEACIDYgAEU5G7LIzuFQ+8oEws7Nrd8ArCwdNxPbGoiAxjgiE6J8L8+6Y5Ny
 CxbxQQcHKnWmkqtT8QEm6HRpHyOFTh4O+fWIWuQNWuHeDhuLX9t4fkbqX9cB61RMIOkuSYdyNM1c
 9aow8wDTALBgNVHQ8EBAMCA/gwCwYJKoEcgUUBh2gLA2EANefwg7k63w7RlirMG5TPq2hs5yG2hJ
 1k4r0v2P/59BpPUwzIEUAxsp8HtSNus/qY4q5jrR0ZvhrNdwFN8pEZyfrW+hPOQ2rnznceid3upU
 oxOWlyJQx++iTGuJiwKccm
objectClass: wstCertificateUser
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf57uT54K56K6k6K+B57O757uf

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWz
 MSxvdT3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3mtbfljZfnnIHkurrmsJHmlL/lupzlip7lhazl
 joUsIGM9Y24=
EncryptCertificate;binary:: MIICrjCCAjqgAwIBAgIDAO/3MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgdAxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TESMBAGA1UECAwJ5rW35Y2X55yBMRIwEAYDVQQHDAnmtbflj6PluIIxJzAlBgNVBAoMHua1t+WNl
 +ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhTEeMBwGA1UECwwV55S15a2Q5pS/5Yqh5Yqe5YWs5a6kM
 T0wOwYDVQQDDDTnnIHmlL/lupzkv6Hku7vmnI3liqHns7vnu5/otYTmupDorr/pl67mjqfliLbnv
 ZHlhbMxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJdbjSFVH/qJ7mn9OvRfFJcv5meB13NOZft5ck
 ZzLEFdzCc8ABw8V1v0x+l6tRGrsbhEvlwWDZqLg8G/O8Vs4TKqbNceWb3JjY6xBMeUbx2BDDKMuN
 3r43/YbscmFJvXLow8wDTALBgNVHQ8EBAMCA/gwCwYJKoEcgUUBh2gLA2EAbdWEWguIXMhU1bIiJ
 pPttbL7fjCDIsa32Pu8eKKsEnICQHwowrVkjzq1r/3ml5KTK+3ggglwFMNveMrTGByG9VrjiQ1ot
 +5mrespR2FLADGdVdKxJ3clmeq27g7pgSRj
EncryptnotAfter: 20200614115959
objectClass: wstCertificateUser
EncryptserialNumber: EFF7
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWzMQ==

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWz
 MixvdT3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3mtbfljZfnnIHkurrmsJHmlL/lupzlip7lhazl
 joUsIGM9Y24=
EncryptCertificate;binary:: MIICrjCCAjqgAwIBAgIDAO/4MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgdAxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TESMBAGA1UECAwJ5rW35Y2X55yBMRIwEAYDVQQHDAnmtbflj6PluIIxJzAlBgNVBAoMHua1t+WNl
 +ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhTEeMBwGA1UECwwV55S15a2Q5pS/5Yqh5Yqe5YWs5a6kM
 T0wOwYDVQQDDDTnnIHmlL/lupzkv6Hku7vmnI3liqHns7vnu5/otYTmupDorr/pl67mjqfliLbnv
 ZHlhbMyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFDAcXvDayxxmC8Z1zxeKulVd+jLgw+Ai1UQ2y
 kHBX8K+qTYQehzIRQiMrfx7BN0MnhtWS3A3x7MGmYcV1f9KAfwabk99eLGMhVPqaMpvvDs8r7PIo
 hZGD6fy4YTz/YXqow8wDTALBgNVHQ8EBAMCA/gwCwYJKoEcgUUBh2gLA2EAqGtm6vCYADU+sGn73
 vvAKt53vPRkQvrummU01afdawwJMBR+GQmNdkuMo+cYI2Jl+5z3K2wgcfKoFzBsxR7+ldFAlfw4v
 xHRFOwHzgxo6TvkiL6kSHi6WGN0kFuvJ2rS
EncryptnotAfter: 20200614115959
objectClass: wstCertificateUser
EncryptserialNumber: EFF8
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWzMg==

dn:: b3U95bqU5oCl5YqeLG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBjPWNu
ou:: 5bqU5oCl5Yqe
objectClass: organizationalUnit

dn:: Y249546L5oyv5a6HLG91PeW6lOaApeWKnixvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
 rOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO/5MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmg
 KXlip4xEjAQBgNVBAMMCeeOi+aMr+WuhzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNzB6M
 BQGByqGSM49AgEGCSqBHIFFAYdoCANiAAScYxXBQbH0z1lJp7SF2oeAlQKidASCBgPbazQlm7uX5
 eDvOpzTcx6pW0na611Ifp6jHVCANE/YP6ljZcyOaVcHxlkqBNlpXysK/kYGJoEcXeJlAoykt55wn
 b6WT6NM5kqjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQDbnnzwyc+YygA4sYPI4ruXy
 zi1GL7ArhCxcLGJlCzZB4qOk1tl4MeI2hkDa7HWohVFseGZM6eDawnlhoYgziCXWO3umwIlQWk/I
 aikJsiEx+cPqRd6YfrR0VKQGELocU0=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAKMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmgKXl
 ip4xEjAQBgNVBAMMCeeOi+aMr+WuhzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNzB6MBQG
 ByqGSM49AgEGCSqBHIFFAYdoCANiAAR79CLIZHbBRuvwO8gjSnFwkfRzMg3E21uALi39anq1cyrS
 F9N7o42uEODEjKbGzQSZ6gfKfjAssBT38FOV3k8RJtUUtP0crfaGhIvrE6k87AxyX78cRa2KQOc2
 DCOQDtKjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBVfwdkcKS4J86ntBmCbU2SGGvS
 FwtrIENOvtHaDdQxGW/vNN7LXd5yqyG+O7NUlPGsOvrMOYnXIDwkzkRulssMhmtTEC1D8bIQHOv+
 vZGhZxcNQxtS059fgW8JvjwHbJI=
objectClass: wstCertificateUser
serialNumber: F00A
EncryptserialNumber: EFF9
cn:: 546L5oyv5a6H

dn:: b3U956eY5Lmm5aSELG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBjPWNu
changetype:add
ou:: 56eY5Lmm5aSE
objectClass: organizationalUnit

dn:: Y2495q+b5pet5ZCbLG91PeenmOS5puWkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
 rOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO/6MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jku
 ablpIQxEjAQBgNVBAMMCeavm+aXreWQmzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNDB6M
 BQGByqGSM49AgEGCSqBHIFFAYdoCANiAARGHqzYbixoBc2j5YlZ4kli2AcOrclQeOibMlkV0KUZQ
 umacnp8NHDY6LGkmauR8Ux7g7nfskn/PyF1NImXq/4AtkFFN9i+xtgc/rLC+APiVlFP+6+PfCgtF
 /dxboIxfrGjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQC2Xmq72mcTduYImECzlxHvK
 fmibBKuC/UQgcSffId5egTUwerP07aPUnhY1WPtH0ZaZaIZaNJYiSg/Nde4G47KcbIhNYGlLy51l
 rvqGcv3y2Wkq6DJCgJzAxBFAWjyE8A=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAGMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jkuabl
 pIQxEjAQBgNVBAMMCeavm+aXreWQmzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNDB6MBQG
 ByqGSM49AgEGCSqBHIFFAYdoCANiAAQupbkVlEm0gDMONZwm2TEmjW2yTIGt4E29fIcdCeibIRER
 KuzdK74ooP/Y9DiyB36GZn99fXQx2edQE1QwTy8k+kpvTxhju5owkeLTgr5AxgSRATmZHeQzqpoN
 ZaFXIW6jDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQCFgDwc/BUo37U3FW2s/kOmzozC
 cYyoAazxJlALmwRY+UhgzcBEawASSlCwTonWFpkWO2eTTtUhWPM56n/WXNS0b4wyTA7xGnYyCJHN
 lLoUzKgjHGTortRlfFu4uXdV7TQ=
objectClass: wstCertificateUser
serialNumber: F006
EncryptserialNumber: EFFA
cn:: 5q+b5pet5ZCb

dn:: Y2495YiY6Imz5pilLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuaw
 keaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICfTCCAgmgAwIBAgIDAO/7MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxEjAQBgNVBAMMCeWImOiJs+aYpTEcMBoGCgmSJomT8ixkAQEMDDIyM
 TIxMDAxMDAwMzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATV4f5bcNKedbU8foAgfiPbCTSY2
 keftHKgSoISfWUgt+nIth5onA//lbasZYpqkB7LVBCYRvB6aSWp2Evq7KBV+S8+0Le+QEty6kCkG
 kRZtQfGZipQnWOXSR0RsIohPvujDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCXJmMnm
 /l4RjcFG8kEc2dxHsYgRJKz5Gc7Wxq8ebzwQGdiMgNShAKufMCWmgEksBExvGpM6rGrqPtH9JMMU
 1BgS0/GwAW7SAGQQyKLUQ1q9TzgvFMprNZR3zejQB1287Y=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPAEMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
 lL/liqHlip7lhazlrqQxEjAQBgNVBAMMCeWImOiJs+aYpTEcMBoGCgmSJomT8ixkAQEMDDIyMTIx
 MDAxMDAwMzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASooCVyDiFZbP0mcfqWl0iMZuF3k4Tq
 TkOjxhjFvmVQ5C6tHER8gk/VTH5K4gio41Xc21vrWG3ZpuAptInDol4l6gax4YpQHVmRiJzwAk9c
 GXZcS2cengJgY8pMPwNs6eejDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQD33R1htZsQ
 q9A1lruxb6AlSmPiZGTmVc2ahAgCODqQk8tdLtWszLdXulB0DTFPeDMIxo7l6jzwlEm5WvunvIR7
 tmJq7XRGbPfMrhYOEJVsdffhMbHZn61aF0vqdWp6rGY=
objectClass: wstCertificateUser
serialNumber: F004
EncryptserialNumber: EFFB
cn:: 5YiY6Imz5pil

dn:: b3U9552j5p+l5a6kLG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBjPWNu
changetype:add
ou:: 552j5p+l5a6k
objectClass: organizationalUnit

dn:: Y2495byg5LuB57+ULG91Peedo+afpeWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
 rOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO/8MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn
 6XlrqQxEjAQBgNVBAMMCeW8oOS7gee/lDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAxMDB6M
 BQGByqGSM49AgEGCSqBHIFFAYdoCANiAAR7D5EkIgvppfnj1yB6xh/8aji9qo9OKPz8WYeGiUBeF
 Be+6FHbLYw3s91+dF+yVglPplaxQ+lBIo15lBRgZom7WgqPIngPrOu1plqIAzi7jqW/PJ52IlXUQ
 aEQiw32CfCjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCNXYLkG/Oqd0Jj49HxdXM3Z
 1ERmJenTrVnHfzlA0pZCV/EOscfIJXyqhkCTKpveQJGCg9ruVLZnbSq+vvHKoExETYilZrXbhz9d
 04ludMSny2s/qpnULLdGDmYRx7HaTU=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAPMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn6Xl
 rqQxEjAQBgNVBAMMCeW8oOS7gee/lDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAxMDB6MBQG
 ByqGSM49AgEGCSqBHIFFAYdoCANiAASzeF0+mnputFpfuXEpUV8aMGd35FIWuYlJNAXRsEVTg3Fv
 38nvrFlz75rkvpfxxLTLRbL1BAmUlW5vWvKIl0QBft7kwKCjpEM/lvXx/fPwOvEb8Bcgwi/t/d8H
 rI5rBxGjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBnJP0+gFGtZAQoMo9aEsnWBtrh
 o3Ul8YYLy6G0wFCvtKv6UVIgslrVRjXGI1PsEQ8l0pY0xKj+QFd/S2wkvfr3Z5iYX3bZ2yf5DH4+
 bL4N+lro1+8prXm1VamwWWkgsOI=
objectClass: wstCertificateUser
serialNumber: F00F
EncryptserialNumber: EFFC
cn:: 5byg5LuB57+U

dn:: Y2496ams5rW35LicLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuaw
 keaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICfTCCAgmgAwIBAgIDAO/9MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemprOa1t+S4nDEcMBoGCgmSJomT8ixkAQEMDDIyM
 TIxMDAxMDAwMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAREQEWC8lO5LVxQi3rojEpCVgp1I
 F3IWrU37oQVZcjReBg2KQMtIi/ZIUzzKCVNNztQ5V5bqnQ9VcnhU3iiTUeNRRMr0tSEvcL0OBRmJ
 T5hqD9YHVx7+2NmQ6vEf7FX66yjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQC+Vb7M6
 Wlp4R2ueehitZUsWjhK5F7oiopV5SmiIDUofR1vMfsr/5qzVMXYV9+g349ndh77mM5sj2IjfkEmz
 uP9g+Q9zCvsH6T+zKoh74eRqbh7wIfIu8QyJloiddB/t/8=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPAMMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
 lL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemprOa1t+S4nDEcMBoGCgmSJomT8ixkAQEMDDIyMTIx
 MDAxMDAwMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAQm66YsAYr2PS3BYGvb5AuLXdMeoP33
 BET9UME9pYdKYvLHK1EKdtnEGT3V0B/NLhTtoqZjmYELh82rMM081DU/tPOLbvN8PJzQ7vMC8KCQ
 j+xXHd7rCAAlGFr9In+BsHCjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQB6vLVLTGRS
 9P/dtDnnxDSV9pfWCPVOYRIoQH3XPBezQ+Q56RIdjhCuHOF+dem5/kyAH6UpHZmzw4+9qp9lwr/V
 rnF3bFYN9NXHb6yPBH2YtS8fH+cmjZda6RBENdEzSLQ=
objectClass: wstCertificateUser
serialNumber: F00C
EncryptserialNumber: EFFD
cn:: 6ams5rW35Lic

dn:: Y2495L+e5am3LG91PeenmOS5puWkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWO
 hSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICbjCCAfqgAwIBAgIDAO/+MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgYwxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jku
 ablpIQxDzANBgNVBAMMBuS/nuWptzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwOTB6MBQGB
 yqGSM49AgEGCSqBHIFFAYdoCANiAARXOVTTUAN/QFsjNaXxCg84+vYMcIlWD+Y1f97BJk7NB2QGW
 7OGmS62Dxdn/9mEUJ5iAq8HepSKry4H1vgzeav0mCOlZE/d4mu2+I3VQ6nqC5CZtoXSBcF+9o1Tp
 RbgKX6jDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQDEr8d8RcgdWfENywURju23XUEbd
 TrDMkOylNCTZExhGlwEFuoVBBAKn1bT0SqUWFOZg8uvoUofntW5HCIKl96JPbnKjOiqsOZdJnNbZ
 Vk3A1jxHZEd9Vk07nELKWGaF0w=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICbjCCAfqgAwIBAgIDAPAIMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgYwxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jkuabl
 pIQxDzANBgNVBAMMBuS/nuWptzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwOTB6MBQGByqG
 SM49AgEGCSqBHIFFAYdoCANiAAR7gb4bsSR3HSwoLLMP+ee6pjWp9w6xdOtjtvZxBg0O+kGlP0vu
 GiCCjWAEHxshsCgBCD07BkhJEvsUhOiP+UH7d9Y+cDDYDocb5DomdRoIcKDB2cirZhbXtYIa2XGH
 4LKjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQCMeAl6+zGFXFlan2KROaY/RLVEjXHA
 H8mt1hZDWlsSniX0DuLlemv6WxCX9LIAJjeb8siu4kz9u8CkkbPv8d37O+UgegpdYEc0xXTztPZe
 bl5YaqKRnCAhKtQEGmhlE5g=
objectClass: wstCertificateUser
serialNumber: F008
EncryptserialNumber: EFFE
cn:: 5L+e5am3

dn:: Y2495byg5oGS54aZLG91PeW6lOaApeWKnixvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
 rOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO//MAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmg
 KXlip4xEjAQBgNVBAMMCeW8oOaBkueGmTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNTB6M
 BQGByqGSM49AgEGCSqBHIFFAYdoCANiAASk0YZd+hozUD67UfqGdyDp2ypbquGCgqPkCnkCa8Lpv
 +qWRIYRyRfLLAubw2iBFDEtaOKX37haCIicMDH+cJwNgWU0x8xri5vMHveSJHSlwVFsCAjiYxpIg
 7dt58xHtySjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCEjzbTkWR6vZUjfe732XGyE
 yDfnjBpejsx8kHn/kgqnwAguCxxEPiNROByOEzTeC0OL6Jw9fhPDDj/ubw6z68agRVogjToeQepR
 CNIyfS61l4LMcJLZUBuP2WgaJgHt7E=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPALMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmgKXl
 ip4xEjAQBgNVBAMMCeW8oOaBkueGmTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNTB6MBQG
 ByqGSM49AgEGCSqBHIFFAYdoCANiAAQsI+c/is/BdtC9qylJc6TnroZWhwV/FYmYHCj29UoSbSrJ
 KErgaMojLEjReERjax7kq+b3OYTQwbB0QDxfFkTgHH6qRvb743UUiO3jlBqBfigcZT10oyyORs0U
 zEL70AmjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQB9JRENKJVVtXknenoFtA8TTq2h
 BU9nKEc1TcBqMzFlv92tilGbCfr8vO5wO8fIcFExvidZORJFqjrZebBGQZHRlsEBMBzKpj3pp8gI
 /uUQBEJ2c1LJuGMotAKHX7ecbz4=
objectClass: wstCertificateUser
serialNumber: F00B
EncryptserialNumber: EFFF
cn:: 5byg5oGS54aZ

dn:: b3U95paw6Ze75L+h5oGv5aSELG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBj
 PWNu
ou:: 5paw6Ze75L+h5oGv5aSE
objectClass: organizationalUnit

dn:: Y2496YKT56eL6IuxLG91PeaWsOmXu+S/oeaBr+WkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6
 nOWKnuWFrOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPAAMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl
 7vkv6Hmga/lpIQxEjAQBgNVBAMMCemCk+eni+iLsTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxM
 DAwMTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASJ3RcGfo8cVUDTfawSKXngNpSoJH36bVjDb
 EU+QvW4L4pp3SQr+IKXOlGvR1R8IMXhhl3Kidbijkk4xphBGHJlgWVrCB2YsyrKFYTCjjcRXlzsp
 HM3kqtDpg0Ce2OSwfSjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQC94CmAJ301xBDQw
 ObclFDJ4dQI3oVxxSNrB7DtI7s2ElthNDEV1MAekOilrcEgbamawm4H2cVw3eKk+q+6kolKoo3Kh
 qVcFtF1uD8nUanvvfO8wrBhwgzQEy3bBQsfKKg=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPAOMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl7vk
 v6Hmga/lpIQxEjAQBgNVBAMMCemCk+eni+iLsTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAw
 MTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAT/c/uLk1Qk7AqTCNmpl3mbR6bZG/f73gq6oZLU
 rize0LClvwNBvEQ8fQNiqklwfZ5noXpG6p4a3vdYb/pNVtMqS+p2rWhaU/4hTHBpMurv9ha0zMPs
 7oftu2T3sawXtH2jDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBVTFutTDZ6cPeKjXAs
 z7DNQKJgv3trvAHLnHHag9mVG+HG9ypIniuMqGRqkk0jKPDjpa62fWUfFKI09zkvYAsP2Oq4G4Sc
 OiOQrKr0w4YT4Dw7EFtHh53Y21B0/3CDbHM=
objectClass: wstCertificateUser
serialNumber: F00E
EncryptserialNumber: F000
cn:: 6YKT56eL6Iux

dn:: Y2495byg5YWI5piMLG91PeaWsOmXu+S/oeaBr+WkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6
 nOWKnuWFrOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPABMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl
 7vkv6Hmga/lpIQxEjAQBgNVBAMMCeW8oOWFiOaYjDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxM
 DAxMTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAQsUEpbw4WCp1Z/MZEwmXBEpnKHBFoMxR10p
 g75oJ/bcUdLcf0j0RcZBKRFQZdBkmyfv1Py6xqB+uPmVXD1dkcEQ418wzazWm02fPVQupQtu013f
 mdOqlm569X8fdKA2yCjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQBJF1dtYTBtQfTOs
 pjSjj/pGt5do/rI/I9YU88XuFpr5NazWXmfHsLLAE3hqANY4xeQNfrwrPRNDD7rJCRq0ewBI5a/E
 QZEpGhR54dTf8q2h1Rm5ymIG5pSQIgtexzCIu4=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPANMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl7vk
 v6Hmga/lpIQxEjAQBgNVBAMMCeW8oOWFiOaYjDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAx
 MTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASE54Ac3/GQ5SDO1ZaGyZ+7iADWWm28knQDytjM
 0gSkb3URScaRxUpp952SmYbdEKjnYoLx8Mq0dyPoRDa+m9CWy9Ppn8KPpiTU4vxy0VnyXSDt4pmP
 mAG02ppMeDo9KlmjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQAX3XlXjdXZFgpxkQQE
 DopiYfECJv5PDVL9ILF5+wljcahb9ES/I1ubKqv2SW9qLiUqeurpCzhw2Icon2Ah8FcAYSCDhCQ/
 /Gmc/MjRrBT8rvXPYGdLb5zWRMTRccrV/fU=
objectClass: wstCertificateUser
serialNumber: F00D
EncryptserialNumber: F001
cn:: 5byg5YWI5piM

dn:: Y2495LqO6LSk5oiQLG91Peedo+afpeWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
 rOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPACMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn
 6XlrqQxEjAQBgNVBAMMCeS6jui0pOaIkDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNjB6M
 BQGByqGSM49AgEGCSqBHIFFAYdoCANiAAT2LsSPTVOm4bWarrKFyBQDF8jKzP9hc1atfiKgcy0JL
 Q8eDhNIkN7MFZV2Qq1D0B5nuYQ4bCCdO0vgGeGhzThi24Z5iMU6G3SixZInNFsno71iRBUCkufZb
 tQLM+QU0SGjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQB6qkE3SC65UnG7KbmQ8Dtt4
 njk4gTyp9PY6UfFg4pGb1uLFffMKS5jHz9DvKgk+yRBTef4UjP0qRA3hZIReXBhPRCBhbLh2zEnV
 3Uctz9ZtVy/xxppF24MNirjPBXQnHs=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAHMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn6Xl
 rqQxEjAQBgNVBAMMCeS6jui0pOaIkDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNjB6MBQG
 ByqGSM49AgEGCSqBHIFFAYdoCANiAAQ72jqVYk22FoVWoX/Pk7Zg7bgdnvGzA+kyBK0dGtrxSZ1Y
 OnlyP75IoIJxqOerXy9KwgZRWtkDuBcS2I62rTU2c//7D2Zfwj1kEcDRwXy0SGMUCK6bZIigRFUU
 DY4WHeijDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBHNA3CCF1cpw98PGdJZJEwzxlL
 /LZpKYFqXHjKyXCm0meKVQLc3DHk26QGrMI0YOYnxBQppeYmHjU5upQQb2FZdxz/bEj0PRWJmiJH
 EBue5hV+m6LuI7eZ++6KC33Fu8w=
objectClass: wstCertificateUser
serialNumber: F007
EncryptserialNumber: F002
cn:: 5LqO6LSk5oiQ

dn:: Y2496YOR5Zu95piOLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuaw
 keaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPADMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemDkeWbveaYjjEcMBoGCgmSJomT8ixkAQEMDDIyM
 TIxMDAxMDAwODB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAS3Eg3r2xyMskJap1A2kYJcfnKUP
 TwZOhKaX5hDga6OwxG7nsPsMqKJxHXLlTKde/mRb7IOt8KaaNHI3nfyuyUxqunOAKCKxxTlvkKgW
 XVOJDLVZOIpg2qyQMMiGq8OkDejDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQBKZbbUI
 1SFUpGaYB335UT4hyHL6nJmjDl5NAeaQwQLEBRAfNZBTIseySF3Kuiff5nCYYkWjEFVCTZA9g4qy
 IyH1tGXzsPs0a++hfRBHXFzVXxArfOXWq9NZZ0/8CjupPA=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPAQMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
 lL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemDkeWbveaYjjEcMBoGCgmSJomT8ixkAQEMDDIyMTIx
 MDAxMDAwODB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASJZ8VG7wTFTcp3iN/giqpAafmzoagT
 svWHilseMZaQrticqx1YfojFvmFxOftOHB+6hJrpOWT1Fa8aj8x5niFkuK0o3/R7STu0y9hzoAWd
 RVx5TQOjWJQUt++31Ks64VSjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQAPGxgxepGg
 zKy0hYlLNa9H83czGFrd3XQ7JvgYubIRPSyO9XY1AwQmPfeZnNzQgTQ8kqEXRbzl/GPqa4nJWMY8
 MU621vL5dE+U/ummILC6NIFOZWSL0EopaG7d2fasKLw=
objectClass: wstCertificateUser
serialNumber: F010
EncryptserialNumber: F003
cn:: 6YOR5Zu95piO

dn:: Y2495YiY6ZuELG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaU
 v+W6nOWKnuWFrOWOhSwgYz1jbg==
notAfter: 20200614115959
EncryptCertificate;binary:: MIICejCCAgagAwIBAgIDAPAFMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZgxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxDzANBgNVBAMMBuWImOmbhDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxM
 DAxMDAxMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASZpPPLO/EbPfMGhY34+6yVVNZwaq0gz
 z+gNL6wwj58Swb5avhrQVNOJ199OO5NGu1ESShc/N0QKan/3lM7jJOr1QuA9JlrbPkwUUs/Pk+2e
 dMnd254IYkJkUiUXVN0O66jDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCryhp3sqTBZ
 8kbXsUrtJilrqs5w5jQFcuZDjke802Q9LldGF9TA+fF1/v8A+SKmNFVdKI9HeO6i4qzRx7JQAE5M
 6qVnmcOkr3ujnCioshPhKdiWo/lNovDZVZME+BFbg4=
EncryptnotAfter: 20200614115959
userCertificate;binary:: MIICejCCAgagAwIBAgIDAPAJMAsGCSqBHIFFAYdoCzCBpDE2MDQG
 A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
 VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
 BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
 MDAwMFoXDTIwMDYxNDE1NTk1OVowgZgxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
 MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
 lL/liqHlip7lhazlrqQxDzANBgNVBAMMBuWImOmbhDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAx
 MDAxMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATWQJCy2ENxXaqv9OpsoyV2IfpRm6EVTQ9i
 yqfsMTkHBjPC8NQmlOgYU1mudci1wXahVQOKC65fIaAqbwzZPu+5Q9EzazkkCRejsMbVkafp/L2D
 vvByoQfLlpTZPXnH5oCjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQCXOsoFPbGqf2sR
 GEEh1FySgTUBbwnr2E+T0d1atTqInX/puRTfuuF+SGdSHzoqzKCFcjfoZRXE1IdmUcpKYLHWZnT3
 xw6W7yZKePWg8RME0itmvAVC3jaNWYZEqbf0Aao=
objectClass: wstCertificateUser
serialNumber: F009
EncryptserialNumber: F005
cn:: 5YiY6ZuE

dn:: Y2495rW35Y2X55yB5Lq65rCR5pS/5bqcLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1
 t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
EncryptCertificate;binary:: MIICfzCCAgugAwIBAgIDAPARMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgZ0xHjAcBgNVBAMMFea1t+WNl+ecgeS6uuawkeaUv+W6n
 DEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MRIwEAYDVQQIDAnmtbfljZfnnIExJzAlB
 gNVBAoMHua1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhTEeMBwGA1UECwwV55S15a2Q5pS/5
 Yqh5Yqe5YWs5a6kMHowFAYHKoZIzj0CAQYJKoEcgUUBh2gIA2IABDjDxa3JeTB+4Q846SKfQEj7v
 FMBYXOi6gOyaOdPtXuDWjzPt714OukAeUceWp4fSBxmVGHMVFRj36hdcetkrZFdtKZktY7tm4yVu
 JOGiScjMq8wb0E1y2L5QbKHtj7OnqMPMA0wCwYDVR0PBAQDAgM4MAsGCSqBHIFFAYdoCwNhALEih
 LJkSVjCu6suTDg3z7m7tAZAUcuphZbtQhz1WBUBrOTWvvofjEdZQJ2C64KzoqXC8Ikx6FlVjStsn
 28ZnLIGo2zvh3ZGJujkKtOaI/pYIryloazRb39Dk/uDcorjAg==
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F011
cn:: 5rW35Y2X55yB5Lq65rCR5pS/5bqc

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Y+R5biD6aqM6K+B
 57O757ufLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
 nuWFrOWOhSwgYz1jbg==
EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPASMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
 eWtkOWNsOeroOWPkeW4g+mqjOivgeezu+e7nzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASxl
 dgx1eB/bGYJMJxcf/fFSfklt1DoLePXB5SNL9iCDkXyOwBfNuZQ/+MJKYm20MZVRtCfLm15FXSaE
 cubJgxxr9abn0a0mS2lqnKMPPMeIVmRItVB9ebnyS5M7By07l2jDzANMAsGA1UdDwQEAwID+DALB
 gkqgRyBRQGHaAsDYQCD+93k9XNMsNkzNLl3xgyVtlSmWtdPUclYWiGbPkT7J8V4pi5lMPDzVC2q6
 mzAMpJAjwgqlmaND0LnOM1alhDpF4kJr8u2AwpXz5bK7Q2obichggbS6tKwErwGJIXq2jE=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F012
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Y+R5biD6aqM6K+B57O7
 57uf

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Zyo57q/5pyN5Yqh
 57O757ufLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
 nuWFrOWOhSwgYz1jbg==
EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPATMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
 eWtkOWNsOeroOWcqOe6v+acjeWKoeezu+e7nzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAT3Y
 3r7euWmkFJeo6UxvcwWXokankXJhPdwOQAJo0G01Ms8/ku57iF/1v9qnaGUpW1VmxB9M60Hrt6fq
 +5Xq9fP79aXN0K1ffsm0GurgajT/uTmvODYfDutYaULTiR5bQijDzANMAsGA1UdDwQEAwID+DALB
 gkqgRyBRQGHaAsDYQBL+Ifd3r8RUPOti/A3+lv2RGhSsn41XzWlsxzYo4JdPfO982MhNjlVQvuBw
 Wt7nqE6uISJ/aMacuD8W+QPS6ZQM93uDwddh3oGsRJRsM6H3hO2rivgz0I83MtdqMrx2YQ=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F013
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Zyo57q/5pyN5Yqh57O7
 57uf

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug562+5Y+R566h55CG
 6K6+5aSHLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
 nuWFrOWOhSwgYz1jbg==
EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPAUMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
 eWtkOWNsOeroOetvuWPkeeuoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASGt
 EDJAiKCQkDeLCCf5ERgSGXrp0HB60pzyvH0aT1E5JuiVYYpBpypHGRPdgOPAv2t7MSZZCktTCuUU
 GRK0XWwOZtFObMDIJTTFq6y/KOkrYJHvtgocUJYyNmv/HaBftWjDzANMAsGA1UdDwQEAwID+DALB
 gkqgRyBRQGHaAsDYQDeOAclwZoG9ulDpmi0gZaq8bnExzWbkcFo01+eoseqrCyyk0QUu/V3nJbaP
 o/1RqkR5dMAZJneCxFZSYNfmGFljS/u1t/C6ECcBW1IFaO7V+MuD55E6CKJQzLXlEQnmdE=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F014
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug562+5Y+R566h55CG6K6+
 5aSH

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5rOo5YaM566h55CG
 6K6+5aSHLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
 nuWFrOWOhSwgYz1jbg==
EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPAVMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
 eWtkOWNsOeroOazqOWGjOeuoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATfe
 860NwLtJ6+WlxgzJKajw/4yaBdgsnZHH5UOz5KlHKal85vNYWeQ01/PpMRZNUaHHdZXwBeX1GoE0
 43H7Ydd8ljZwXNi7HeDSk5OZ0AMttAawy81TQ+2Ow34UHNRpc+jDzANMAsGA1UdDwQEAwID+DALB
 gkqgRyBRQGHaAsDYQBASlFH/K9QJt1QPS2y8ShLC8Htu1TB3dgO4TzTx8jtGh/gCGHenxcJDfjCz
 yZf1DmZouz26WhqZ8d/ouk6h/XPMBKD1ijXSls4bFMgmRtIOUPWD9w1lNkHAbhkIEvkR6o=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F015
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5rOo5YaM566h55CG6K6+
 5aSH

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5Y+v5L+h5pe26Ze05pyN5YqhLG91PeeU
 teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
 bg==
EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAWMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+WPr
 +S/oeaXtumXtOacjeWKoTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAARjbFCPyopT/n1J510rY
 fqoWOSZ31RZ6tsi2W9ERas86OyZnOYffHN/nNJIhuP62hG+8x1GQvxRQJTtMQmG8yTf3guqCAKEV
 JvJ8YqvFjrryPr5comQFq+aCPH5DalFsbGjDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
 QDGnifEI4VCDIuCzkH4T90m/nBKsP40ERsfbgT6f959SPIOhbvT7lQg9iTru21bXHHDwP2ZLOhdr
 1jRNmguSPRHfYk9R+/CtSijvM5h/VbgbxfB8ifT27yXJYP3G+89oKo=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F016
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5Y+v5L+h5pe26Ze05pyN5Yqh

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5o6I5p2D566h55CG6K6+5aSHLG91PeeU
 teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
 bg==
EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAXMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+aOi
 Oadg+euoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAR9DCT3EnxjPUiNyeeLJ
 eARvaVGbLnqRykTs6g63Pz1sJ8KytUpd8u3TRmE8I6mmg62tj0CrWdRTDWlFCEjDS3nZMmRTr/OF
 +2TfdQpankZywvalhASLgWZDSw3H2y6bJOjDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
 QD3AEmWE6YuzItIvRxtqBRbMvGaI4FldYD4eS0qCa9Qpma0izzYOstdam6pBAvLMS93ArmDTlXSs
 Zvx/OEV3/ryTyZHa5moMRJRroQdEmHM1yz2aX4pTq7RFe6PLKSajwE=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F017
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5o6I5p2D566h55CG6K6+5aSH

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LSj5Lu76K6k5a6a6K6+5aSHLG91PeeU
 teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
 bg==
EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAYMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+i0o
 +S7u+iupOWumuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATTORploAGr0V5s+yHJH
 sP8K8tAml8SGyGhajpg6pscwhikkQCDy9uFIMyQJUiEJ8AXod86ZH/KI7XxwK2gfw7+XrjC+YZ+D
 TE/Ty7babBnOctC1Y/73dqhSoRjMw5q9J2jDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
 QA6MJjxhAMDKyBNqLhnG2vhsCPDjXcjeQkzP9H54UJKlAkqldGVlxEhCdeKoqOppg8F9CgfYdi+4
 FD4ZtKZMvd6SibC+n4Kbd/PbjaIH5gG/lt35AKLgkb79n0x+HDtMu4=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F018
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LSj5Lu76K6k5a6a6K6+5aSH

dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ566h55CG6K6+5aSHLG91PeeU
 teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
 bg==
EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAZMAsGCSqBHIFFAYdoCzCBpDE2M
 DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
 AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
 gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
 TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
 TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
 ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+i1h
 Oa6kOeuoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAQoMEkVxLEqNYvIaiQ/3
 eICcDMJ9/3TIdpkRP6puuwQ43TQdr/UUqPzrd0lWNtdWe35H0+ENwUNlYisBJraco/GHpw81LNRt
 zfo4okEgukL9X0tXnxyusd6z6EZJcmCvH+jDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
 QCuJ+HYlSJXSn6G5g+xF7NCjNixSO72vghDKs+O32dz3lL7jKdZ8foMJ55S7Z2HTVNLBQbwOJDv/
 /J03XeXvcuc+Bos7PTYtQHJ5tYn4rSDDrUbY+LQA1oZxoE+BQ3s7yg=
EncryptnotAfter: 20200615115959
objectClass: wstCertificateUser
EncryptserialNumber: F019
cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ566h55CG6K6+5aSH

dn:: bz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9Y24=
objectClass: top
objectClass: organization
o:: 5Zub5bed55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6F

dn:: bz3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazl
 joUsIGM9Y24=
objectClass: top
objectClass: organization
o:: 55S15a2Q5pS/5Yqh5Yqe5YWs5a6k

dn:: bz3kv53lr4blip7lhazlrqQsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9
 Y24=
objectClass: top
objectClass: organization
o:: 5L+d5a+G5Yqe5YWs5a6k

dn:: bz3lrqPkvKDpg6gsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9Y24=
objectClass: top
objectClass: organization
o:: 5a6j5Lyg6YOo

dn:: bz3mlrDpl7vlip7kuovlpIQsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9
 Y24=
objectClass: top
objectClass: organization
o:: 5paw6Ze75Yqe5LqL5aSE

dn:: bz3nnIHlp5Tnu4Tnu4fpg6gsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9
 Y24=
objectClass: top
objectClass: organization
o:: 55yB5aeU57uE57uH6YOo

dn:: bz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazljoUsIGM9Y24=
objectClass: top
objectClass: organization
o:: 5rmW5YyX55yB5Lq65rCR5pS/5Yqh5Yqe5YWs5Y6F

dn:: bz3nnIHlp5TlrqPkvKDpg6gsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazljoUsIGM9
 Y24=
objectClass: top
objectClass: organization
o:: 55yB5aeU5a6j5Lyg6YOo

dn:: bz3nnIHlp5Tkv53lr4bnnaPmn6Xnu4Qsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazl
 joUsIGM9Y24=
objectClass: top
objectClass: organization
o:: 55yB5aeU5L+d5a+G552j5p+l57uE

dn:: bz3nnIHlp5TlpJbkuqTpg6gsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazljoUsIGM9
 Y24=
objectClass: top
objectClass: organization
o:: 55yB5aeU5aSW5Lqk6YOo

dn:: bz3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazl
 joUsIGM9Y24=
objectClass: top
objectClass: organization
o:: 55S15a2Q5pS/5Yqh5Yqe5YWs5a6k

最后运行LdifImport.java中的main方法,控制台输出结果为以下就说明成功了

LDIF change file

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
changetype: attribute type undefined

Adding entry...


Adding entry...
Directory information has been modified.

Adding entry...
changetype: attribute type undefined

Adding entry...


Adding entry...
Directory information has been modified.

Adding entry...


Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...


Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

Adding entry...
Directory information has been modified.

 

以上是关于java导入ldif文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将Active Directory ldif文件导入openldap服务器?

openldap导入数据

带有 apacheds 的示例活动目录 ldif 文件

Openldap导入数据

使用自己的 ldif 文件时出现 LDAP 异常

如何将对象类和自定义属性添加到 LDIF 文件?