public Class enc_e_Utils(String ss, Type oeinit) {
    Class c = new Class(pack, "Utils");

        Type tparam = tvar("T");
        String dss = dd(ss);
        String ess = ee(ss);
        Type einit = en_t_S(oeinit);
        final Type init = cons(dss, tparam, einit);
        Type rtype = cons(ess, init, init, tparam, einit);
        Method m = new Method(rtype, ss);
        m.isStatic = true;
    m.typeParams.add(tparam.cons);
    if(t.var(oeinit.cons)) {
        m.typeParams.add(einit.cons);
    }
        m.mBody.add(new Return(new ObjectCreation(rtype,new ObjectCreation(cons("UtilsST")), new ObjectCreation(cons("UtilsST")))));
        c.methods.add(m);
        // prog()
        Method m2 = new Method(rtype, "prog");
        m2.isStatic = true;
        m2.typeParams.add(tparam.cons);
        if(t.var(oeinit.cons)) {
        m2.typeParams.add(einit.cons);
    }
        m2.mBody.add(new Return(new Invocation(null, ss)));
        c.methods.add(m2);
//        // wrapfunc
//        Method mw1 = new Method(cons("F<S,T>"), "wrapfunc");
//        mw1.typeParams.add("S");
//        mw1.typeParams.add("T");
//        mw1.typeParams.add(tparam.cons);
//        mw1.mBody.add(new Return(new Invocation(new VariableExpression("this"), ss)));
//        c.methods.add(mw1);
//        // wrapfunc2
//        Method mw2 = new Method(cons("F2<S1,S2,T>"), "wrapfunc2");
//        mw2.typeParams.add("S1");
//        mw2.typeParams.add("S2");
//        mw2.typeParams.add("T");
//        mw2.typeParams.add(tparam.cons);
//        mw2.mBody.add(new Return(new Invocation(new VariableExpression("this"), ss)));
//        c.methods.add(mw2);
//        // wrapfunc3
//        Method mw3 = new Method(cons("F3<S1,S2,S3,T>"), "wrapfunc3");
//        mw3.typeParams.add("S1");
//        mw3.typeParams.add("S2");
//        mw3.typeParams.add("S3");
//        mw3.typeParams.add("T");
//        mw3.typeParams.add(tparam.cons);
//        mw3.mBody.add(new Return(new Invocation(new VariableExpression("this"), ss)));
//        c.methods.add(mw3);

    Class ST = new Class("UtilsST", mfun(init,init));
    ST.isStatic = true;
    ST.params.add(tparam.cons);
    if(t.var(oeinit.cons)) {
        ST.params.add(einit.cons);
    }
    Method APP = new Method(init, APPLY);
    APP.params.add(new Variable(init, "x"));
    APP.mBody.add(new Return(new VariableExpression("x")));
    ST.methods.add(APP);
    c.classes.add(ST);
return c;

}