text:
import * as fs from "fs";
import * as Stream from "stream";

const SSH2Client = require('ssh2').Client;
const osPath = require('path').posix;

export interface IShell {
    [x: string]: any
}
export interface ISFTP {
    [x: string]: any
}
export interface IProcessStatus {
    status?:string,
    name?:string,
    id?:string,
    path?:string,
    args?:string,
    "exec cwd"?:string,
    "error log path"?:string,
    "out log path"?:string,
    "pid path"?:string,
    mode?:string,
    uptime?:string,
    "created at"?:string,
    interpreter?:string,
    restarts?:string,
    "watch & reload"?:string,
    [x: string]: any
}
export interface IStat {
    mode: any,
    permissions: any,
    owner: any,
    group: any,
    size: any,
    accessTime: any,
    modifyTime: any
}

export class PhanxSSH {

    public client:any;
    public debugFn:Function;
    protected _shell:IShell;
    protected _sftp:ISFTP;
    public debugStatus:boolean = true;

    constructor() {
        this.client = new SSH2Client();
    }

    //########################################################################

    /**
     * Opens a connection.
     *
     * @param config
     * @returns {Promise<void>}
     */
    public connect(config:any):Promise<void> {

        PhanxSSH.loadPrivateKey(config);

        let conn = this.client;

        return new Promise(resolve => {
            conn.on('error', (err)=> {
                console.error(err);
            });
            conn.on('ready', () => {
                resolve();
            }).connect({
                host: config.host,
                port: config.port,
                username: config.username,
                password: config.password || undefined,
                privateKey: config.privateKey || undefined
            });

        })

    }

    /**
     * Ends the connection.
     */
    public end() {
        return this.client.end();
    }

    //########################################################################

    /**
     * For atomic command execution.
     *
     * @param {string} command
     * @returns {Promise} - result as string
     */
    public exec(command:string):Promise<string> {
        let conn = this.client;
        return new Promise((resolve, reject) => {

            conn.exec(command, (err, stream) => {

                if (err) {
                    reject(err);
                    return;
                }
                let buffer = '';

                stream.on('close', (code, signal) => {
                    //this.debug("close",code,signal);
                    //conn.end();
                    this.debug(buffer);
                    resolve(buffer);
                }).on('data', (data) => {
                    //this.debug(data.toString());
                    //resolve(data.toString());
                    buffer+=data;
                }).stderr.on('data', (data) => {
                    this.debug("stderr",data.toString());
                    reject(data.toString());
                });

            })

        });
    }

    //########################################################################
    // shell (interactive commands) non-atomic

    /**
     * Returns a stream representing the shell.
     * Use it with the following methods:
     *  shellExec
     *  shellEnd
     * The last shell stream will be used if you don't pass it.
     *
     * @returns {Promise}
     */
    public shell():Promise<IShell> {
        return new Promise((resolve,reject)=> {
            let conn = this.client;
            conn.shell((err, stream) => {

                if (err) {
                    reject(err);
                    return;
                }

                stream.on('close', () => {
                    this.debug('Stream :: close');
                    //conn.end();
                }).stderr.on('data', (data) => {
                    this.debugStatus = true;
                    this.debug('STDERR: ' + data);
                });
                /*
                .on('data', (data) => {
                    process.stdout.write(data);
                })
                 */

                this._shell = stream;
                resolve(stream);

            })
        });
    }

    /**
     * Execute a command within a shell stream.
     * Will resolve the promise once the shell command finishes or the timeout is met.
     *
     * @param {string} c - command
     * @param {IShell} shell (default last stream) stream
     * @param timeout_ms (default: 0 - no timeout) - number in ms
     * @returns {Promise}
     */
    shellExec(c:string,shell:IShell=null,timeout_ms:number=0):Promise<string> {

        if (shell==null)
            shell = this._shell;

        const CMD_ = "__CMDEOL_"; //28len
        const _EOL = "9u43jihgt0i3u9io3__";

        return new Promise(resolve => {

            let timer = null;
            let buffer = '';
            let fullBuffer = '';

            let onData:Function = (data)=> {
                buffer += data;
                fullBuffer += data;
                //console.log(data.toString(),data.toString().charCodeAt(0))

                if (
                    //buffer.substring(buffer.length-28)==CMD_EOL ||
                    buffer.indexOf(CMD_+_EOL, Math.max(0,buffer.length-200)) >= 0)
                {
                    shell.removeListener('data',onData);

                    setTimeout(()=> {
                        resolve(fullBuffer);
                    },100);
                    return;
                }

                if (timeout_ms > 0)
                setupTimeout();

                if (data.toString().charCodeAt(0)==13) {
                    this.debug(buffer);
                    buffer = '';
                }
            };

            shell.on('data',onData);
            shell.on('close',()=> {
                //console.log("closed");
            });

            shell.write(`${c} ; printf '%s%s' ${CMD_} ${_EOL}\n`);

            let setupTimeout:Function = () => {
                clearTimeout(timer);

                timer = setTimeout(() => {
                    shell.removeListener('data',onData);
                    resolve("timeout::"+fullBuffer);
                },timeout_ms);
            };

            if (timeout_ms > 0)
                setupTimeout();

        });

    }

    /**
     * Use to close the shell stream.
     *
     * @param {IShell} shell (defaults to last shell) - stream
     * @returns {Promise<void>}
     */
    async shellEnd(shell:IShell=null):Promise<void> {
        if (shell==null)
            shell = this._shell;
        await this.shellExec("exit", shell);
        shell.end();
    }

    //########################################################################
    // pm2

    /**
     * Returns the status of a PM2 process.
     *
     * @param {string | number} id_name
     * @returns {Promise<IProcessStatus>}
     */
    async nodeProcessStatus(id_name:string|number):Promise<IProcessStatus> {

        let temp = await this.exec("pm2 show " + id_name);
        let result = temp.toString();

        //console.log(result);

        //│ status            │ online

        let out:IProcessStatus = {};

        if (result!=null) {
            let lines = result.split("\n");
            for (let line of lines) {
                if (line.indexOf("│") >= 0) {
                    let parts = line.split("│");
                    if (parts == null || parts.length <= 2)
                        continue;
                    out[parts[1].trim()] = parts[2].trim();
                }
            }
        }

        return out;

    }

    //########################################################################
    // SFTP (file transfer through SSH)

    /**
     * Enables SFTP functionality on this connection.
     *
     * @returns {Promise<ISFTP>}
     */
    public sftp():Promise<ISFTP> {
        return new Promise((resolve, reject)=> {

            if (this._sftp!=null) {
                resolve(this._sftp);
                return;
            }

            this.client.sftp((err, sftp) => {
                this.client.removeListener('error', reject);
                this.client.removeListener('end', reject);
                if (err) {
                    reject(new Error(`Failed to connect to server: ${err.message}`));
                }
                this._sftp = sftp;
                resolve(sftp);
            });
        });

    }

    /**
     * Lists files within an SFTP directory, returns an array.
     *
     * @param {string} path
     * @param {ISFTP} sftp
     * @returns {Promise<Array<string>>}
     */
    public sftpList(path:string,sftp:ISFTP=null):Promise<Array<any>> {
        const reg = /-/gi;

        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(new Error('sftp connect error'));
            }
            sftp.readdir(path, (err, list) => {
                if (err) {
                    reject(new Error(`Failed to list ${path}: ${err.message}`));
                } else {
                    let newList = [];
                    // reset file info
                    if (list) {
                        newList = list.map(item => {
                            return {
                                type: item.longname.substr(0, 1),
                                name: item.filename,
                                size: item.attrs.size,
                                modifyTime: item.attrs.mtime * 1000,
                                accessTime: item.attrs.atime * 1000,
                                rights: {
                                    user: item.longname.substr(1, 3).replace(reg, ''),
                                    group: item.longname.substr(4,3).replace(reg, ''),
                                    other: item.longname.substr(7, 3).replace(reg, '')
                                },
                                owner: item.attrs.uid,
                                group: item.attrs.gid
                            };
                        });
                    }
                    resolve(newList);
                }
            });
        });
    }

    /**
     * Checks if a file exists in the SFTP.
     *
     * @param {string} path
     * @param {ISFTP} sftp
     * @returns {Promise<boolean>}
     */
    public sftpExists(path:string,sftp:ISFTP=null):Promise<boolean> {
        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(new Error('sftp connect error'));
            }
            let {dir, base} = osPath.parse(path);
            sftp.readdir(dir, (err, list) => {
                if (err) {
                    if (err.code === 2) {
                        resolve(false);
                    } else {
                        reject(new Error(`Error listing ${dir}: code: ${err.code} ${err.message}`));
                    }
                } else {
                    let [type] = list.filter(item => item.filename === base).map(item => item.longname.substr(0, 1));
                    if (type) {
                        resolve(type);
                    } else {
                        resolve(false);
                    }
                }
            });
        });
    }

    /**
     * Get the file statistics of the remote path and returns an object.
     *
     * @param {string} remotePath
     * @param {ISFTP} sftp
     * @returns {Promise<IStat>}
     */
    public sftpStat(remotePath:string,sftp:ISFTP=null):Promise<IStat> {
        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(Error('sftp connect error'));
            }
            sftp.stat(remotePath, function (err, stats) {
                if (err){
                    reject(new Error(`Failed to stat ${remotePath}: ${err.message}`));
                } else {
                    // format similarly to sftp.list
                    resolve({
                        mode: stats.mode,
                        permissions: stats.permissions,
                        owner: stats.uid,
                        group: stats.guid,
                        size: stats.size,
                        accessTime: stats.atime * 1000,
                        modifyTime: stats.mtime * 1000
                    });
                }
            });
            return undefined;
        });
    }

    /**
     * Downloads a file from SFTP.
     * Recommend to use sftpFastGet.
     *
     * @param {string} path
     * @param {string} encoding
     * @param {ISFTP} sftp
     * @returns {Promise<module:stream.internal>}
     */
    public sftpGet(path:string,encoding:string="utf8",sftp:ISFTP=null)
        :Promise<Stream>
    {
        let options = {
            encoding: encoding,
            useCompression: true,
        };
        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (sftp) {
                try {
                    this.client.on('error', reject);

                    let stream:Stream = sftp.createReadStream(path, options);

                    stream.on('error', (err) => {
                        this.client.removeListener('error', reject);
                        return reject(new Error(`Failed get for ${path}: ${err.message}`));
                    });
                    stream.on('readable', () => {
                        this.client.removeListener('error', reject);
                        return resolve(stream);
                    });
                } catch(err) {
                    this.client.removeListener('error', reject);
                    return reject(new Error(`Failed get on ${path}: ${err.message}`));
                }
            } else {
                return reject(new Error('sftp connect error'));
            }
        });
    }

    /**
     * Downloads a file from the SFTP using parallel processing.
     *
     * @param {string} remotePath
     * @param {string} localPath
     * @param {ISFTP} sftp
     * @returns {Promise<string>}
     */
    public sftpFastGet(remotePath:string, localPath:string, sftp:ISFTP=null)
        :Promise<string>
    {
        sftp = sftp || this._sftp;

        let options =  {concurrency: 64, chunkSize: 32768};

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(Error('sftp connect error'));
            }
            sftp.fastGet(remotePath, localPath, options, function (err) {
                if (err){
                    reject(new Error(`Failed to get ${remotePath}: ${err.message}`));
                }
                resolve(`${remotePath} was successfully download to ${localPath}!`);
            });
            return undefined;
        });

    }

    /**
     * Uploads a file to the SFTP using parallel processing for faster.
     *
     * @param {string} localPath
     * @param {string} remotePath
     * @param {ISFTP} sftp
     * @returns {Promise<string>}
     */
    public sftpFastPut(localPath:string, remotePath:string, sftp:ISFTP=null)
        :Promise<string>
    {
        sftp = sftp || this._sftp;
        let options = {};

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(new Error('sftp connect error'));
            }
            sftp.fastPut(localPath, remotePath, options, function (err) {
                if (err) {
                    reject(new Error(`Failed to upload ${localPath} to ${remotePath}: ${err.message}`));
                }
                resolve(`${localPath} was successfully uploaded to ${remotePath}!`);
            });
            return undefined;
        });
    }

    /**
     * Upload a file to the SFTP.
     * Recommend to use sftpFastPut.
     *
     * @param {Buffer|string|Stream} input
     * @param {string} remotePath
     * @param {string} encoding
     * @param {ISFTP} sftp
     * @returns {Promise<string>}
     */
    public sftpPut(input:Buffer|string|Stream,
                   remotePath:string, encoding:string="utf8",
                   sftp:ISFTP=null):Promise<string>
    {
        let options = {
            encoding: encoding,
            useCompression: true,
        };
        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (sftp) {
                if (typeof input === 'string') {
                    sftp.fastPut(input, remotePath, options, (err) => {
                        if (err) {
                            return reject(new Error(`Failed to upload ${input} to ${remotePath}: ${err.message}`));
                        }
                        return resolve(`Uploaded ${input} to ${remotePath}`);
                    });
                    return false;
                }
                let stream = sftp.createWriteStream(remotePath, options);

                stream.on('error', err => {
                    return reject(new Error(`Failed to upload data stream to ${remotePath}: ${err.message}`));
                });

                stream.on('close', () => {
                    return resolve(`Uploaded data stream to ${remotePath}`);
                });

                if (input instanceof Buffer) {
                    stream.end(input);
                    return false;
                }
                input.pipe(stream);
            } else {
                return reject(Error('sftp connect error'));
            }
        });
    }

    /**
     * Invokes the mkdir (make directory) SFTP command.
     *
     * @param {string} path
     * @param {boolean} recursive
     * @param {ISFTP} sftp
     * @returns {Promise<string>}
     */
    public sftpMkdir(path:string,recursive:boolean=false,
                     sftp:ISFTP=null):Promise<string>

    {
        sftp = sftp || this._sftp;

        let doMkdir = (p:string):Promise<string> => {
            return new Promise((resolve, reject) => {

                if (!sftp) {
                    return reject(new Error('sftp connect error'));
                }
                sftp.mkdir(p, err => {
                    if (err) {
                        reject(new Error(`Failed to create directory ${p}: ${err.message}`));
                    }
                    resolve(`${p} directory created`);
                });
                return undefined;
            });
        };

        if (!recursive) {
            return doMkdir(path);
        }
        let mkdir = p => {
            let {dir} = osPath.parse(p);
            return this.sftpExists(dir, sftp).then((type) => {
                if (!type) {
                    return mkdir(dir);
                }
            }).then(() => {
                return doMkdir(p);
            });
        };
        return mkdir(path);
    }

    /**
     * Invokes the rmdir (remove directory) SFTP command.
     *
     * @param {string} path
     * @param {boolean} recursive
     * @param {ISFTP} sftp
     * @returns {Promise<string>}
     */
    public sftpRmdir(path:string, recursive:boolean=false,
                     sftp:ISFTP=null):Promise<string>
    {
        sftp = sftp || this._sftp;

        let doRmdir = (p:string):Promise<string> => {
            return new Promise((resolve, reject) => {

                if (!sftp) {
                    return reject(new Error('sftp connect error'));
                }
                sftp.rmdir(p, err => {
                    if (err) {
                        reject(new Error(`Failed to remove directory ${p}: ${err.message}`));
                    }
                    resolve('Successfully removed directory');
                });
                return undefined;
            });
        };

        if (!recursive) {
            return doRmdir(path);
        }

        let rmdir = p => {
            let list;
            let files;
            let dirs;
            return this.sftpList(p,sftp).then((res) => {
                list = res;
                files = list.filter(item => item.type === '-');
                dirs = list.filter(item => item.type === 'd');
                return this._asyncForEach(files, (f) => {
                    return this.sftpDelete(osPath.join(p, f.name), sftp);
                });
            }).then(() => {
                return this._asyncForEach(dirs, (d) => {
                    return rmdir(osPath.join(p, d.name));
                });
            }).then(() => {
                return doRmdir(p);
            });
        };
        return rmdir(path);
    }

    /**
     * Invokes the delete SFTP command.
     *
     * @param {string} path
     * @param {ISFTP} sftp
     * @returns {Promise<string>}
     */
    public sftpDelete(path:string, sftp:ISFTP=null):Promise<string>
    {
        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(new Error('sftp connect error'));
            }
            sftp.unlink(path, (err) => {
                if (err) {
                    reject(new Error(`Failed to delete file ${path}: ${err.message}`));
                }
                resolve('Successfully deleted file');
            });
            return undefined;
        });
    }

    /**
     * Invokes the file rename SFTP command.
     *
     * @param {string} srcPath
     * @param {string} remotePath
     * @param {ISFTP} sftp
     * @returns {Promise<string>}
     */
    public sftpRename(srcPath:string,remotePath:string,sftp:ISFTP=null)
        :Promise<string>
    {
        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(new Error('sftp connect error'));
            }
            sftp.rename(srcPath, remotePath, (err) => {
                if (err) {
                    reject(new Error(`Failed to rename file ${srcPath} to ${remotePath}: ${err.message}`));
                }
                resolve(`Successfully renamed ${srcPath} to ${remotePath}`);
            });
            return undefined;
        });
    }

    /**
     * Invokes the CHMOD command in the SFTP.
     *
     * @param {string} remotePath
     * @param {number} mode - 0o777
     * @param {ISFTP} sftp
     * @returns {Promise} result as string
     */
    public sftpChmod(remotePath:string, mode:number, sftp:ISFTP=null)
        :Promise<string>
    {
        sftp = sftp || this._sftp;

        return new Promise((resolve, reject) => {

            if (!sftp) {
                return reject(new Error('sftp connect error'));
            }
            sftp.chmod(remotePath, mode, (err) => {
                if (err) {
                    reject(new Error(`Failed to change mode for ${remotePath}: ${err.message}`));
                }
                resolve('Successfully change file mode');
            });
            return undefined;
        });
    }

    //########################################################################
    // utilities

    /**
     * Command Builder: FTP GET
     * Does not execute anything.
     * Builds an exec string that can be used to FTP files on a remote server.
     *
     * @param ftp - config object
     * @param {string} remoteFile - path
     * @param {string} localFile - path
     * @returns {string} returns command as string, pass to exec
     */
    public ftpGet(ftp:any,remoteFile:string,localFile:string):string
    {

        let ftpLogin:string = "open " +  ftp.host + " " + ftp.port + "\n" +
            "user " + ftp.user + " " + this._escapePassword(ftp.password) + "\n" +
            "passive\nbinary\n" +
            "get " + remoteFile + " " + localFile + "\n" +
            "bye" ;

        return 'ftp -n <<< "' + ftpLogin + '"';

    }

    /**
     * Command Builder: FTP PUT
     * Does not execute anything.
     * Builds an exec string that can be used to FTP files on a remote server.
     *
     * @param {any} ftp - config object
     * @param {string} localFile - path
     * @param {string} remoteFile - path
     * @returns {string} returns command as string, pass to exec
     */
    public ftpPut(ftp:any,localFile:string, remoteFile:string):string
     {

        let ftpLogin:string = "open " +  ftp.host + " " + ftp.port + "\n" +
            "user " + ftp.user + " " + this._escapePassword(ftp.password) + "\n" +
            "passive\nbinary\n" +
            "put " + localFile + " " + remoteFile + "\n" +
            "bye" ;

        return 'ftp -n <<< "' + ftpLogin + '"';

    }

    private _escapePassword(password:string):string {
        return password
                .split("$").join("\\$")
                .split("'").join("\\'");
    }

    private _asyncForEach(array:Array<any>, callback:Function):any {
        return array.reduce((promise, item) => {
            return promise.then((result) => {
                return callback(item);
            });
        }, Promise.resolve());
    }

    public debug(...args):void {
        if (this.debugStatus && this.debugFn!=null) {
            this.debugFn(...args);
        }
    }

    public static loadPrivateKey(config:any):void {
        if (config.sshKeyPath!=null) {
            config.privateKey = fs.readFileSync(
                config.sshKeyPath
            ).toString("utf8").trim();
        }
    }
}

repository: phanxgames/phanx-ssh-sftp

repo_name: phanxgames/phanx-ssh-sftp

extension: ts


text:
// Copyright 2020 Liquidata, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package sqle

import (
	"fmt"

	"github.com/liquidata-inc/go-mysql-server/sql"

	"github.com/liquidata-inc/dolt/go/libraries/doltcore/schema"
)

type DoltIndexDriver struct {
	dbs map[string]Database
}

var _ sql.IndexDriver = (*DoltIndexDriver)(nil)

func NewDoltIndexDriver(dbs ...Database) *DoltIndexDriver {
	nameToDB := make(map[string]Database)
	for _, db := range dbs {
		nameToDB[db.Name()] = db
	}

	return &DoltIndexDriver{nameToDB}
}

func (*DoltIndexDriver) Create(string, string, string, []sql.Expression, map[string]string) (sql.Index, error) {
	panic("index driver create path not supported")
}

func (i *DoltIndexDriver) Delete(sql.Index, sql.PartitionIter) error {
	panic("index driver delete path not supported")
}

func (*DoltIndexDriver) ID() string {
	return "doltDbIndexDriver"
}

func (driver *DoltIndexDriver) LoadAll(ctx *sql.Context, db, table string) ([]sql.Index, error) {
	database, ok := driver.dbs[db]
	if !ok {
		panic("Unexpected db: " + db)
	}

	root, err := database.GetRoot(ctx)
	if err != nil {
		return nil, err
	}

	tbl, ok, err := root.GetTable(ctx, table)
	if err != nil {
		return nil, err
	}
	if !ok {
		return nil, nil
	}

	sch, err := tbl.GetSchema(ctx)
	if err != nil {
		return nil, err
	}

	rowData, err := tbl.GetRowData(ctx)
	if err != nil {
		return nil, err
	}

	cols := sch.GetPKCols().GetColumns()
	sqlIndexes := []sql.Index{
		&doltIndex{
			cols:         cols,
			ctx:          ctx,
			db:           database,
			driver:       driver,
			id:           fmt.Sprintf("%s:primaryKey%v", table, len(cols)),
			indexRowData: rowData,
			indexSch:     sch,
			table:        tbl,
			tableData:    rowData,
			tableName:    table,
			tableSch:     sch,
		},
	}
	for _, index := range sch.Indexes().AllIndexes() {
		indexRowData, err := tbl.GetIndexRowData(ctx, index.Name())
		if err != nil {
			return nil, err
		}
		cols := make([]schema.Column, index.Count())
		for i, tag := range index.IndexedColumnTags() {
			cols[i], _ = index.GetColumn(tag)
		}
		sqlIndexes = append(sqlIndexes, &doltIndex{
			cols:         cols,
			ctx:          ctx,
			db:           database,
			driver:       driver,
			id:           table + ":" + index.Name(),
			indexRowData: indexRowData,
			indexSch:     index.Schema(),
			table:        tbl,
			tableData:    rowData,
			tableName:    table,
			tableSch:     sch,
		})
	}

	return sqlIndexes, nil
}

func (i *DoltIndexDriver) Save(*sql.Context, sql.Index, sql.PartitionIndexKeyValueIter) error {
	panic("index driver save path not supported")
}

license_type: permissive

branch_name: refs/heads/master

extension: go


text:
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2011 Jitse Niesen <jitse@maths.leeds.ac.uk>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#include "matrix_functions.h"

template<typename MatrixType>
void testMatrixSqrt(const MatrixType& m)
{
  MatrixType A;
  generateTestMatrix<MatrixType>::run(A, m.rows());
  MatrixType sqrtA = A.sqrt();
  VERIFY_IS_APPROX(sqrtA * sqrtA, A);
}

EIGEN_DECLARE_TEST(matrix_square_root)
{
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_1(testMatrixSqrt(Matrix3cf()));
    CALL_SUBTEST_2(testMatrixSqrt(MatrixXcd(12,12)));
    CALL_SUBTEST_3(testMatrixSqrt(Matrix4f()));
    CALL_SUBTEST_4(testMatrixSqrt(Matrix<double,Dynamic,Dynamic,RowMajor>(9, 9)));
    CALL_SUBTEST_5(testMatrixSqrt(Matrix<float,1,1>()));
    CALL_SUBTEST_5(testMatrixSqrt(Matrix<std::complex<float>,1,1>()));
  }
}

license: MIT

repository: timi-liuliang/echo

repo_name: timi-liuliang/echo

gha_license_id: MIT

extension: cpp


text:
class TreeNode {
    val: number
    left: TreeNode | null
    right: TreeNode | null
    constructor (val?: number, left?: TreeNode | null, right?: TreeNode | null) {
        this.val = (val === undefined ? 0 : val);
        this.left = (left === undefined ? null : left);
        this.right = (right === undefined ? null : right);
    }
}

class ListNode {
    val: number
    next: ListNode | null
    constructor (val?: number, next?: ListNode | null) {
        this.val = (val === undefined ? 0 : val);
        this.next = (next === undefined ? null : next);
    }
}

function listOfDepth (tree: TreeNode | null): Array<ListNode | null> {
    if (tree === null) {
        return [];
    }
    const result:ListNode[] = [];
    levelOrder([tree, ], result);
    return result;
}

function levelOrder (levelNodes:TreeNode[], result:ListNode[]):void {
    const dummyHead = new ListNode();
    let lastNode = dummyHead;
    const nextNodes:TreeNode[] = [];
    for (let i = 0; i < levelNodes.length; i++) {
        const node = levelNodes[i];
        lastNode.next = new ListNode(node.val);
        lastNode = lastNode.next;
        node.left !== null && nextNodes.push(node.left);
        node.right !== null && nextNodes.push(node.right);
    }
    result.push(<ListNode>dummyHead.next);
    nextNodes.length > 0 && levelOrder(nextNodes, result);
}

repository: jiangshanmeta/meta

repo_name: jiangshanmeta/meta

gha_language: JavaScript


text:
import { IActions, IAppModel } from '../meiosis';

let loggedIn = false;

export const LoadDataEffect = (actions: IActions) => {
  let dataLoaded = false;

  return async (state: IAppModel) => {
    const { users } = state;
    const todo = [] as Promise<void>[];
    // console.log('EFFECT');
    if (!dataLoaded && (!users.list || users.list.length === 0)) {
      dataLoaded = true;
      console.log(`Loading data`);
      // todo.push(actions.users.updateList());
      todo.push(actions.exercises.updateList());
      await Promise.all(todo);
    }
  };
};

export const LoginEffect = (actions: IActions) => async (state: IAppModel) => {
  if (!loggedIn && !state.app.loggedInUser) {
    // console.log(`Logging in`);
    loggedIn = true;
    // await actions.login();
  } else if (loggedIn && state.app.loggedInUser) {
  }
};

repository: STRATEGY-EU/OST

repo_name: STRATEGY-EU/OST

branch_name: refs/heads/main


text:
SUMMARY = "OpelFlow"
DESCRIPTION = "Provide a generic framework for handling devices in userspace."
HOMEPAGE = "http://www.openflow.org"
SECTION = "networking"
LICENSE = "GPLv2"

LIC_FILES_CHKSUM = "file://COPYING;md5=e870c934e2c3d6ccf085fd7cf0a1e2e2"

SRCREV = "5ccca75a69f99791659bcfbcf35353ab1921320a"
PR = "r0"
PV = "1.0+git${SRCPV}"

SRC_URI = "git://gitosis.stanford.edu/openflow.git;protocol=git"

DEPENDS = "virtual/libc"

S = "${WORKDIR}/git"

inherit autotools

repository: nysan/meta-cloud

repo_name: nysan/meta-cloud

extension: bb


text:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace Couchbase.Data
{
   public class CouchbaseServerException : CouchbaseDataException
    {
        public CouchbaseServerException()
        {
        }

        public CouchbaseServerException(string message)
            : base(message)
        {
        }

        public CouchbaseServerException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        protected CouchbaseServerException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }

        public CouchbaseServerException(IOperationResult result, string key)
            : base(result, key)
        {
        }

        public CouchbaseServerException(IDocumentResult result, string key)
            : base(result, key)
        {
        }
    }
}

repository: couchbaselabs/couchbase-net-data

repo_name: couchbaselabs/couchbase-net-data

gha_language: C#

extension: cs


text:
// StyledMultilineElement.cs

// MvvmCross is licensed using Microsoft Public License (Ms-PL)
// Contributions and inspirations noted in readme.md and license.txt
//
// Project Lead - Stuart Lodge, @slodge, me@slodge.com

namespace CrossUI.Droid.Dialog.Elements
{
    public class StyledMultilineElement : StringElement
    {
        public StyledMultilineElement()
        {
        }

        public StyledMultilineElement(string caption) : base(caption)
        {
        }

        public StyledMultilineElement(string caption, string value) : base(caption, value)
        {
        }

        public StyledMultilineElement(string caption, string value, string layoutName)
            : base(caption, value, layoutName)
        {
        }
    }
}

repository: brminnick/MvvmCross

detected_licenses: MIT MS-PL Apache-2.0

repo_name: brminnick/MvvmCross

branch_name: refs/heads/develop


text:
package orm

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/assert"
)

type searchEntity struct {
	ORM           `orm:"localCache;redisCache"`
	ID            uint
	Name          string
	ReferenceOne  *searchEntityReference
	ReferenceMany []*searchEntityReference
	FakeDelete    bool
}

type searchEntityReference struct {
	ORM
	ID   uint
	Name string
}

func TestSearch(t *testing.T) {
	var entity *searchEntity
	var reference *searchEntityReference
	engine := PrepareTables(t, &Registry{}, 5, entity, reference)

	flusher := engine.NewFlusher()
	for i := 1; i <= 10; i++ {
		flusher.Track(&searchEntity{Name: fmt.Sprintf("name %d", i), ReferenceOne: &searchEntityReference{Name: fmt.Sprintf("name %d", i)}})
	}
	flusher.Flush()
	entity = &searchEntity{ID: 1}
	engine.Load(entity)
	entity.ReferenceMany = []*searchEntityReference{{ID: 1}, {ID: 2}, {ID: 3}}
	engine.Flush(entity)

	var rows []*searchEntity
	missing := engine.LoadByIDs([]uint64{1, 2, 20}, &rows)
	assert.Len(t, missing, 1)
	assert.Len(t, rows, 2)
	assert.Equal(t, uint64(20), missing[0])
	assert.Equal(t, uint(1), rows[0].ID)
	assert.Equal(t, uint(2), rows[1].ID)

	entity = &searchEntity{}
	found := engine.SearchOne(NewWhere("ID = ?", 1), entity, "ReferenceOne")
	assert.True(t, found)
	assert.Equal(t, uint(1), entity.ID)
	assert.Equal(t, "name 1", entity.Name)
	assert.Equal(t, "name 1", entity.ReferenceOne.Name)
	assert.True(t, entity.ReferenceOne.Loaded())

	engine.Search(NewWhere("ID > 0"), nil, &rows, "ReferenceOne")
	assert.Len(t, rows, 10)
	assert.Equal(t, uint(1), rows[0].ID)
	assert.Equal(t, "name 1", rows[0].Name)
	assert.Equal(t, "name 1", rows[0].ReferenceOne.Name)
	assert.True(t, rows[0].ReferenceOne.Loaded())

	total := engine.SearchWithCount(NewWhere("ID > 2"), nil, &rows)
	assert.Equal(t, 8, total)
	assert.Len(t, rows, 8)

	ids, total := engine.SearchIDsWithCount(NewWhere("ID > 2"), nil, entity)
	assert.Equal(t, 8, total)
	assert.Len(t, ids, 8)
	assert.Equal(t, uint64(3), ids[0])

	ids = engine.SearchIDs(NewWhere("ID > 2"), nil, entity)
	assert.Len(t, ids, 8)
	assert.Equal(t, uint64(3), ids[0])

	entity = &searchEntity{ID: 1}
	engine.Load(entity, "ReferenceMany")
	assert.Len(t, entity.ReferenceMany, 3)
	assert.True(t, entity.ReferenceMany[0].Loaded())
	assert.True(t, entity.ReferenceMany[1].Loaded())
	assert.True(t, entity.ReferenceMany[2].Loaded())

	engine = PrepareTables(t, &Registry{}, 5)
	assert.PanicsWithError(t, "entity 'orm.searchEntity' is not registered", func() {
		engine.Search(NewWhere("ID > 0"), nil, &rows)
	})
}

repository: summer-solutions/orm

repo_name: summer-solutions/orm

gha_language: Go


text:
package auth

import (
	"context"
	"errors"
	"fmt"
	"net/http"
	"time"

	log "github.com/sirupsen/logrus"
	"github.com/zalando/skipper/filters"
	"golang.org/x/oauth2"
)

const (
	// Deprecated, use filters.OAuthGrantName instead
	OAuthGrantName = filters.OAuthGrantName

	secretsRefreshInternal = time.Minute
	tokenWasRefreshed      = "oauth-did-refresh"
)

var (
	errExpiredToken = errors.New("expired access token")
)

type grantSpec struct {
	config OAuthConfig
}

type grantFilter struct {
	config OAuthConfig
}

func (s *grantSpec) Name() string { return filters.OAuthGrantName }

func (s *grantSpec) CreateFilter([]interface{}) (filters.Filter, error) {
	return &grantFilter{
		config: s.config,
	}, nil
}

func providerContext(c OAuthConfig) context.Context {
	return context.WithValue(context.Background(), oauth2.HTTPClient, c.AuthClient)
}

func serverError(ctx filters.FilterContext) {
	ctx.Serve(&http.Response{
		StatusCode: http.StatusInternalServerError,
	})
}

func badRequest(ctx filters.FilterContext) {
	ctx.Serve(&http.Response{
		StatusCode: http.StatusBadRequest,
	})
}

func loginRedirect(ctx filters.FilterContext, config OAuthConfig) {
	loginRedirectWithOverride(ctx, config, "")
}

func loginRedirectWithOverride(ctx filters.FilterContext, config OAuthConfig, originalOverride string) {
	req := ctx.Request()
	redirect, original := config.RedirectURLs(req)

	if originalOverride != "" {
		original = originalOverride
	}

	state, err := config.flowState.createState(original)
	if err != nil {
		log.Errorf("Failed to create login redirect: %v", err)
		serverError(ctx)
		return
	}

	authConfig := config.GetConfig()
	ctx.Serve(&http.Response{
		StatusCode: http.StatusTemporaryRedirect,
		Header: http.Header{
			"Location": []string{authConfig.AuthCodeURL(state, config.GetAuthURLParameters(redirect)...)},
		},
	})
}

func (f *grantFilter) refreshToken(c cookie) (*oauth2.Token, error) {
	// Set the expiry of the token to the past to trigger oauth2.TokenSource
	// to refresh the access token.
	token := &oauth2.Token{
		AccessToken:  c.AccessToken,
		RefreshToken: c.RefreshToken,
		Expiry:       time.Now().Add(-time.Minute),
	}

	ctx := providerContext(f.config)

	// oauth2.TokenSource implements the refresh functionality,
	// we're hijacking it here.
	tokenSource := f.config.GetConfig().TokenSource(ctx, token)
	return tokenSource.Token()
}

func (f *grantFilter) refreshTokenIfRequired(c cookie, ctx filters.FilterContext) (*oauth2.Token, error) {
	canRefresh := c.RefreshToken != ""

	if c.isAccessTokenExpired() {
		if canRefresh {
			token, err := f.refreshToken(c)
			if err == nil {
				// Remember that this token was just successfully refreshed
				// so that we can send  an updated cookie in the response.
				ctx.StateBag()[tokenWasRefreshed] = true
			}
			return token, err
		} else {
			return nil, errExpiredToken
		}
	} else {
		return &oauth2.Token{
			AccessToken:  c.AccessToken,
			TokenType:    "Bearer",
			RefreshToken: c.RefreshToken,
			Expiry:       c.Expiry,
		}, nil
	}
}

func (f *grantFilter) setAccessTokenHeader(req *http.Request, token string) {
	if f.config.AccessTokenHeaderName != "" {
		req.Header.Set(f.config.AccessTokenHeaderName, authHeaderPrefix+token)
	}
}

func (f *grantFilter) createTokenContainer(token *oauth2.Token, tokeninfo map[string]interface{}) (tokenContainer, error) {
	subject := ""
	if f.config.TokeninfoSubjectKey != "" {
		if s, ok := tokeninfo[f.config.TokeninfoSubjectKey].(string); ok {
			subject = s
		} else {
			return tokenContainer{}, fmt.Errorf("tokeninfo subject key '%s' is missing", f.config.TokeninfoSubjectKey)
		}
	}

	tokeninfo["sub"] = subject

	return tokenContainer{
		OAuth2Token: token,
		Subject:     subject,
		Claims:      tokeninfo,
	}, nil
}

func (f *grantFilter) Request(ctx filters.FilterContext) {
	req := ctx.Request()

	c, err := extractCookie(req, f.config)
	if err == http.ErrNoCookie {
		loginRedirect(ctx, f.config)
		return
	}

	token, err := f.refreshTokenIfRequired(*c, ctx)
	if err != nil && c.isAccessTokenExpired() {
		// Refresh failed and we no longer have a valid access token.
		loginRedirect(ctx, f.config)
		return
	}

	tokeninfo, err := f.config.TokeninfoClient.getTokeninfo(token.AccessToken, ctx)
	if err != nil {
		if err != errInvalidToken {
			log.Errorf("Failed to call tokeninfo: %v.", err)
		}
		loginRedirect(ctx, f.config)
		return
	}

	f.setAccessTokenHeader(req, token.AccessToken)

	tokenContainer, err := f.createTokenContainer(token, tokeninfo)
	if err != nil {
		log.Errorf("Failed to create token container: %v.", err)
		loginRedirect(ctx, f.config)
		return
	}

	// Set token in state bag for response Set-Cookie. By piggy-backing
	// on the OIDC token container, we gain downstream compatibility with
	// the oidcClaimsQuery filter.
	ctx.StateBag()[oidcClaimsCacheKey] = tokenContainer

	// Set the tokeninfo also in the tokeninfoCacheKey state bag, so we
	// can reuse e.g. the forwardToken() filter.
	ctx.StateBag()[tokeninfoCacheKey] = tokeninfo
}

func (f *grantFilter) Response(ctx filters.FilterContext) {
	// If the token was refreshed in this request flow,
	// we want to send an updated cookie. If it wasn't, the
	// users will still have their old cookie and we do not
	// need to send it again and this function can exit early.
	didRefresh, ok := ctx.StateBag()[tokenWasRefreshed].(bool)
	if !didRefresh || !ok {
		return
	}

	container, ok := ctx.StateBag()[oidcClaimsCacheKey].(tokenContainer)
	if !ok {
		return
	}

	req := ctx.Request()
	c, err := createCookie(f.config, req.Host, container.OAuth2Token)
	if err != nil {
		log.Errorf("Failed to generate cookie: %v.", err)
		return
	}

	rsp := ctx.Response()
	rsp.Header.Add("Set-Cookie", c.String())
}

repository: kernt/skipper

repo_name: kernt/skipper

gha_license_id: NOASSERTION


text:
#pragma once
#include "chokoeditor.hpp"

/* A list of available tasks
 */

CE_BEGIN_ED_NAMESPACE

#ifdef PLATFORM_WIN
    #define CE_PROG_EXT ".exe"
#else
    #define CE_PROG_EXT
#endif

namespace TaskList {
	const std::string builderDebug = "builder_dbg" CE_PROG_EXT;
	const std::string builderRelease = "builder_rel" CE_PROG_EXT;
}

#undef CE_PROG_EXT

CE_END_ED_NAMESPACE

extension: hpp


text:
package properties

// DO NOT EDIT: This file is autogenerated by running 'go generate'
// It's generated by "github.com/KablamoOSS/kombustion/generate"

// EndpointS3Settings Documentation: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html
type EndpointS3Settings struct {
	BucketFolder            interface{} `yaml:"BucketFolder,omitempty"`
	BucketName              interface{} `yaml:"BucketName,omitempty"`
	CompressionType         interface{} `yaml:"CompressionType,omitempty"`
	CsvDelimiter            interface{} `yaml:"CsvDelimiter,omitempty"`
	CsvRowDelimiter         interface{} `yaml:"CsvRowDelimiter,omitempty"`
	ExternalTableDefinition interface{} `yaml:"ExternalTableDefinition,omitempty"`
	ServiceAccessRoleArn    interface{} `yaml:"ServiceAccessRoleArn,omitempty"`
}

// EndpointS3Settings validation
func (resource EndpointS3Settings) Validate() []error {
	errs := []error{}

	return errs
}


text:
package leetcode

import (
	"fmt"
	"testing"
)

func TestIsValid(t *testing.T) {
	var s = "(("
	fmt.Println(isValid(s))
}

repository: Sitrone/go-snippet

repo_name: Sitrone/go-snippet


text:
################################################################################
#                        Copyright 2018 Ryan M. Richard                        #
#       Licensed under the Apache License, Version 2.0 (the "License");        #
#       you may not use this file except in compliance with the License.       #
#                   You may obtain a copy of the License at                    #
#                                                                              #
#                  http://www.apache.org/licenses/LICENSE-2.0                  #
#                                                                              #
#     Unless required by applicable law or agreed to in writing, software      #
#      distributed under the License is distributed on an "AS IS" BASIS,       #
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
#     See the License for the specific language governing permissions and      #
#                        limitations under the License.                        #
################################################################################

include(cpp_checks) #For _cpp_is_not_empty
include(cpp_print) #For _cpp_debug_print
include(kwargs/kwargs)
function(cpp_option _co_opt _co_default)
    _cpp_is_not_empty(_co_valid ${_co_opt})
    if(_co_valid)
        _cpp_debug_print("${_co_opt} set by user to: ${${_co_opt}}")
    else()
        set(${_co_opt} ${_co_default} PARENT_SCOPE)
        _cpp_debug_print("${_co_opt} set to default: ${_co_default}")
    endif()
endfunction()

function(_cpp_pack_list _cpl_return)
    string(REPLACE ";" "\\;" _cpl_argn "${ARGN}")
    _cpp_contains(_cpl_packed "_cpp_0_cpp_" "${_cpl_argn}")
    if(_cpl_packed)
        message(FATAL_ERROR "List is already packed.")
    endif()
    foreach(_cpl_args ${_cpl_argn})
        string(REPLACE ";" "_cpp_0_cpp_" _cpl_args "${_cpl_args}")
        list(APPEND _cpl_list "${_cpl_args}")
    endforeach()
    set(${_cpl_return} "${_cpl_list}" PARENT_SCOPE)
endfunction()

function(_cpp_unpack_list _cul_return _cul_list)
    string(REPLACE "_cpp_0_cpp_"       ";" _cul_list "${_cul_list}")
    set(${_cul_return} "${_cul_list}" PARENT_SCOPE)
endfunction()

repository: keipertk/CMakePackagingProject

repo_name: keipertk/CMakePackagingProject

extension: cmake


text:
# Copyright 2018-present Samsung Electronics Co., Ltd. and other contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# General variables usable from IoT.js cmake:
# - TARGET_ARCH - the target architecture (as specified during cmake step)
# - TARGET_BOARD - the target board(/device)
# - TARGET_OS - the target operating system
#
# Module related variables usable from IoT.js cmake:
# - MODULE_DIR - the modules root directory
# - MODULE_BINARY_DIR - the build directory for the current module
# - MODULE_LIBS - list of libraries to use during linking (set this)
set(MODULE_NAME "smart_things")
set(MODULE_DIR "src")

set(STACK_DIR "${TARGET_SYSTEMROOT}/../framework/src/st_things/things_stack")
set(THINGS_DIR "${TARGET_SYSTEMROOT}/../framework/include/st_things")

list (APPEND EXTERNAL_INCLUDE_DIR ${STACK_DIR} ${THINGS_DIR})

unset(STACK_DIR)
unset(THINGS_DIR)


text:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
<eagle version="8.2.1">
<drawing>
<settings>
<setting alwaysvectorfont="yes"/>
<setting verticaltext="up"/>
</settings>
<grid distance="0.01" unitdist="inch" unit="inch" style="lines" multiple="1" display="no" altdistance="0.025" altunitdist="inch" altunit="inch"/>
<layers>
<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="2" name="Route2" color="1" fill="3" visible="no" active="no"/>
<layer number="3" name="Route3" color="4" fill="3" visible="no" active="no"/>
<layer number="4" name="Route4" color="1" fill="4" visible="no" active="no"/>
<layer number="5" name="Route5" color="4" fill="4" visible="no" active="no"/>
<layer number="6" name="Route6" color="1" fill="8" visible="no" active="no"/>
<layer number="7" name="Route7" color="4" fill="8" visible="no" active="no"/>
<layer number="8" name="Route8" color="1" fill="2" visible="no" active="no"/>
<layer number="9" name="Route9" color="4" fill="2" visible="no" active="no"/>
<layer number="10" name="Route10" color="1" fill="7" visible="no" active="no"/>
<layer number="11" name="Route11" color="4" fill="7" visible="no" active="no"/>
<layer number="12" name="Route12" color="1" fill="5" visible="no" active="no"/>
<layer number="13" name="Route13" color="4" fill="5" visible="no" active="no"/>
<layer number="14" name="Route14" color="1" fill="6" visible="no" active="no"/>
<layer number="15" name="Route15" color="4" fill="6" visible="no" active="no"/>
<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>
<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>
<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>
<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>
<layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes"/>
<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="29" name="tStop" color="7" fill="3" visible="yes" active="yes"/>
<layer number="30" name="bStop" color="7" fill="6" visible="yes" active="yes"/>
<layer number="31" name="tCream" color="7" fill="4" visible="yes" active="yes"/>
<layer number="32" name="bCream" color="7" fill="5" visible="yes" active="yes"/>
<layer number="33" name="tFinish" color="6" fill="3" visible="yes" active="yes"/>
<layer number="34" name="bFinish" color="6" fill="6" visible="yes" active="yes"/>
<layer number="35" name="tGlue" color="7" fill="4" visible="yes" active="yes"/>
<layer number="36" name="bGlue" color="7" fill="5" visible="yes" active="yes"/>
<layer number="37" name="tTest" color="7" fill="1" visible="yes" active="yes"/>
<layer number="38" name="bTest" color="7" fill="1" visible="yes" active="yes"/>
<layer number="39" name="tKeepout" color="4" fill="11" visible="yes" active="yes"/>
<layer number="40" name="bKeepout" color="1" fill="11" visible="yes" active="yes"/>
<layer number="41" name="tRestrict" color="4" fill="10" visible="yes" active="yes"/>
<layer number="42" name="bRestrict" color="1" fill="10" visible="yes" active="yes"/>
<layer number="43" name="vRestrict" color="2" fill="10" visible="yes" active="yes"/>
<layer number="44" name="Drills" color="7" fill="1" visible="yes" active="yes"/>
<layer number="45" name="Holes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="46" name="Milling" color="3" fill="1" visible="yes" active="yes"/>
<layer number="47" name="Measures" color="7" fill="1" visible="yes" active="yes"/>
<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>
<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>
<layer number="50" name="dxf" color="7" fill="1" visible="no" active="no"/>
<layer number="51" name="tDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="52" name="bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="53" name="tGND_GNDA" color="7" fill="9" visible="no" active="no"/>
<layer number="54" name="bGND_GNDA" color="1" fill="9" visible="no" active="no"/>
<layer number="56" name="wert" color="7" fill="1" visible="no" active="no"/>
<layer number="57" name="tCAD" color="7" fill="1" visible="no" active="no"/>
<layer number="59" name="tCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="60" name="bCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="90" name="Modules" color="5" fill="1" visible="no" active="no"/>
<layer number="91" name="Nets" color="2" fill="1" visible="no" active="no"/>
<layer number="92" name="Busses" color="1" fill="1" visible="no" active="no"/>
<layer number="93" name="Pins" color="2" fill="1" visible="no" active="no"/>
<layer number="94" name="Symbols" color="4" fill="1" visible="no" active="no"/>
<layer number="95" name="Names" color="7" fill="1" visible="no" active="no"/>
<layer number="96" name="Values" color="7" fill="1" visible="no" active="no"/>
<layer number="97" name="Info" color="7" fill="1" visible="no" active="no"/>
<layer number="98" name="Guide" color="6" fill="1" visible="no" active="no"/>
<layer number="99" name="SpiceOrder" color="5" fill="1" visible="no" active="no"/>
<layer number="100" name="Muster" color="7" fill="1" visible="no" active="no"/>
<layer number="101" name="Patch_Top" color="12" fill="4" visible="yes" active="yes"/>
<layer number="102" name="Vscore" color="7" fill="1" visible="yes" active="yes"/>
<layer number="103" name="fp3" color="7" fill="1" visible="yes" active="yes"/>
<layer number="104" name="Name" color="7" fill="1" visible="yes" active="yes"/>
<layer number="105" name="Beschreib" color="9" fill="1" visible="yes" active="yes"/>
<layer number="106" name="BGA-Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="107" name="BD-Top" color="5" fill="1" visible="yes" active="yes"/>
<layer number="108" name="fp8" color="7" fill="1" visible="yes" active="yes"/>
<layer number="109" name="fp9" color="7" fill="1" visible="yes" active="yes"/>
<layer number="110" name="fp0" color="7" fill="1" visible="yes" active="yes"/>
<layer number="111" name="LPC17xx" color="7" fill="1" visible="yes" active="yes"/>
<layer number="112" name="tSilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="113" name="FRNTTEKEN" color="7" fill="1" visible="yes" active="yes"/>
<layer number="114" name="FRNTMAAT1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="115" name="FRNTMAAT2" color="7" fill="1" visible="yes" active="yes"/>
<layer number="116" name="Patch_BOT" color="9" fill="4" visible="yes" active="yes"/>
<layer number="117" name="BACKMAAT1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="118" name="BACKMAAT2" color="7" fill="1" visible="yes" active="yes"/>
<layer number="119" name="KAP_TEKEN" color="7" fill="1" visible="yes" active="yes"/>
<layer number="120" name="KAP_MAAT1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="121" name="_tsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="122" name="_bsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="123" name="tTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="124" name="bTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="125" name="_tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="126" name="_bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="127" name="_tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="128" name="_bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="129" name="Mask" color="7" fill="1" visible="yes" active="yes"/>
<layer number="130" name="SMDSTROOK" color="7" fill="1" visible="yes" active="yes"/>
<layer number="131" name="tAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="132" name="bAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="133" name="BGA_CORE_SUP" color="12" fill="1" visible="yes" active="yes"/>
<layer number="134" name="BGA_GND" color="1" fill="1" visible="yes" active="yes"/>
<layer number="135" name="BGA_NC" color="8" fill="1" visible="yes" active="yes"/>
<layer number="136" name="BGA_DED" color="14" fill="1" visible="yes" active="yes"/>
<layer number="144" name="Drill_legend" color="7" fill="1" visible="yes" active="yes"/>
<layer number="145" name="DrillLegend_01-02" color="7" fill="1" visible="yes" active="yes"/>
<layer number="146" name="DrillLegend_01-15" color="7" fill="1" visible="yes" active="yes"/>
<layer number="147" name="DrillLegend_01-16" color="7" fill="1" visible="yes" active="yes"/>
<layer number="148" name="DrillLegend_01-20" color="7" fill="1" visible="yes" active="yes"/>
<layer number="149" name="DrillLegend_02-15" color="7" fill="1" visible="yes" active="yes"/>
<layer number="150" name="Notes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="151" name="HeatSink" color="7" fill="1" visible="yes" active="yes"/>
<layer number="152" name="_bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="153" name="FabDoc1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="154" name="FabDoc2" color="7" fill="1" visible="yes" active="yes"/>
<layer number="155" name="FabDoc3" color="7" fill="1" visible="yes" active="yes"/>
<layer number="199" name="Contour" color="7" fill="1" visible="yes" active="yes"/>
<layer number="200" name="200bmp" color="1" fill="10" visible="yes" active="yes"/>
<layer number="201" name="201bmp" color="2" fill="1" visible="no" active="no"/>
<layer number="202" name="202bmp" color="3" fill="1" visible="no" active="no"/>
<layer number="203" name="203bmp" color="4" fill="10" visible="yes" active="yes"/>
<layer number="204" name="204bmp" color="5" fill="10" visible="yes" active="yes"/>
<layer number="205" name="205bmp" color="6" fill="10" visible="yes" active="yes"/>
<layer number="206" name="206bmp" color="7" fill="10" visible="yes" active="yes"/>
<layer number="207" name="207bmp" color="8" fill="10" visible="yes" active="yes"/>
<layer number="208" name="208bmp" color="9" fill="10" visible="yes" active="yes"/>
<layer number="209" name="209bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="210" name="210bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="211" name="211bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="212" name="212bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="213" name="213bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="214" name="214bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="215" name="215bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="216" name="216bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="217" name="217bmp" color="18" fill="1" visible="no" active="no"/>
<layer number="218" name="218bmp" color="19" fill="1" visible="no" active="no"/>
<layer number="219" name="219bmp" color="20" fill="1" visible="no" active="no"/>
<layer number="220" name="220bmp" color="21" fill="1" visible="no" active="no"/>
<layer number="221" name="221bmp" color="22" fill="1" visible="no" active="no"/>
<layer number="222" name="222bmp" color="23" fill="1" visible="no" active="no"/>
<layer number="223" name="223bmp" color="24" fill="1" visible="no" active="no"/>
<layer number="224" name="224bmp" color="25" fill="1" visible="no" active="no"/>
<layer number="225" name="225bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="226" name="226bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="227" name="227bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="228" name="228bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="229" name="229bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="230" name="230bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="231" name="231bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="248" name="Housing" color="7" fill="1" visible="yes" active="yes"/>
<layer number="249" name="Edge" color="7" fill="1" visible="yes" active="yes"/>
<layer number="250" name="Descript" color="7" fill="1" visible="no" active="no"/>
<layer number="251" name="SMDround" color="7" fill="1" visible="no" active="no"/>
<layer number="254" name="cooling" color="7" fill="1" visible="yes" active="yes"/>
<layer number="255" name="Accent" color="7" fill="1" visible="yes" active="yes"/>
</layers>
<board>
<plain>
<wire x1="0" y1="10.668" x2="0" y2="99.06" width="0.254" layer="20"/>
<wire x1="0" y1="99.06" x2="37.846" y2="99.06" width="0.254" layer="20"/>
<wire x1="33.401" y1="10.668" x2="33.401" y2="41.763" width="0.127" layer="20"/>
<wire x1="33.401" y1="41.763" x2="-0.051" y2="41.763" width="0.127" layer="20"/>
<wire x1="-0.051" y1="41.763" x2="-0.051" y2="10.668" width="0.127" layer="20"/>
<wire x1="-0.051" y1="10.668" x2="33.401" y2="10.668" width="0.127" layer="20"/>
<hole x="2.286" y="13.843" drill="2.9972"/>
<text x="27.051" y="17.907" size="1.016" layer="21" rot="R180">J6</text>
<text x="27.051" y="27.686" size="1.016" layer="21" rot="R180">J5</text>
<text x="25.908" y="36.068" size="1.016" layer="21" rot="R270">J2</text>
<text x="3.175" y="23.876" size="1.016" layer="21" rot="R90">U1</text>
<text x="14.732" y="23.876" size="1.016" layer="21" rot="R90">U2</text>
<text x="10.541" y="31.623" size="1.016" layer="21" rot="R90">U3</text>
<text x="22.987" y="31.242" size="1.016" layer="25">U4</text>
<text x="14.224" y="30.48" size="1.016" layer="21" rot="R180">U5</text>
<text x="22.225" y="18.542" size="1.016" layer="21" rot="R180">J3</text>
<text x="3.302" y="17.526" size="1.016" layer="21" rot="R270">J4</text>
<text x="30.48" y="26.67" size="1.016" layer="21">C11</text>
<text x="28.448" y="36.83" size="1.27" layer="26" rot="MR270">5V</text>
<text x="28.448" y="40.767" size="1.27" layer="26" rot="MR270">GND</text>
<text x="29.083" y="16.637" size="1.27" layer="26" rot="MR180">GND</text>
<text x="25.146" y="16.637" size="1.27" layer="26" rot="MR180">15V</text>
<text x="29.337" y="33.528" size="1.27" layer="26" rot="MR180">SDA</text>
<text x="25.273" y="33.528" size="1.27" layer="26" rot="MR180">SCL</text>
<wire x1="19.16405" y1="29.54995" x2="19.169909375" y2="29.55221875" width="0.0508" layer="26"/>
<wire x1="19.169909375" y1="29.55221875" x2="19.175709375" y2="29.5545" width="0.0508" layer="26"/>
<wire x1="19.175709375" y1="29.5545" x2="19.181690625" y2="29.5569" width="0.0508" layer="26"/>
<wire x1="19.181690625" y1="29.5569" x2="19.187609375" y2="29.559309375" width="0.0508" layer="26"/>
<wire x1="19.187609375" y1="29.559309375" x2="19.19346875" y2="29.56173125" width="0.0508" layer="26"/>
<wire x1="19.19346875" y1="29.56173125" x2="19.19928125" y2="29.56416875" width="0.0508" layer="26"/>
<wire x1="19.19928125" y1="29.56416875" x2="19.20501875" y2="29.56663125" width="0.0508" layer="26"/>
<wire x1="19.20501875" y1="29.56663125" x2="19.21071875" y2="29.5691" width="0.0508" layer="26"/>
<wire x1="19.21071875" y1="29.5691" x2="19.21635" y2="29.57158125" width="0.0508" layer="26"/>
<wire x1="19.21635" y1="29.57158125" x2="19.22193125" y2="29.57408125" width="0.0508" layer="26"/>
<wire x1="19.22193125" y1="29.57408125" x2="19.22766875" y2="29.576690625" width="0.0508" layer="26"/>
<wire x1="19.22766875" y1="29.576690625" x2="19.233359375" y2="29.579309375" width="0.0508" layer="26"/>
<wire x1="19.233359375" y1="29.579309375" x2="19.239190625" y2="29.582040625" width="0.0508" layer="26"/>
<wire x1="19.239190625" y1="29.582040625" x2="19.244959375" y2="29.58478125" width="0.0508" layer="26"/>
<wire x1="19.244959375" y1="29.58478125" x2="19.25066875" y2="29.587540625" width="0.0508" layer="26"/>
<wire x1="19.25066875" y1="29.587540625" x2="19.25631875" y2="29.5903" width="0.0508" layer="26"/>
<wire x1="19.25631875" y1="29.5903" x2="19.261909375" y2="29.59308125" width="0.0508" layer="26"/>
<wire x1="19.261909375" y1="29.59308125" x2="19.26745" y2="29.59586875" width="0.0508" layer="26"/>
<wire x1="19.26745" y1="29.59586875" x2="19.27291875" y2="29.598659375" width="0.0508" layer="26"/>
<wire x1="19.27291875" y1="29.598659375" x2="19.278340625" y2="29.60146875" width="0.0508" layer="26"/>
<wire x1="19.278340625" y1="29.60146875" x2="19.2839" y2="29.604390625" width="0.0508" layer="26"/>
<wire x1="19.2839" y1="29.604390625" x2="19.28958125" y2="29.607409375" width="0.0508" layer="26"/>
<wire x1="19.28958125" y1="29.607409375" x2="19.2952" y2="29.61045" width="0.0508" layer="26"/>
<wire x1="19.2952" y1="29.61045" x2="19.300759375" y2="29.613490625" width="0.0508" layer="26"/>
<wire x1="19.300759375" y1="29.613490625" x2="19.30625" y2="29.616540625" width="0.0508" layer="26"/>
<wire x1="19.30625" y1="29.616540625" x2="19.31168125" y2="29.619590625" width="0.0508" layer="26"/>
<wire x1="19.31168125" y1="29.619590625" x2="19.317059375" y2="29.62265" width="0.0508" layer="26"/>
<wire x1="19.317059375" y1="29.62265" x2="19.32236875" y2="29.62571875" width="0.0508" layer="26"/>
<wire x1="19.32236875" y1="29.62571875" x2="19.32761875" y2="29.628790625" width="0.0508" layer="26"/>
<wire x1="19.32761875" y1="29.628790625" x2="19.333159375" y2="29.63206875" width="0.0508" layer="26"/>
<wire x1="19.333159375" y1="29.63206875" x2="19.338640625" y2="29.635359375" width="0.0508" layer="26"/>
<wire x1="19.338640625" y1="29.635359375" x2="19.34405" y2="29.63865" width="0.0508" layer="26"/>
<wire x1="19.34405" y1="29.63865" x2="19.349390625" y2="29.641940625" width="0.0508" layer="26"/>
<wire x1="19.349390625" y1="29.641940625" x2="19.35468125" y2="29.645240625" width="0.0508" layer="26"/>
<wire x1="19.35468125" y1="29.645240625" x2="19.3599" y2="29.648540625" width="0.0508" layer="26"/>
<wire x1="19.3599" y1="29.648540625" x2="19.365059375" y2="29.65183125" width="0.0508" layer="26"/>
<wire x1="19.365059375" y1="29.65183125" x2="19.37046875" y2="29.655340625" width="0.0508" layer="26"/>
<wire x1="19.37046875" y1="29.655340625" x2="19.37581875" y2="29.65885" width="0.0508" layer="26"/>
<wire x1="19.37581875" y1="29.65885" x2="19.3811" y2="29.66235" width="0.0508" layer="26"/>
<wire x1="19.3811" y1="29.66235" x2="19.386309375" y2="29.665859375" width="0.0508" layer="26"/>
<wire x1="19.386309375" y1="29.665859375" x2="19.391459375" y2="29.669359375" width="0.0508" layer="26"/>
<wire x1="19.391459375" y1="29.669359375" x2="19.396540625" y2="29.672859375" width="0.0508" layer="26"/>
<wire x1="19.396540625" y1="29.672859375" x2="19.401559375" y2="29.676359375" width="0.0508" layer="26"/>
<wire x1="19.401559375" y1="29.676359375" x2="19.406809375" y2="29.680059375" width="0.0508" layer="26"/>
<wire x1="19.406809375" y1="29.680059375" x2="19.411990625" y2="29.683759375" width="0.0508" layer="26"/>
<wire x1="19.411990625" y1="29.683759375" x2="19.4171" y2="29.68745" width="0.0508" layer="26"/>
<wire x1="19.4171" y1="29.68745" x2="19.422140625" y2="29.691140625" width="0.0508" layer="26"/>
<wire x1="19.422140625" y1="29.691140625" x2="19.42711875" y2="29.69481875" width="0.0508" layer="26"/>
<wire x1="19.42711875" y1="29.69481875" x2="19.43203125" y2="29.698490625" width="0.0508" layer="26"/>
<wire x1="19.43203125" y1="29.698490625" x2="19.437140625" y2="29.702359375" width="0.0508" layer="26"/>
<wire x1="19.437140625" y1="29.702359375" x2="19.44218125" y2="29.70623125" width="0.0508" layer="26"/>
<wire x1="19.44218125" y1="29.70623125" x2="19.447159375" y2="29.71008125" width="0.0508" layer="26"/>
<wire x1="19.447159375" y1="29.71008125" x2="19.452059375" y2="29.71391875" width="0.0508" layer="26"/>
<wire x1="19.452059375" y1="29.71391875" x2="19.456890625" y2="29.717759375" width="0.0508" layer="26"/>
<wire x1="19.456890625" y1="29.717759375" x2="19.461909375" y2="29.721790625" width="0.0508" layer="26"/>
<wire x1="19.461909375" y1="29.721790625" x2="19.466859375" y2="29.7258" width="0.0508" layer="26"/>
<wire x1="19.466859375" y1="29.7258" x2="19.47173125" y2="29.7298" width="0.0508" layer="26"/>
<wire x1="19.47173125" y1="29.7298" x2="19.476540625" y2="29.733790625" width="0.0508" layer="26"/>
<wire x1="19.476540625" y1="29.733790625" x2="19.48126875" y2="29.737759375" width="0.0508" layer="26"/>
<wire x1="19.48126875" y1="29.737759375" x2="19.48593125" y2="29.74171875" width="0.0508" layer="26"/>
<wire x1="19.48593125" y1="29.74171875" x2="19.490759375" y2="29.745859375" width="0.0508" layer="26"/>
<wire x1="19.490759375" y1="29.745859375" x2="19.495509375" y2="29.749990625" width="0.0508" layer="26"/>
<wire x1="19.495509375" y1="29.749990625" x2="19.500190625" y2="29.7541" width="0.0508" layer="26"/>
<wire x1="19.500190625" y1="29.7541" x2="19.50501875" y2="29.75838125" width="0.0508" layer="26"/>
<wire x1="19.50501875" y1="29.75838125" x2="19.50976875" y2="29.76265" width="0.0508" layer="26"/>
<wire x1="19.50976875" y1="29.76265" x2="19.514440625" y2="29.7669" width="0.0508" layer="26"/>
<wire x1="19.514440625" y1="29.7669" x2="19.519040625" y2="29.77111875" width="0.0508" layer="26"/>
<wire x1="19.519040625" y1="29.77111875" x2="19.52356875" y2="29.77533125" width="0.0508" layer="26"/>
<wire x1="19.52356875" y1="29.77533125" x2="19.52803125" y2="29.779509375" width="0.0508" layer="26"/>
<wire x1="19.52803125" y1="29.779509375" x2="19.532609375" y2="29.783859375" width="0.0508" layer="26"/>
<wire x1="19.532609375" y1="29.783859375" x2="19.53711875" y2="29.78818125" width="0.0508" layer="26"/>
<wire x1="19.53711875" y1="29.78818125" x2="19.54175" y2="29.79266875" width="0.0508" layer="26"/>
<wire x1="19.54175" y1="29.79266875" x2="19.5463" y2="29.79713125" width="0.0508" layer="26"/>
<wire x1="19.5463" y1="29.79713125" x2="19.55076875" y2="29.801559375" width="0.0508" layer="26"/>
<wire x1="19.55076875" y1="29.801559375" x2="19.555159375" y2="29.805959375" width="0.0508" layer="26"/>
<wire x1="19.555159375" y1="29.805959375" x2="19.55948125" y2="29.810340625" width="0.0508" layer="26"/>
<wire x1="19.55948125" y1="29.810340625" x2="19.5639" y2="29.814859375" width="0.0508" layer="26"/>
<wire x1="19.5639" y1="29.814859375" x2="19.568240625" y2="29.819359375" width="0.0508" layer="26"/>
<wire x1="19.568240625" y1="29.819359375" x2="19.57268125" y2="29.824" width="0.0508" layer="26"/>
<wire x1="19.57268125" y1="29.824" x2="19.57703125" y2="29.828609375" width="0.0508" layer="26"/>
<wire x1="19.57703125" y1="29.828609375" x2="19.5813" y2="29.83318125" width="0.0508" layer="26"/>
<wire x1="19.5813" y1="29.83318125" x2="19.5855" y2="29.837709375" width="0.0508" layer="26"/>
<wire x1="19.5855" y1="29.837709375" x2="19.58961875" y2="29.842209375" width="0.0508" layer="26"/>
<wire x1="19.58961875" y1="29.842209375" x2="19.593809375" y2="29.84685" width="0.0508" layer="26"/>
<wire x1="19.593809375" y1="29.84685" x2="19.59808125" y2="29.85161875" width="0.0508" layer="26"/>
<wire x1="19.59808125" y1="29.85161875" x2="19.60226875" y2="29.856340625" width="0.0508" layer="26"/>
<wire x1="19.60226875" y1="29.856340625" x2="19.60636875" y2="29.86101875" width="0.0508" layer="26"/>
<wire x1="19.60636875" y1="29.86101875" x2="19.6104" y2="29.865659375" width="0.0508" layer="26"/>
<wire x1="19.6104" y1="29.865659375" x2="19.61448125" y2="29.87041875" width="0.0508" layer="26"/>
<wire x1="19.61448125" y1="29.87041875" x2="19.61861875" y2="29.8753" width="0.0508" layer="26"/>
<wire x1="19.61861875" y1="29.8753" x2="19.62268125" y2="29.88013125" width="0.0508" layer="26"/>
<wire x1="19.62268125" y1="29.88013125" x2="19.62665" y2="29.884909375" width="0.0508" layer="26"/>
<wire x1="19.62665" y1="29.884909375" x2="19.63053125" y2="29.889640625" width="0.0508" layer="26"/>
<wire x1="19.63053125" y1="29.889640625" x2="19.634590625" y2="29.89463125" width="0.0508" layer="26"/>
<wire x1="19.634590625" y1="29.89463125" x2="19.638559375" y2="29.89956875" width="0.0508" layer="26"/>
<wire x1="19.638559375" y1="29.89956875" x2="19.642440625" y2="29.90445" width="0.0508" layer="26"/>
<wire x1="19.642440625" y1="29.90445" x2="19.646240625" y2="29.90926875" width="0.0508" layer="26"/>
<wire x1="19.646240625" y1="29.90926875" x2="19.650190625" y2="29.914340625" width="0.0508" layer="26"/>
<wire x1="19.650190625" y1="29.914340625" x2="19.654040625" y2="29.919340625" width="0.0508" layer="26"/>
<wire x1="19.654040625" y1="29.919340625" x2="19.6578" y2="29.92428125" width="0.0508" layer="26"/>
<wire x1="19.6578" y1="29.92428125" x2="19.66148125" y2="29.929159375" width="0.0508" layer="26"/>
<wire x1="19.66148125" y1="29.929159375" x2="19.66528125" y2="29.934259375" width="0.0508" layer="26"/>
<wire x1="19.66528125" y1="29.934259375" x2="19.668990625" y2="29.939290625" width="0.0508" layer="26"/>
<wire x1="19.668990625" y1="29.939290625" x2="19.672609375" y2="29.944259375" width="0.0508" layer="26"/>
<wire x1="19.672609375" y1="29.944259375" x2="19.676340625" y2="29.94941875" width="0.0508" layer="26"/>
<wire x1="19.676340625" y1="29.94941875" x2="19.67996875" y2="29.954509375" width="0.0508" layer="26"/>
<wire x1="19.67996875" y1="29.954509375" x2="19.6837" y2="29.959790625" width="0.0508" layer="26"/>
<wire x1="19.6837" y1="29.959790625" x2="19.68731875" y2="29.96498125" width="0.0508" layer="26"/>
<wire x1="19.68731875" y1="29.96498125" x2="19.69085" y2="29.970090625" width="0.0508" layer="26"/>
<wire x1="19.69085" y1="29.970090625" x2="19.69428125" y2="29.97511875" width="0.0508" layer="26"/>
<wire x1="19.69428125" y1="29.97511875" x2="19.6978" y2="29.98031875" width="0.0508" layer="26"/>
<wire x1="19.6978" y1="29.98031875" x2="19.70136875" y2="29.98568125" width="0.0508" layer="26"/>
<wire x1="19.70136875" y1="29.98568125" x2="19.704840625" y2="29.99093125" width="0.0508" layer="26"/>
<wire x1="19.704840625" y1="29.99093125" x2="19.708209375" y2="29.996090625" width="0.0508" layer="26"/>
<wire x1="19.708209375" y1="29.996090625" x2="19.711640625" y2="30.001390625" width="0.0508" layer="26"/>
<wire x1="19.711640625" y1="30.001390625" x2="19.7151" y2="30.00681875" width="0.0508" layer="26"/>
<wire x1="19.7151" y1="30.00681875" x2="19.71845" y2="30.012140625" width="0.0508" layer="26"/>
<wire x1="19.71845" y1="30.012140625" x2="19.721709375" y2="30.017340625" width="0.0508" layer="26"/>
<wire x1="19.721709375" y1="30.017340625" x2="19.724990625" y2="30.022659375" width="0.0508" layer="26"/>
<wire x1="19.724990625" y1="30.022659375" x2="19.728290625" y2="30.02806875" width="0.0508" layer="26"/>
<wire x1="19.728290625" y1="30.02806875" x2="19.73148125" y2="30.033359375" width="0.0508" layer="26"/>
<wire x1="19.73148125" y1="30.033359375" x2="19.73468125" y2="30.038740625" width="0.0508" layer="26"/>
<wire x1="19.73468125" y1="30.038740625" x2="19.737890625" y2="30.04418125" width="0.0508" layer="26"/>
<wire x1="19.737890625" y1="30.04418125" x2="19.740990625" y2="30.049490625" width="0.0508" layer="26"/>
<wire x1="19.740990625" y1="30.049490625" x2="19.744190625" y2="30.055040625" width="0.0508" layer="26"/>
<wire x1="19.744190625" y1="30.055040625" x2="19.747259375" y2="30.06045" width="0.0508" layer="26"/>
<wire x1="19.747259375" y1="30.06045" x2="19.75041875" y2="30.066059375" width="0.0508" layer="26"/>
<wire x1="19.75041875" y1="30.066059375" x2="19.753459375" y2="30.07151875" width="0.0508" layer="26"/>
<wire x1="19.753459375" y1="30.07151875" x2="19.75655" y2="30.07715" width="0.0508" layer="26"/>
<wire x1="19.75655" y1="30.07715" x2="19.759509375" y2="30.08261875" width="0.0508" layer="26"/>
<wire x1="19.759509375" y1="30.08261875" x2="19.76251875" y2="30.08821875" width="0.0508" layer="26"/>
<wire x1="19.76251875" y1="30.08821875" x2="19.7654" y2="30.09365" width="0.0508" layer="26"/>
<wire x1="19.7654" y1="30.09365" x2="19.7683" y2="30.099190625" width="0.0508" layer="26"/>
<wire x1="19.7683" y1="30.099190625" x2="19.771209375" y2="30.10483125" width="0.0508" layer="26"/>
<wire x1="19.771209375" y1="30.10483125" x2="19.77398125" y2="30.110259375" width="0.0508" layer="26"/>
<wire x1="19.77398125" y1="30.110259375" x2="19.776890625" y2="30.116009375" width="0.0508" layer="26"/>
<wire x1="19.776890625" y1="30.116009375" x2="19.779640625" y2="30.12153125" width="0.0508" layer="26"/>
<wire x1="19.779640625" y1="30.12153125" x2="19.78248125" y2="30.12731875" width="0.0508" layer="26"/>
<wire x1="19.78248125" y1="30.12731875" x2="19.78516875" y2="30.132840625" width="0.0508" layer="26"/>
<wire x1="19.78516875" y1="30.132840625" x2="19.787909375" y2="30.138559375" width="0.0508" layer="26"/>
<wire x1="19.787909375" y1="30.138559375" x2="19.790590625" y2="30.14421875" width="0.0508" layer="26"/>
<wire x1="19.790590625" y1="30.14421875" x2="19.7932" y2="30.14978125" width="0.0508" layer="26"/>
<wire x1="19.7932" y1="30.14978125" x2="19.795809375" y2="30.155440625" width="0.0508" layer="26"/>
<wire x1="19.795809375" y1="30.155440625" x2="19.7984" y2="30.16113125" width="0.0508" layer="26"/>
<wire x1="19.7984" y1="30.16113125" x2="19.800959375" y2="30.166809375" width="0.0508" layer="26"/>
<wire x1="19.800959375" y1="30.166809375" x2="19.803459375" y2="30.172440625" width="0.0508" layer="26"/>
<wire x1="19.803459375" y1="30.172440625" x2="19.80601875" y2="30.17828125" width="0.0508" layer="26"/>
<wire x1="19.80601875" y1="30.17828125" x2="19.80858125" y2="30.184209375" width="0.0508" layer="26"/>
<wire x1="19.80858125" y1="30.184209375" x2="19.811109375" y2="30.19013125" width="0.0508" layer="26"/>
<wire x1="19.811109375" y1="30.19013125" x2="19.813559375" y2="30.195959375" width="0.0508" layer="26"/>
<wire x1="19.813559375" y1="30.195959375" x2="19.8159" y2="30.20161875" width="0.0508" layer="26"/>
<wire x1="19.8159" y1="30.20161875" x2="19.818259375" y2="30.207390625" width="0.0508" layer="26"/>
<wire x1="19.818259375" y1="30.207390625" x2="19.820559375" y2="30.21308125" width="0.0508" layer="26"/>
<wire x1="19.820559375" y1="30.21308125" x2="19.822840625" y2="30.2188" width="0.0508" layer="26"/>
<wire x1="19.822840625" y1="30.2188" x2="19.825159375" y2="30.224740625" width="0.0508" layer="26"/>
<wire x1="19.825159375" y1="30.224740625" x2="19.82741875" y2="30.23056875" width="0.0508" layer="26"/>
<wire x1="19.82741875" y1="30.23056875" x2="19.829609375" y2="30.23631875" width="0.0508" layer="26"/>
<wire x1="19.829609375" y1="30.23631875" x2="19.83183125" y2="30.24223125" width="0.0508" layer="26"/>
<wire x1="19.83183125" y1="30.24223125" x2="19.83401875" y2="30.248140625" width="0.0508" layer="26"/>
<wire x1="19.83401875" y1="30.248140625" x2="19.836109375" y2="30.253890625" width="0.0508" layer="26"/>
<wire x1="19.836109375" y1="30.253890625" x2="19.83825" y2="30.25983125" width="0.0508" layer="26"/>
<wire x1="19.83825" y1="30.25983125" x2="19.840340625" y2="30.26575" width="0.0508" layer="26"/>
<wire x1="19.840340625" y1="30.26575" x2="19.842390625" y2="30.271640625" width="0.0508" layer="26"/>
<wire x1="19.842390625" y1="30.271640625" x2="19.84446875" y2="30.277709375" width="0.0508" layer="26"/>
<wire x1="19.84446875" y1="30.277709375" x2="19.846509375" y2="30.283759375" width="0.0508" layer="26"/>
<wire x1="19.846509375" y1="30.283759375" x2="19.848509375" y2="30.28978125" width="0.0508" layer="26"/>
<wire x1="19.848509375" y1="30.28978125" x2="19.850459375" y2="30.29576875" width="0.0508" layer="26"/>
<wire x1="19.850459375" y1="30.29576875" x2="19.85236875" y2="30.30173125" width="0.0508" layer="26"/>
<wire x1="19.85236875" y1="30.30173125" x2="19.854240625" y2="30.307659375" width="0.0508" layer="26"/>
<wire x1="19.854240625" y1="30.307659375" x2="19.85608125" y2="30.313559375" width="0.0508" layer="26"/>
<wire x1="19.85608125" y1="30.313559375" x2="19.85786875" y2="30.31943125" width="0.0508" layer="26"/>
<wire x1="19.85786875" y1="30.31943125" x2="19.85961875" y2="30.32526875" width="0.0508" layer="26"/>
<wire x1="19.85961875" y1="30.32526875" x2="19.8614" y2="30.331290625" width="0.0508" layer="26"/>
<wire x1="19.8614" y1="30.331290625" x2="19.863190625" y2="30.33748125" width="0.0508" layer="26"/>
<wire x1="19.863190625" y1="30.33748125" x2="19.864940625" y2="30.343640625" width="0.0508" layer="26"/>
<wire x1="19.864940625" y1="30.343640625" x2="19.86665" y2="30.349759375" width="0.0508" layer="26"/>
<wire x1="19.86665" y1="30.349759375" x2="19.86831875" y2="30.35585" width="0.0508" layer="26"/>
<wire x1="19.86831875" y1="30.35585" x2="19.869940625" y2="30.361909375" width="0.0508" layer="26"/>
<wire x1="19.869940625" y1="30.361909375" x2="19.87153125" y2="30.36793125" width="0.0508" layer="26"/>
<wire x1="19.87153125" y1="30.36793125" x2="19.87308125" y2="30.373909375" width="0.0508" layer="26"/>
<wire x1="19.87308125" y1="30.373909375" x2="19.87458125" y2="30.379859375" width="0.0508" layer="26"/>
<wire x1="19.87458125" y1="30.379859375" x2="19.87605" y2="30.38578125" width="0.0508" layer="26"/>
<wire x1="19.87605" y1="30.38578125" x2="19.87758125" y2="30.39205" width="0.0508" layer="26"/>
<wire x1="19.87758125" y1="30.39205" x2="19.87906875" y2="30.39828125" width="0.0508" layer="26"/>
<wire x1="19.87906875" y1="30.39828125" x2="19.880509375" y2="30.40448125" width="0.0508" layer="26"/>
<wire x1="19.880509375" y1="30.40448125" x2="19.881909375" y2="30.41063125" width="0.0508" layer="26"/>
<wire x1="19.881909375" y1="30.41063125" x2="19.88328125" y2="30.41675" width="0.0508" layer="26"/>
<wire x1="19.88328125" y1="30.41675" x2="19.8846" y2="30.42281875" width="0.0508" layer="26"/>
<wire x1="19.8846" y1="30.42281875" x2="19.885890625" y2="30.428859375" width="0.0508" layer="26"/>
<wire x1="19.885890625" y1="30.428859375" x2="19.887140625" y2="30.434859375" width="0.0508" layer="26"/>
<wire x1="19.887140625" y1="30.434859375" x2="19.88841875" y2="30.441190625" width="0.0508" layer="26"/>
<wire x1="19.88841875" y1="30.441190625" x2="19.88966875" y2="30.44748125" width="0.0508" layer="26"/>
<wire x1="19.88966875" y1="30.44748125" x2="19.89088125" y2="30.45371875" width="0.0508" layer="26"/>
<wire x1="19.89088125" y1="30.45371875" x2="19.892040625" y2="30.45991875" width="0.0508" layer="26"/>
<wire x1="19.892040625" y1="30.45991875" x2="19.89316875" y2="30.46606875" width="0.0508" layer="26"/>
<wire x1="19.89316875" y1="30.46606875" x2="19.894259375" y2="30.472190625" width="0.0508" layer="26"/>
<wire x1="19.894259375" y1="30.472190625" x2="19.895309375" y2="30.47825" width="0.0508" layer="26"/>
<wire x1="19.895309375" y1="30.47825" x2="19.89633125" y2="30.48428125" width="0.0508" layer="26"/>
<wire x1="19.89633125" y1="30.48428125" x2="19.897359375" y2="30.490609375" width="0.0508" layer="26"/>
<wire x1="19.897359375" y1="30.490609375" x2="19.898359375" y2="30.4969" width="0.0508" layer="26"/>
<wire x1="19.898359375" y1="30.4969" x2="19.89931875" y2="30.503140625" width="0.0508" layer="26"/>
<wire x1="19.89931875" y1="30.503140625" x2="19.900240625" y2="30.50933125" width="0.0508" layer="26"/>
<wire x1="19.900240625" y1="30.50933125" x2="19.90113125" y2="30.51546875" width="0.0508" layer="26"/>
<wire x1="19.90113125" y1="30.51546875" x2="19.90198125" y2="30.521559375" width="0.0508" layer="26"/>
<wire x1="19.90198125" y1="30.521559375" x2="19.902790625" y2="30.527609375" width="0.0508" layer="26"/>
<wire x1="19.902790625" y1="30.527609375" x2="19.90361875" y2="30.533940625" width="0.0508" layer="26"/>
<wire x1="19.90361875" y1="30.533940625" x2="19.9044" y2="30.54021875" width="0.0508" layer="26"/>
<wire x1="19.9044" y1="30.54021875" x2="19.90515" y2="30.54645" width="0.0508" layer="26"/>
<wire x1="19.90515" y1="30.54645" x2="19.905859375" y2="30.55263125" width="0.0508" layer="26"/>
<wire x1="19.905859375" y1="30.55263125" x2="19.906540625" y2="30.55875" width="0.0508" layer="26"/>
<wire x1="19.906540625" y1="30.55875" x2="19.907209375" y2="30.56515" width="0.0508" layer="26"/>
<wire x1="19.907209375" y1="30.56515" x2="19.90785" y2="30.57148125" width="0.0508" layer="26"/>
<wire x1="19.90785" y1="30.57148125" x2="19.908459375" y2="30.577759375" width="0.0508" layer="26"/>
<wire x1="19.908459375" y1="30.577759375" x2="19.90901875" y2="30.583990625" width="0.0508" layer="26"/>
<wire x1="19.90901875" y1="30.583990625" x2="19.909559375" y2="30.59015" width="0.0508" layer="26"/>
<wire x1="19.909559375" y1="30.59015" x2="19.910059375" y2="30.59626875" width="0.0508" layer="26"/>
<wire x1="19.910059375" y1="30.59626875" x2="19.91055" y2="30.60263125" width="0.0508" layer="26"/>
<wire x1="19.91055" y1="30.60263125" x2="19.911" y2="30.60893125" width="0.0508" layer="26"/>
<wire x1="19.911" y1="30.60893125" x2="19.91141875" y2="30.61516875" width="0.0508" layer="26"/>
<wire x1="19.91141875" y1="30.61516875" x2="19.911809375" y2="30.62135" width="0.0508" layer="26"/>
<wire x1="19.911809375" y1="30.62135" x2="19.91218125" y2="30.62776875" width="0.0508" layer="26"/>
<wire x1="19.91218125" y1="30.62776875" x2="19.91251875" y2="30.63411875" width="0.0508" layer="26"/>
<wire x1="19.91251875" y1="30.63411875" x2="19.91281875" y2="30.6404" width="0.0508" layer="26"/>
<wire x1="19.91281875" y1="30.6404" x2="19.913090625" y2="30.64663125" width="0.0508" layer="26"/>
<wire x1="19.913090625" y1="30.64663125" x2="19.91333125" y2="30.65278125" width="0.0508" layer="26"/>
<wire x1="19.91333125" y1="30.65278125" x2="19.913540625" y2="30.65888125" width="0.0508" layer="26"/>
<wire x1="19.913540625" y1="30.65888125" x2="19.91371875" y2="30.665190625" width="0.0508" layer="26"/>
<wire x1="19.91371875" y1="30.665190625" x2="19.91388125" y2="30.67143125" width="0.0508" layer="26"/>
<wire x1="19.91388125" y1="30.67143125" x2="19.914" y2="30.67788125" width="0.0508" layer="26"/>
<wire x1="19.914" y1="30.67788125" x2="19.9141" y2="30.68425" width="0.0508" layer="26"/>
<wire x1="19.9141" y1="30.68425" x2="19.914159375" y2="30.69055" width="0.0508" layer="26"/>
<wire x1="19.914159375" y1="30.69055" x2="19.9142" y2="30.69678125" width="0.0508" layer="26"/>
<wire x1="19.9142" y1="30.69678125" x2="19.9142" y2="30.702940625" width="0.0508" layer="26"/>
<wire x1="19.9142" y1="30.702940625" x2="19.91418125" y2="30.70903125" width="0.0508" layer="26"/>
<wire x1="19.91418125" y1="30.70903125" x2="19.91413125" y2="30.7153" width="0.0508" layer="26"/>
<wire x1="19.91413125" y1="30.7153" x2="19.914040625" y2="30.72175" width="0.0508" layer="26"/>
<wire x1="19.914040625" y1="30.72175" x2="19.91391875" y2="30.72811875" width="0.0508" layer="26"/>
<wire x1="19.91391875" y1="30.72811875" x2="19.91378125" y2="30.734409375" width="0.0508" layer="26"/>
<wire x1="19.91378125" y1="30.734409375" x2="19.913609375" y2="30.74061875" width="0.0508" layer="26"/>
<wire x1="19.913609375" y1="30.74061875" x2="19.913409375" y2="30.74675" width="0.0508" layer="26"/>
<wire x1="19.913409375" y1="30.74675" x2="19.91316875" y2="30.753040625" width="0.0508" layer="26"/>
<wire x1="19.91316875" y1="30.753040625" x2="19.9129" y2="30.759490625" width="0.0508" layer="26"/>
<wire x1="19.9129" y1="30.759490625" x2="19.912609375" y2="30.765840625" width="0.0508" layer="26"/>
<wire x1="19.912609375" y1="30.765840625" x2="19.91228125" y2="30.772109375" width="0.0508" layer="26"/>
<wire x1="19.91228125" y1="30.772109375" x2="19.91193125" y2="30.7783" width="0.0508" layer="26"/>
<wire x1="19.91193125" y1="30.7783" x2="19.911559375" y2="30.7844" width="0.0508" layer="26"/>
<wire x1="19.911559375" y1="30.7844" x2="19.91115" y2="30.79063125" width="0.0508" layer="26"/>
<wire x1="19.91115" y1="30.79063125" x2="19.9107" y2="30.796990625" width="0.0508" layer="26"/>
<wire x1="19.9107" y1="30.796990625" x2="19.91023125" y2="30.803259375" width="0.0508" layer="26"/>
<wire x1="19.91023125" y1="30.803259375" x2="19.90973125" y2="30.809440625" width="0.0508" layer="26"/>
<wire x1="19.90973125" y1="30.809440625" x2="19.90921875" y2="30.81553125" width="0.0508" layer="26"/>
<wire x1="19.90921875" y1="30.81553125" x2="19.908640625" y2="30.82193125" width="0.0508" layer="26"/>
<wire x1="19.908640625" y1="30.82193125" x2="19.90805" y2="30.82823125" width="0.0508" layer="26"/>
<wire x1="19.90805" y1="30.82823125" x2="19.90743125" y2="30.83443125" width="0.0508" layer="26"/>
<wire x1="19.90743125" y1="30.83443125" x2="19.9068" y2="30.840540625" width="0.0508" layer="26"/>
<wire x1="19.9068" y1="30.840540625" x2="19.9061" y2="30.84691875" width="0.0508" layer="26"/>
<wire x1="19.9061" y1="30.84691875" x2="19.905390625" y2="30.8532" width="0.0508" layer="26"/>
<wire x1="19.905390625" y1="30.8532" x2="19.90465" y2="30.85938125" width="0.0508" layer="26"/>
<wire x1="19.90465" y1="30.85938125" x2="19.9039" y2="30.86545" width="0.0508" layer="26"/>
<wire x1="19.9039" y1="30.86545" x2="19.903090625" y2="30.87178125" width="0.0508" layer="26"/>
<wire x1="19.903090625" y1="30.87178125" x2="19.90226875" y2="30.877990625" width="0.0508" layer="26"/>
<wire x1="19.90226875" y1="30.877990625" x2="19.90141875" y2="30.8841" width="0.0508" layer="26"/>
<wire x1="19.90141875" y1="30.8841" x2="19.90051875" y2="30.89043125" width="0.0508" layer="26"/>
<wire x1="19.90051875" y1="30.89043125" x2="19.8996" y2="30.896640625" width="0.0508" layer="26"/>
<wire x1="19.8996" y1="30.896640625" x2="19.89866875" y2="30.90273125" width="0.0508" layer="26"/>
<wire x1="19.89866875" y1="30.90273125" x2="19.89768125" y2="30.90903125" width="0.0508" layer="26"/>
<wire x1="19.89768125" y1="30.90903125" x2="19.89668125" y2="30.9152" width="0.0508" layer="26"/>
<wire x1="19.89668125" y1="30.9152" x2="19.89566875" y2="30.92125" width="0.0508" layer="26"/>
<wire x1="19.89566875" y1="30.92125" x2="19.8946" y2="30.92748125" width="0.0508" layer="26"/>
<wire x1="19.8946" y1="30.92748125" x2="19.89351875" y2="30.93358125" width="0.0508" layer="26"/>
<wire x1="19.89351875" y1="30.93358125" x2="19.89238125" y2="30.939840625" width="0.0508" layer="26"/>
<wire x1="19.89238125" y1="30.939840625" x2="19.89123125" y2="30.945959375" width="0.0508" layer="26"/>
<wire x1="19.89123125" y1="30.945959375" x2="19.890090625" y2="30.95195" width="0.0508" layer="26"/>
<wire x1="19.890090625" y1="30.95195" x2="19.88888125" y2="30.95806875" width="0.0508" layer="26"/>
<wire x1="19.88888125" y1="30.95806875" x2="19.88761875" y2="30.96431875" width="0.0508" layer="26"/>
<wire x1="19.88761875" y1="30.96431875" x2="19.886359375" y2="30.97041875" width="0.0508" layer="26"/>
<wire x1="19.886359375" y1="30.97041875" x2="19.88505" y2="30.97661875" width="0.0508" layer="26"/>
<wire x1="19.88505" y1="30.97661875" x2="19.883690625" y2="30.982909375" width="0.0508" layer="26"/>
<wire x1="19.883690625" y1="30.982909375" x2="19.88233125" y2="30.989040625" width="0.0508" layer="26"/>
<wire x1="19.88233125" y1="30.989040625" x2="19.88098125" y2="30.995009375" width="0.0508" layer="26"/>
<wire x1="19.88098125" y1="30.995009375" x2="19.87953125" y2="31.00126875" width="0.0508" layer="26"/>
<wire x1="19.87953125" y1="31.00126875" x2="19.878090625" y2="31.007359375" width="0.0508" layer="26"/>
<wire x1="19.878090625" y1="31.007359375" x2="19.876659375" y2="31.01328125" width="0.0508" layer="26"/>
<wire x1="19.876659375" y1="31.01328125" x2="19.87513125" y2="31.01945" width="0.0508" layer="26"/>
<wire x1="19.87513125" y1="31.01945" x2="19.87363125" y2="31.02543125" width="0.0508" layer="26"/>
<wire x1="19.87363125" y1="31.02543125" x2="19.872040625" y2="31.03163125" width="0.0508" layer="26"/>
<wire x1="19.872040625" y1="31.03163125" x2="19.870459375" y2="31.03761875" width="0.0508" layer="26"/>
<wire x1="19.870459375" y1="31.03761875" x2="19.86881875" y2="31.043790625" width="0.0508" layer="26"/>
<wire x1="19.86881875" y1="31.043790625" x2="19.867190625" y2="31.04975" width="0.0508" layer="26"/>
<wire x1="19.867190625" y1="31.04975" x2="19.8655" y2="31.05585" width="0.0508" layer="26"/>
<wire x1="19.8655" y1="31.05585" x2="19.863840625" y2="31.06173125" width="0.0508" layer="26"/>
<wire x1="19.863840625" y1="31.06173125" x2="19.86211875" y2="31.06771875" width="0.0508" layer="26"/>
<wire x1="19.86211875" y1="31.06771875" x2="19.860340625" y2="31.073790625" width="0.0508" layer="26"/>
<wire x1="19.860340625" y1="31.073790625" x2="19.85851875" y2="31.0799" width="0.0508" layer="26"/>
<wire x1="19.85851875" y1="31.0799" x2="19.856659375" y2="31.086040625" width="0.0508" layer="26"/>
<wire x1="19.856659375" y1="31.086040625" x2="19.85485" y2="31.091909375" width="0.0508" layer="26"/>
<wire x1="19.85485" y1="31.091909375" x2="19.85293125" y2="31.098040625" width="0.0508" layer="26"/>
<wire x1="19.85293125" y1="31.098040625" x2="19.85106875" y2="31.10386875" width="0.0508" layer="26"/>
<wire x1="19.85106875" y1="31.10386875" x2="19.849109375" y2="31.1099" width="0.0508" layer="26"/>
<wire x1="19.849109375" y1="31.1099" x2="19.847159375" y2="31.11583125" width="0.0508" layer="26"/>
<wire x1="19.847159375" y1="31.11583125" x2="19.845209375" y2="31.12165" width="0.0508" layer="26"/>
<wire x1="19.845209375" y1="31.12165" x2="19.843209375" y2="31.127540625" width="0.0508" layer="26"/>
<wire x1="19.843209375" y1="31.127540625" x2="19.84116875" y2="31.133459375" width="0.0508" layer="26"/>
<wire x1="19.84116875" y1="31.133459375" x2="19.839109375" y2="31.139340625" width="0.0508" layer="26"/>
<wire x1="19.839109375" y1="31.139340625" x2="19.837040625" y2="31.14515" width="0.0508" layer="26"/>
<wire x1="19.837040625" y1="31.14515" x2="19.83486875" y2="31.15115" width="0.0508" layer="26"/>
<wire x1="19.83486875" y1="31.15115" x2="19.832640625" y2="31.15723125" width="0.0508" layer="26"/>
<wire x1="19.832640625" y1="31.15723125" x2="19.830390625" y2="31.163290625" width="0.0508" layer="26"/>
<wire x1="19.830390625" y1="31.163290625" x2="19.828140625" y2="31.16923125" width="0.0508" layer="26"/>
<wire x1="19.828140625" y1="31.16923125" x2="19.825940625" y2="31.17496875" width="0.0508" layer="26"/>
<wire x1="19.825940625" y1="31.17496875" x2="19.82366875" y2="31.180809375" width="0.0508" layer="26"/>
<wire x1="19.82366875" y1="31.180809375" x2="19.821409375" y2="31.186559375" width="0.0508" layer="26"/>
<wire x1="19.821409375" y1="31.186559375" x2="19.819" y2="31.19258125" width="0.0508" layer="26"/>
<wire x1="19.819" y1="31.19258125" x2="19.816609375" y2="31.19848125" width="0.0508" layer="26"/>
<wire x1="19.816609375" y1="31.19848125" x2="19.814240625" y2="31.20425" width="0.0508" layer="26"/>
<wire x1="19.814240625" y1="31.20425" x2="19.811759375" y2="31.2102" width="0.0508" layer="26"/>
<wire x1="19.811759375" y1="31.2102" x2="19.80936875" y2="31.21586875" width="0.0508" layer="26"/>
<wire x1="19.80936875" y1="31.21586875" x2="19.80695" y2="31.221540625" width="0.0508" layer="26"/>
<wire x1="19.80695" y1="31.221540625" x2="19.80456875" y2="31.226990625" width="0.0508" layer="26"/>
<wire x1="19.80456875" y1="31.226990625" x2="19.80215" y2="31.232409375" width="0.0508" layer="26"/>
<wire x1="19.80215" y1="31.232409375" x2="19.79968125" y2="31.2378" width="0.0508" layer="26"/>
<wire x1="19.79968125" y1="31.2378" x2="19.797159375" y2="31.24316875" width="0.0508" layer="26"/>
<wire x1="19.797159375" y1="31.24316875" x2="19.794590625" y2="31.2485" width="0.0508" layer="26"/>
<wire x1="19.794590625" y1="31.2485" x2="19.791990625" y2="31.253809375" width="0.0508" layer="26"/>
<wire x1="19.791990625" y1="31.253809375" x2="19.78935" y2="31.25908125" width="0.0508" layer="26"/>
<wire x1="19.78935" y1="31.25908125" x2="19.786659375" y2="31.26433125" width="0.0508" layer="26"/>
<wire x1="19.786659375" y1="31.26433125" x2="19.783940625" y2="31.269540625" width="0.0508" layer="26"/>
<wire x1="19.783940625" y1="31.269540625" x2="19.781190625" y2="31.27471875" width="0.0508" layer="26"/>
<wire x1="19.781190625" y1="31.27471875" x2="19.7784" y2="31.27988125" width="0.0508" layer="26"/>
<wire x1="19.7784" y1="31.27988125" x2="19.77558125" y2="31.285" width="0.0508" layer="26"/>
<wire x1="19.77558125" y1="31.285" x2="19.77271875" y2="31.29008125" width="0.0508" layer="26"/>
<wire x1="19.77271875" y1="31.29008125" x2="19.769840625" y2="31.295140625" width="0.0508" layer="26"/>
<wire x1="19.769840625" y1="31.295140625" x2="19.76693125" y2="31.300159375" width="0.0508" layer="26"/>
<wire x1="19.76693125" y1="31.300159375" x2="19.764" y2="31.30515" width="0.0508" layer="26"/>
<wire x1="19.764" y1="31.30515" x2="19.760940625" y2="31.31026875" width="0.0508" layer="26"/>
<wire x1="19.760940625" y1="31.31026875" x2="19.75775" y2="31.31551875" width="0.0508" layer="26"/>
<wire x1="19.75775" y1="31.31551875" x2="19.754540625" y2="31.32073125" width="0.0508" layer="26"/>
<wire x1="19.754540625" y1="31.32073125" x2="19.7513" y2="31.325909375" width="0.0508" layer="26"/>
<wire x1="19.7513" y1="31.325909375" x2="19.74805" y2="31.331040625" width="0.0508" layer="26"/>
<wire x1="19.74805" y1="31.331040625" x2="19.74476875" y2="31.336140625" width="0.0508" layer="26"/>
<wire x1="19.74476875" y1="31.336140625" x2="19.74146875" y2="31.341190625" width="0.0508" layer="26"/>
<wire x1="19.74146875" y1="31.341190625" x2="19.73815" y2="31.346209375" width="0.0508" layer="26"/>
<wire x1="19.73815" y1="31.346209375" x2="19.73481875" y2="31.351190625" width="0.0508" layer="26"/>
<wire x1="19.73481875" y1="31.351190625" x2="19.731459375" y2="31.35613125" width="0.0508" layer="26"/>
<wire x1="19.731459375" y1="31.35613125" x2="19.7281" y2="31.36103125" width="0.0508" layer="26"/>
<wire x1="19.7281" y1="31.36103125" x2="19.72471875" y2="31.365890625" width="0.0508" layer="26"/>
<wire x1="19.72471875" y1="31.365890625" x2="19.72133125" y2="31.370709375" width="0.0508" layer="26"/>
<wire x1="19.72133125" y1="31.370709375" x2="19.71793125" y2="31.3755" width="0.0508" layer="26"/>
<wire x1="19.71793125" y1="31.3755" x2="19.714509375" y2="31.380240625" width="0.0508" layer="26"/>
<wire x1="19.714509375" y1="31.380240625" x2="19.711090625" y2="31.384940625" width="0.0508" layer="26"/>
<wire x1="19.711090625" y1="31.384940625" x2="19.707659375" y2="31.389609375" width="0.0508" layer="26"/>
<wire x1="19.707659375" y1="31.389609375" x2="19.704009375" y2="

repository: ThanicsRobotics/ProjectHaloCAD

path: /ECAD-Files/EAGLE-Files/ThanicsHalo/Drone V1/Bulk Board/Bulk Board 2.brd

repo_name: ThanicsRobotics/ProjectHaloCAD

extension: brd

filename: Bulk Board 2.brd