Skip to content
Snippets Groups Projects
Commit 8f513c4a authored by DFN2's avatar DFN2
Browse files

change links in omnibox

parent 5ef28324
No related branches found
No related tags found
No related merge requests found
Pipeline #1047 canceled
Showing
with 0 additions and 1918 deletions
{
"defaults": {
"startPage": "https://www.pling.com/",
"windowBounds": {
"x": 0,
"y": 0,
"width": 1024,
"height": 768
}
},
"updateCheckAfter": 86400000, "//": "milliseconds"
}
{
"bin": "ocs-manager",
"port": 0
}
app/images/app-icons/ocs-store.png

2.2 KiB

This diff is collapsed.
app/images/app-icons/pling-store.png

5.21 KiB

This diff is collapsed.
.icon-ocs-store {
background-image: url(app-icons/pling-store.svg);
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Security-Policy"
content="default-src 'self' 'unsafe-inline'; connect-src *">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no, email=no, address=no">
<title></title>
<link href="styles/reset.css" rel="stylesheet">
<link href="styles/color.css" rel="stylesheet">
<link href="styles/material-icons.css" rel="stylesheet">
<link href="styles/global.css" rel="stylesheet">
</head>
<body>
<app-root></app-root>
<script>
require = require('esm')(module);
module.exports = require('./scripts/renderers/browser-window.js');
</script>
</body>
</html>
/**
* Chirit
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright 2018, Akira Ohgaki
* @license https://opensource.org/licenses/BSD-2-Clause
* @link https://github.com/akiraohgaki/chirit
*/
import Component from './Component.js';
import StateManager from './StateManager.js';
import Handler from './Handler.js';
import WebStorage from './WebStorage.js';
import Utility from './Utility.js';
export default class Chirit {
static get Component() {
return Component;
}
static get StateManager() {
return StateManager;
}
static get Handler() {
return Handler;
}
static get WebStorage() {
return WebStorage;
}
static get Utility() {
return Utility;
}
}
/**
* Chirit
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright 2018, Akira Ohgaki
* @license https://opensource.org/licenses/BSD-2-Clause
* @link https://github.com/akiraohgaki/chirit
*/
export default class Component extends HTMLElement {
static define(name, options) {
window.customElements.define(name, this, options);
}
constructor() {
super();
this._state = {};
this._shadowRoot = null;
this._template = null;
this._updateCount = 0;
this.initShadow();
this.initTemplate();
this.init();
}
set state(state) {
this.setState(state);
}
get state() {
return this.getState();
}
get contentRoot() {
return this._shadowRoot || this.shadowRoot || this;
}
initShadow() {
this.enableShadow();
}
initTemplate() {
this.importTemplate(document.createElement('template'));
}
setState(state) {
if (typeof state !== 'object' || state === null) {
throw new TypeError(`"${state}" is not an object`);
}
const oldState = Object.assign({}, this._state);
this._state = state;
const newState = Object.assign({}, this._state);
this._stateChangedCallback(oldState, newState);
}
getState() {
return this._state;
}
setContent(content) {
// "content" should be Node object or string
if (typeof content === 'string') {
const template = document.createElement('template');
template.innerHTML = content;
content = template.content;
}
const oldContent = this.exportTemplate().content;
this._template.content.textContent = null;
this._template.content.appendChild(content);
const newContent = this.exportTemplate().content;
this.contentRoot.textContent = null;
this.contentRoot.appendChild(newContent.cloneNode(true));
this._contentChangedCallback(oldContent, newContent);
}
enableShadow(options = {}) {
this._shadowRoot = this.attachShadow(Object.assign(
{mode: 'open'},
options
));
}
importTemplate(template) {
if (!(template instanceof HTMLTemplateElement)) {
throw new TypeError(`"${template}" is not a HTMLTemplateElement`);
}
this._template = template.cloneNode(true);
}
exportTemplate() {
return this._template.cloneNode(true);
}
dispatch(type, data = {}) {
this.dispatchEvent(new CustomEvent(type, {
detail: data,
bubbles: true,
composed: true
}));
}
update(state) {
if (state !== undefined) {
this.setState(state);
}
else {
this._update();
}
}
_update() {
let content = this.render();
if (typeof content !== 'string' && !content) {
content = this.exportTemplate().content;
}
this.setContent(content);
this._updatedCallback();
}
// Abstract methods
init() {}
render() {}
// Lifecycle methods
static get componentObservedAttributes() {
return [];
}
componentAttributeChangedCallback() {}
componentConnectedCallback() {}
componentDisconnectedCallback() {}
componentAdoptedCallback() {}
componentStateChangedCallback() {}
componentContentChangedCallback() {}
componentUpdatedCallback() {}
// Lifecycle methods in parent class
static get observedAttributes() {
return this.componentObservedAttributes;
}
attributeChangedCallback(attributeName, oldValue, newValue, namespace) {
this.componentAttributeChangedCallback(attributeName, oldValue, newValue, namespace);
if (this._updateCount && oldValue !== newValue) {
this._update();
}
}
connectedCallback() {
this.componentConnectedCallback();
if (!this._updateCount) {
this._update();
}
}
disconnectedCallback() {
this.componentDisconnectedCallback();
}
adoptedCallback(oldDocument, newDocument) {
this.componentAdoptedCallback(oldDocument, newDocument);
if (!this._updateCount) {
this._update();
}
}
// Additional lifecycle methods
_stateChangedCallback(oldState, newState) {
this.componentStateChangedCallback(oldState, newState);
//if (this._updateCount && JSON.stringify(oldState) !== JSON.stringify(newState)) {
// this.update();
//}
if (this._updateCount) {
this._update();
}
}
_contentChangedCallback(oldContent, newContent) {
this.componentContentChangedCallback(oldContent, newContent);
}
_updatedCallback() {
this._updateCount++;
this.componentUpdatedCallback();
}
}
/**
* Chirit
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright 2018, Akira Ohgaki
* @license https://opensource.org/licenses/BSD-2-Clause
* @link https://github.com/akiraohgaki/chirit
*/
export default class Handler {
constructor(handler) {
// handler:
// (data = {}, type = '') => {
// return {};
// }
this._initialHandler = handler;
this._defaultHandler = null;
this._typeHandlersCollection = new Map(); // [[type, [handler]]]
this.resetDefault();
}
resetDefault() {
this.setDefault(this._initialHandler);
return this;
}
setDefault(handler) {
this._checkTypeOfHandler(handler);
this._defaultHandler = handler;
this.defaultChangedCallback(handler);
return this;
}
add(type, handler) {
this._checkTypeOfHandler(handler);
this.beforeAddCallback(type, handler);
const typeHandlers = this._typeHandlersCollection.get(type) || new Set();
if (!typeHandlers.has(handler)) {
typeHandlers.add(handler);
this._typeHandlersCollection.set(type, typeHandlers);
this.afterAddCallback(type, handler);
}
return this;
}
remove(type, handler) {
this._checkTypeOfHandler(handler);
this.beforeRemoveCallback(type, handler);
if (this._typeHandlersCollection.has(type)) {
const typeHandlers = this._typeHandlersCollection.get(type);
if (typeHandlers.has(handler)) {
typeHandlers.delete(handler);
if (typeHandlers.size) {
this._typeHandlersCollection.set(type, typeHandlers);
}
else {
this._typeHandlersCollection.delete(type);
}
this.afterRemoveCallback(type, handler);
}
}
return this;
}
has(type) {
return this._typeHandlersCollection.has(type);
}
async invoke(data = {}, type = '') {
// This function will wrap and call registered handlers with Promise and Promise.all().
// And all return values of the same type of handlers will be combined in object finally.
// If any handler returned false, will not combine values and return null.
const promises = [];
promises.push(new Promise((resolve) => {
resolve(this._defaultHandler(data, type));
}));
if (type && this._typeHandlersCollection.has(type)) {
const typeHandlers = this._typeHandlersCollection.get(type);
for (const handler of typeHandlers) {
promises.push(new Promise((resolve) => {
resolve(handler(data, type));
}));
}
}
const values = await Promise.all(promises);
if (values.includes(false)) {
return null;
}
const combinedData = {};
for (const value of values) {
Object.assign(combinedData, value);
}
return combinedData;
}
defaultChangedCallback() {}
beforeAddCallback() {}
afterAddCallback() {}
beforeRemoveCallback() {}
afterRemoveCallback() {}
_checkTypeOfHandler(handler) {
if (typeof handler !== 'function') {
throw new TypeError(`"${handler}" is not a function`);
}
}
}
# Chirit
[![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg)](https://opensource.org/licenses/BSD-2-Clause)
A front-end library.
Copyright: 2018, Akira Ohgaki
License: BSD-2-Clause
/**
* Chirit
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright 2018, Akira Ohgaki
* @license https://opensource.org/licenses/BSD-2-Clause
* @link https://github.com/akiraohgaki/chirit
*/
import Handler from './Handler.js';
export default class StateManager {
constructor(target) {
// "target" should be Element object or selector string
if (typeof target === 'string') {
target = document.querySelector(target);
}
this._target = target || document;
this._state = new Map();
this._eventListener = this._eventListener.bind(this);
this._eventHandler = null;
this._actionHandler = null;
this._stateHandler = null;
this._viewHandler = null;
this._initHandlers();
}
get target() {
return this._target;
}
get state() {
return this._state;
}
get eventHandler() {
return this._eventHandler;
}
get actionHandler() {
return this._actionHandler;
}
get stateHandler() {
return this._stateHandler;
}
get viewHandler() {
return this._viewHandler;
}
dispatch(type, data = {}) {
this._target.dispatchEvent(new CustomEvent(type, {detail: data}));
}
_eventListener(event) {
event.preventDefault();
event.stopPropagation();
this._invokeHandlers(event.detail, event.type);
}
_initHandlers() {
this._eventHandler = new Handler((data) => {
return data;
});
this._actionHandler = new Handler(() => {
return {};
});
this._stateHandler = new Handler((data, type) => {
this._state.set(type, data);
return data;
});
this._viewHandler = new Handler(() => {
return {};
});
const beforeAddCallback = (type) => {
if (!this._eventHandler.has(type)
&& !this._actionHandler.has(type)
&& !this._stateHandler.has(type)
&& !this._viewHandler.has(type)
) {
this._target.addEventListener(type, this._eventListener, false);
this._state.set(type, {});
}
};
const afterRemoveCallback = (type) => {
if (!this._eventHandler.has(type)
&& !this._actionHandler.has(type)
&& !this._stateHandler.has(type)
&& !this._viewHandler.has(type)
) {
this._target.removeEventListener(type, this._eventListener, false);
this._state.delete(type);
}
};
this._eventHandler.beforeAddCallback = beforeAddCallback;
this._eventHandler.afterRemoveCallback = afterRemoveCallback;
this._actionHandler.beforeAddCallback = beforeAddCallback;
this._actionHandler.afterRemoveCallback = afterRemoveCallback;
this._stateHandler.beforeAddCallback = beforeAddCallback;
this._stateHandler.afterRemoveCallback = afterRemoveCallback;
this._viewHandler.beforeAddCallback = beforeAddCallback;
this._viewHandler.afterRemoveCallback = afterRemoveCallback;
}
async _invokeHandlers(data, type) {
try {
const eventRusult = await this._eventHandler.invoke(data, type);
if (!eventRusult) {
return;
}
const actionResult = await this._actionHandler.invoke(eventRusult, type);
if (!actionResult) {
return;
}
const stateResult = await this._stateHandler.invoke(actionResult, type);
if (!stateResult) {
return;
}
//const viewResult = await this._viewHandler.invoke(stateResult, type);
this._viewHandler.invoke(stateResult, type);
}
catch (error) {
console.error(error);
}
}
}
/**
* Chirit
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright 2018, Akira Ohgaki
* @license https://opensource.org/licenses/BSD-2-Clause
* @link https://github.com/akiraohgaki/chirit
*/
export default class Utility {
static parseQueryString() {
const params = {};
if (window.location.search.length > 1) {
const queries = window.location.search.substring(1).split('&');
for (const query of queries) {
const kv = query.split('=');
const key = decodeURIComponent(kv[0]);
const value = (kv[1] !== undefined) ? decodeURIComponent(kv[1]) : '';
params[key] = value;
}
}
return params;
}
static convertByteToHumanReadable(byte) {
byte = parseFloat(byte);
const kb = 1024;
const mb = 1024 * kb;
const gb = 1024 * mb;
const tb = 1024 * gb;
const pb = 1024 * tb;
const eb = 1024 * pb;
const zb = 1024 * eb;
const yb = 1024 * zb;
let text = '';
if (byte < kb) {
text = `${byte.toFixed(0)} B`;
}
else if (byte < mb) {
text = `${(byte / kb).toFixed(2)} KB`;
}
else if (byte < gb) {
text = `${(byte / mb).toFixed(2)} MB`;
}
else if (byte < tb) {
text = `${(byte / gb).toFixed(2)} GB`;
}
else if (byte < pb) {
text = `${(byte / tb).toFixed(2)} TB`;
}
else if (byte < eb) {
text = `${(byte / pb).toFixed(2)} PB`;
}
else if (byte < zb) {
text = `${(byte / eb).toFixed(2)} EB`;
}
else if (byte < yb) {
text = `${(byte / zb).toFixed(2)} ZB`;
}
else if (byte >= yb) {
text = `${(byte / yb).toFixed(2)} YB`;
}
return text;
}
static convertDatetimeToHumanReadable(datetime) {
// "datetime" should be ISO 8601 formatted string
const today = new Date();
const date = new Date(datetime);
const timeDelta = today.getTime() - date.getTime();
const second = 1000;
const minute = 60 * second;
const hour = 60 * minute;
const day = 24 * hour;
const week = 7 * day;
const month = 30 * day;
const year = 365 * day;
let timeDistance = 0;
let timeUnit = '';
if (timeDelta < minute) {
timeDistance = timeDelta / second;
timeUnit = 'second';
}
else if (timeDelta < hour) {
timeDistance = timeDelta / minute;
timeUnit = 'minute';
}
else if (timeDelta < day) {
timeDistance = timeDelta / hour;
timeUnit = 'hour';
}
else if (timeDelta < week) {
timeDistance = timeDelta / day;
timeUnit = 'day';
}
else if (timeDelta < month) {
timeDistance = timeDelta / week;
timeUnit = 'week';
}
else if (timeDelta < year) {
timeDistance = timeDelta / month;
timeUnit = 'month';
}
else if (timeDelta >= year) {
timeDistance = timeDelta / year;
timeUnit = 'year';
}
timeDistance = Math.floor(timeDistance);
let text = '';
if (timeDistance === 0) {
text = 'Just now';
}
else if (timeDistance === 1) {
text = `${timeDistance} ${timeUnit} ago`;
}
else if (timeDistance > 1) {
text = `${timeDistance} ${timeUnit}s ago`;
}
return text;
}
static generateRandomString(length = 16, addition = '') {
length = parseInt(length, 10);
const strings = '0123456789'
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ 'abcdefghijklmnopqrstuvwxyz'
+ addition;
const stringArray = strings.split('');
let randomString = '';
for (let i = 0; i < length; i++) {
randomString += stringArray[Math.floor(Math.random() * stringArray.length)];
}
return randomString;
}
}
/**
* Chirit
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright 2018, Akira Ohgaki
* @license https://opensource.org/licenses/BSD-2-Clause
* @link https://github.com/akiraohgaki/chirit
*/
export default class WebStorage {
constructor(type = 'local', prefix = '') {
this._type = type;
this._prefix = prefix;
this._storage = null;
switch (this._type) {
case 'local':
this._storage = window.localStorage;
break;
case 'session':
this._storage = window.sessionStorage;
break;
default:
throw new Error('Storage type must be "local" or "session"');
}
}
get type() {
return this._type;
}
get prefix() {
return this._prefix;
}
get length() {
return this._storage.length;
}
key(index) {
return this._storage.key(index);
}
setItem(key, value) {
this._storage.setItem(
this._prefix + key,
JSON.stringify({_key: key, _value: value})
);
}
getItem(key) {
const value = this._storage.getItem(this._prefix + key);
if (value) {
const deserializedValue = JSON.parse(value);
if (deserializedValue
&& deserializedValue._key === key
&& deserializedValue._value !== undefined
) {
return deserializedValue._value;
}
return value;
}
return null;
}
removeItem(key) {
this._storage.removeItem(this._prefix + key);
}
clear() {
this._storage.clear();
}
}
/**
* Chirit
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright 2018, Akira Ohgaki
* @license https://opensource.org/licenses/BSD-2-Clause
* @link https://github.com/akiraohgaki/chirit
*/
/* Reset */
*,
::before,
::after {
box-sizing: inherit;
}
:root {
box-sizing: border-box;
}
article,
section,
nav,
aside,
header,
footer,
figure,
figcaption,
main,
embed,
canvas,
details,
summary {
display: block;
}
time,
mark,
ruby,
rt,
rp,
wbr,
datalist,
keygen,
progress,
meter {
display: inline;
}
body,
article,
section,
nav,
aside,
h1,
h2,
h3,
h4,
h5,
h6,
header,
footer,
address,
p,
hr,
pre,
blockquote,
ol,
ul,
li,
dl,
dt,
dd,
figure,
figcaption,
div,
main,
img,
iframe,
embed,
object,
video,
audio,
table,
caption,
tbody,
thead,
tfoot,
tr,
td,
th,
form,
input,
button,
select,
textarea,
fieldset,
legend,
canvas,
details,
summary {
margin: 0;
padding: 0;
}
/* Sections */
body {
background-color: #ffffff;
color: #444444;
font-style: normal;
font-weight: normal;
font-size: 90%;
line-height: 1.45;
font-family: Arial, Helvetica, sans-serif;
text-align: left;
letter-spacing: 0.05em;
vertical-align: baseline;
cursor: default;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: bold;
font-size: 100%;
font-family: Verdana, Arial, Helvetica, sans-serif;
letter-spacing: 0.1em;
}
h1 {
font-size: 200%;
}
h2 {
font-size: 166%;
}
h3 {
font-size: 125%;
}
address {
font-style: normal;
}
/* Grouping content */
p,
hr,
pre,
blockquote,
ol,
ul,
dl {
margin: 1em 0;
}
hr {
border: 0;
border-top: 1px dashed #d4d9df;
}
pre {
margin-left: 1em;
padding: 0.5em;
overflow: auto;
border-left: 0.5em solid #d4d9df;
background-color: #fafdff;
color: #000000;
font-family: 'Courier New', Courier, monospace;
}
blockquote {
margin-left: 1em;
padding: 0.5em;
border-left: 0.5em solid #fdd35c;
background-color: #fff3b8;
color: #000000;
font-family: 'Times New Roman', Times, serif;
}
ol,
ul,
dl {
margin-left: 2em;
}
dt {
font-weight: bold;
}
/* Text-level semantics */
a {
background-color: transparent;
color: #0075c2;
text-decoration: none;
outline: none;
}
a:hover {
color: #4496d3;
}
em,
strong {
font-style: normal;
font-weight: bold;
}
strong {
color: #c70067;
}
dfn,
abbr {
border: 0;
font-style: normal;
text-decoration: none;
}
dfn[title],
abbr[title] {
border-bottom: 1px dotted;
cursor: help;
}
mark {
background-color: #fff352;
color: #000000;
}
br {
letter-spacing: 0;
}
/* Edits */
ins {
text-decoration: none;
}
del {
opacity: 0.5;
text-decoration: line-through;
}
/* Embedded content */
img {
border: 0;
vertical-align: text-bottom;
}
/* Tabular data */
table {
border-collapse: collapse;
border-spacing: 0;
}
caption,
th,
td {
padding: 0.5em;
font-weight: normal;
text-align: left;
vertical-align: top;
}
thead th,
thead td {
vertical-align: bottom;
}
thead th {
font-weight: bold;
}
/* Forms */
input,
button,
select,
textarea {
font-size: 100%;
letter-spacing: normal;
vertical-align: middle;
}
textarea {
overflow: auto;
font-family: 'Courier New', Courier, monospace;
}
fieldset {
padding: 0.5em;
border: 0;
}
legend {
font-weight: bold;
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
id="svg2"
height="128"
width="128">
<defs
id="defs4" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,112)"
id="layer1">
<path
id="rect4447"
transform="translate(0,-112)"
d="M 80,32 56,80 32,56 l 0,24 24,24 48,-72 z"
style="stroke:none;fill:#ffffff;fill-opacity:1" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
id="svg2"
height="128"
width="128">
<defs
id="defs4" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,112)"
id="layer1">
<path
id="path2814"
transform="translate(0,-112)"
d="M 64 8 C 33.072054 8 8 33.072054 8 64 C 8 94.927946 33.072054 120 64 120 C 94.927946 120 120 94.927946 120 64 C 120 33.072054 94.927946 8 64 8 z M 64 32 C 81.673112 32 96 46.326888 96 64 C 96 81.673112 81.673112 96 64 96 C 46.326888 96 32 81.673112 32 64 C 32 46.326888 46.326888 32 64 32 z "
style="fill:#ffffff" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
id="svg2"
height="128"
width="128">
<defs
id="defs4" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,112)"
id="layer1">
<path
id="path2819"
transform="translate(0,-112)"
d="M 56,8 C 29.490333,8 8,29.490333 8,56 c 0,26.509667 21.490333,48 48,48 9.162085,0 17.716988,-2.546 25,-7 l 23,23 c 0,0 8,8 16,0 8,-8 0,-16 0,-16 L 97,81 c 4.454,-7.283012 7,-15.837915 7,-25 C 104,29.490333 82.509667,8 56,8 z m 0,16 C 73.673112,24 88,38.326888 88,56 88,73.673112 73.673112,88 56,88 38.326888,88 24,73.673112 24,56 24,38.326888 38.326888,24 56,24 z"
style="fill:#777777" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
id="svg2"
height="128"
width="128">
<defs
id="defs4" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,112)"
id="layer1">
<path
id="rect2872"
d="m 96,-56 0,8 -32,32 -32,-32 0,-8 8,0 24,24 24,-24 8,0 z"
style="fill:#777777;fill-opacity:1" />
</g>
</svg>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment