Initial commit: PC Builder AdonisJS project
This commit is contained in:
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* This file is automatically generated.
|
||||
* DO NOT EDIT manually
|
||||
*/
|
||||
|
||||
/// <reference path="./manifest.d.ts" />
|
||||
import type { InferData, InferVariants } from '@adonisjs/core/types/transformers'
|
||||
import type { InferSharedProps } from '@adonisjs/inertia/types'
|
||||
import type UserTransformer from '#transformers/user_transformer'
|
||||
import type InertiaMiddleware from '#middleware/inertia_middleware'
|
||||
|
||||
export namespace Data {
|
||||
export type User = InferData<UserTransformer>
|
||||
export namespace User {
|
||||
export type Variants = InferVariants<UserTransformer>
|
||||
}
|
||||
export type SharedProps = InferSharedProps<InertiaMiddleware>
|
||||
}
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* This file is automatically generated.
|
||||
* DO NOT EDIT manually
|
||||
*/
|
||||
|
||||
/// <reference path="../../adonisrc.ts" />
|
||||
/// <reference path="../../config/auth.ts" />
|
||||
/// <reference path="../../config/hash.ts" />
|
||||
/// <reference path="../../config/logger.ts" />
|
||||
@@ -0,0 +1,143 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
import type { AdonisEndpoint } from '@tuyau/core/types'
|
||||
import type { Registry } from './schema.d.ts'
|
||||
import type { ApiDefinition } from './tree.d.ts'
|
||||
|
||||
const placeholder: any = {}
|
||||
|
||||
const routes = {
|
||||
'home': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/',
|
||||
tokens: [{"old":"/","type":0,"val":"/","end":""}],
|
||||
types: placeholder as Registry['home']['types'],
|
||||
},
|
||||
'new_account.create': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/auth/signup',
|
||||
tokens: [{"old":"/auth/signup","type":0,"val":"auth","end":""},{"old":"/auth/signup","type":0,"val":"signup","end":""}],
|
||||
types: placeholder as Registry['new_account.create']['types'],
|
||||
},
|
||||
'new_account.store': {
|
||||
methods: ["POST"],
|
||||
pattern: '/auth/signup',
|
||||
tokens: [{"old":"/auth/signup","type":0,"val":"auth","end":""},{"old":"/auth/signup","type":0,"val":"signup","end":""}],
|
||||
types: placeholder as Registry['new_account.store']['types'],
|
||||
},
|
||||
'session.create': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/auth/login',
|
||||
tokens: [{"old":"/auth/login","type":0,"val":"auth","end":""},{"old":"/auth/login","type":0,"val":"login","end":""}],
|
||||
types: placeholder as Registry['session.create']['types'],
|
||||
},
|
||||
'session.store': {
|
||||
methods: ["POST"],
|
||||
pattern: '/auth/login',
|
||||
tokens: [{"old":"/auth/login","type":0,"val":"auth","end":""},{"old":"/auth/login","type":0,"val":"login","end":""}],
|
||||
types: placeholder as Registry['session.store']['types'],
|
||||
},
|
||||
'session.destroy': {
|
||||
methods: ["POST"],
|
||||
pattern: '/logout',
|
||||
tokens: [{"old":"/logout","type":0,"val":"logout","end":""}],
|
||||
types: placeholder as Registry['session.destroy']['types'],
|
||||
},
|
||||
'computers.index': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/computers',
|
||||
tokens: [{"old":"/computers","type":0,"val":"computers","end":""}],
|
||||
types: placeholder as Registry['computers.index']['types'],
|
||||
},
|
||||
'computers.create': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/computers/create',
|
||||
tokens: [{"old":"/computers/create","type":0,"val":"computers","end":""},{"old":"/computers/create","type":0,"val":"create","end":""}],
|
||||
types: placeholder as Registry['computers.create']['types'],
|
||||
},
|
||||
'computers.store': {
|
||||
methods: ["POST"],
|
||||
pattern: '/computers',
|
||||
tokens: [{"old":"/computers","type":0,"val":"computers","end":""}],
|
||||
types: placeholder as Registry['computers.store']['types'],
|
||||
},
|
||||
'computers.show': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/computers/:id',
|
||||
tokens: [{"old":"/computers/:id","type":0,"val":"computers","end":""},{"old":"/computers/:id","type":1,"val":"id","end":""}],
|
||||
types: placeholder as Registry['computers.show']['types'],
|
||||
},
|
||||
'computers.edit': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/computers/:id/edit',
|
||||
tokens: [{"old":"/computers/:id/edit","type":0,"val":"computers","end":""},{"old":"/computers/:id/edit","type":1,"val":"id","end":""},{"old":"/computers/:id/edit","type":0,"val":"edit","end":""}],
|
||||
types: placeholder as Registry['computers.edit']['types'],
|
||||
},
|
||||
'computers.update': {
|
||||
methods: ["PUT"],
|
||||
pattern: '/computers/:id',
|
||||
tokens: [{"old":"/computers/:id","type":0,"val":"computers","end":""},{"old":"/computers/:id","type":1,"val":"id","end":""}],
|
||||
types: placeholder as Registry['computers.update']['types'],
|
||||
},
|
||||
'computers.destroy': {
|
||||
methods: ["DELETE"],
|
||||
pattern: '/computers/:id',
|
||||
tokens: [{"old":"/computers/:id","type":0,"val":"computers","end":""},{"old":"/computers/:id","type":1,"val":"id","end":""}],
|
||||
types: placeholder as Registry['computers.destroy']['types'],
|
||||
},
|
||||
'components.index': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/components',
|
||||
tokens: [{"old":"/components","type":0,"val":"components","end":""}],
|
||||
types: placeholder as Registry['components.index']['types'],
|
||||
},
|
||||
'components.create': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/components/create',
|
||||
tokens: [{"old":"/components/create","type":0,"val":"components","end":""},{"old":"/components/create","type":0,"val":"create","end":""}],
|
||||
types: placeholder as Registry['components.create']['types'],
|
||||
},
|
||||
'components.store': {
|
||||
methods: ["POST"],
|
||||
pattern: '/components',
|
||||
tokens: [{"old":"/components","type":0,"val":"components","end":""}],
|
||||
types: placeholder as Registry['components.store']['types'],
|
||||
},
|
||||
'components.show': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/components/:id',
|
||||
tokens: [{"old":"/components/:id","type":0,"val":"components","end":""},{"old":"/components/:id","type":1,"val":"id","end":""}],
|
||||
types: placeholder as Registry['components.show']['types'],
|
||||
},
|
||||
'components.edit': {
|
||||
methods: ["GET","HEAD"],
|
||||
pattern: '/components/:id/edit',
|
||||
tokens: [{"old":"/components/:id/edit","type":0,"val":"components","end":""},{"old":"/components/:id/edit","type":1,"val":"id","end":""},{"old":"/components/:id/edit","type":0,"val":"edit","end":""}],
|
||||
types: placeholder as Registry['components.edit']['types'],
|
||||
},
|
||||
'components.update': {
|
||||
methods: ["PUT"],
|
||||
pattern: '/components/:id',
|
||||
tokens: [{"old":"/components/:id","type":0,"val":"components","end":""},{"old":"/components/:id","type":1,"val":"id","end":""}],
|
||||
types: placeholder as Registry['components.update']['types'],
|
||||
},
|
||||
'components.destroy': {
|
||||
methods: ["DELETE"],
|
||||
pattern: '/components/:id',
|
||||
tokens: [{"old":"/components/:id","type":0,"val":"components","end":""},{"old":"/components/:id","type":1,"val":"id","end":""}],
|
||||
types: placeholder as Registry['components.destroy']['types'],
|
||||
},
|
||||
} as const satisfies Record<string, AdonisEndpoint>
|
||||
|
||||
export { routes }
|
||||
|
||||
export const registry = {
|
||||
routes,
|
||||
$tree: {} as ApiDefinition,
|
||||
}
|
||||
|
||||
declare module '@tuyau/core/types' {
|
||||
export interface UserRegistry {
|
||||
routes: typeof routes
|
||||
$tree: ApiDefinition
|
||||
}
|
||||
}
|
||||
+250
@@ -0,0 +1,250 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/// <reference path="../manifest.d.ts" />
|
||||
|
||||
import type { ExtractBody, ExtractErrorResponse, ExtractQuery, ExtractQueryForGet, ExtractResponse } from '@tuyau/core/types'
|
||||
import type { InferInput, SimpleError } from '@vinejs/vine/types'
|
||||
|
||||
export type ParamValue = string | number | bigint | boolean
|
||||
|
||||
export interface Registry {
|
||||
'home': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: unknown
|
||||
errorResponse: unknown
|
||||
}
|
||||
}
|
||||
'new_account.create': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/auth/signup'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['create']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['create']>>>
|
||||
}
|
||||
}
|
||||
'new_account.store': {
|
||||
methods: ["POST"]
|
||||
pattern: '/auth/signup'
|
||||
types: {
|
||||
body: ExtractBody<InferInput<(typeof import('#validators/user').signupValidator)>>
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: ExtractQuery<InferInput<(typeof import('#validators/user').signupValidator)>>
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['store']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/new_account_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
|
||||
}
|
||||
}
|
||||
'session.create': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/auth/login'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/session_controller').default['create']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/session_controller').default['create']>>>
|
||||
}
|
||||
}
|
||||
'session.store': {
|
||||
methods: ["POST"]
|
||||
pattern: '/auth/login'
|
||||
types: {
|
||||
body: ExtractBody<InferInput<(typeof import('#validators/Auth/login').loginValidator)>>
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: ExtractQuery<InferInput<(typeof import('#validators/Auth/login').loginValidator)>>
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/session_controller').default['store']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/session_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
|
||||
}
|
||||
}
|
||||
'session.destroy': {
|
||||
methods: ["POST"]
|
||||
pattern: '/logout'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/session_controller').default['destroy']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/session_controller').default['destroy']>>>
|
||||
}
|
||||
}
|
||||
'computers.index': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/computers'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['index']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['index']>>>
|
||||
}
|
||||
}
|
||||
'computers.create': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/computers/create'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['create']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['create']>>>
|
||||
}
|
||||
}
|
||||
'computers.store': {
|
||||
methods: ["POST"]
|
||||
pattern: '/computers'
|
||||
types: {
|
||||
body: ExtractBody<InferInput<(typeof import('#validators/Computers/store').storeComputerValidator)>>
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: ExtractQuery<InferInput<(typeof import('#validators/Computers/store').storeComputerValidator)>>
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['store']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
|
||||
}
|
||||
}
|
||||
'computers.show': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/computers/:id'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['show']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['show']>>>
|
||||
}
|
||||
}
|
||||
'computers.edit': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/computers/:id/edit'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['edit']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['edit']>>>
|
||||
}
|
||||
}
|
||||
'computers.update': {
|
||||
methods: ["PUT"]
|
||||
pattern: '/computers/:id'
|
||||
types: {
|
||||
body: ExtractBody<InferInput<(typeof import('#validators/Computers/update').updateComputerValidator)>>
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: ExtractQuery<InferInput<(typeof import('#validators/Computers/update').updateComputerValidator)>>
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['update']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['update']>>> | { status: 422; response: { errors: SimpleError[] } }
|
||||
}
|
||||
}
|
||||
'computers.destroy': {
|
||||
methods: ["DELETE"]
|
||||
pattern: '/computers/:id'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['destroy']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/computers_controller').default['destroy']>>>
|
||||
}
|
||||
}
|
||||
'components.index': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/components'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['index']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['index']>>>
|
||||
}
|
||||
}
|
||||
'components.create': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/components/create'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['create']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['create']>>>
|
||||
}
|
||||
}
|
||||
'components.store': {
|
||||
methods: ["POST"]
|
||||
pattern: '/components'
|
||||
types: {
|
||||
body: ExtractBody<InferInput<(typeof import('#validators/Components/store').storeComponentValidator)>>
|
||||
paramsTuple: []
|
||||
params: {}
|
||||
query: ExtractQuery<InferInput<(typeof import('#validators/Components/store').storeComponentValidator)>>
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['store']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['store']>>> | { status: 422; response: { errors: SimpleError[] } }
|
||||
}
|
||||
}
|
||||
'components.show': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/components/:id'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['show']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['show']>>>
|
||||
}
|
||||
}
|
||||
'components.edit': {
|
||||
methods: ["GET","HEAD"]
|
||||
pattern: '/components/:id/edit'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['edit']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['edit']>>>
|
||||
}
|
||||
}
|
||||
'components.update': {
|
||||
methods: ["PUT"]
|
||||
pattern: '/components/:id'
|
||||
types: {
|
||||
body: ExtractBody<InferInput<(typeof import('#validators/Components/update').updateComponentValidator)>>
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: ExtractQuery<InferInput<(typeof import('#validators/Components/update').updateComponentValidator)>>
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['update']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['update']>>> | { status: 422; response: { errors: SimpleError[] } }
|
||||
}
|
||||
}
|
||||
'components.destroy': {
|
||||
methods: ["DELETE"]
|
||||
pattern: '/components/:id'
|
||||
types: {
|
||||
body: {}
|
||||
paramsTuple: [ParamValue]
|
||||
params: { id: ParamValue }
|
||||
query: {}
|
||||
response: ExtractResponse<Awaited<ReturnType<import('#controllers/components_controller').default['destroy']>>>
|
||||
errorResponse: ExtractErrorResponse<Awaited<ReturnType<import('#controllers/components_controller').default['destroy']>>>
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
import type { routes } from './index.ts'
|
||||
|
||||
export interface ApiDefinition {
|
||||
home: typeof routes['home']
|
||||
newAccount: {
|
||||
create: typeof routes['new_account.create']
|
||||
store: typeof routes['new_account.store']
|
||||
}
|
||||
session: {
|
||||
create: typeof routes['session.create']
|
||||
store: typeof routes['session.store']
|
||||
destroy: typeof routes['session.destroy']
|
||||
}
|
||||
computers: {
|
||||
index: typeof routes['computers.index']
|
||||
create: typeof routes['computers.create']
|
||||
store: typeof routes['computers.store']
|
||||
show: typeof routes['computers.show']
|
||||
edit: typeof routes['computers.edit']
|
||||
update: typeof routes['computers.update']
|
||||
destroy: typeof routes['computers.destroy']
|
||||
}
|
||||
components: {
|
||||
index: typeof routes['components.index']
|
||||
create: typeof routes['components.create']
|
||||
store: typeof routes['components.store']
|
||||
show: typeof routes['components.show']
|
||||
edit: typeof routes['components.edit']
|
||||
update: typeof routes['components.update']
|
||||
destroy: typeof routes['components.destroy']
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/**
|
||||
* This file is automatically generated.
|
||||
* DO NOT EDIT manually
|
||||
*/
|
||||
|
||||
export const controllers = {
|
||||
Components: () => import('#controllers/components_controller'),
|
||||
Computers: () => import('#controllers/computers_controller'),
|
||||
NewAccount: () => import('#controllers/new_account_controller'),
|
||||
Session: () => import('#controllers/session_controller'),
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* This file is automatically generated.
|
||||
* DO NOT EDIT manually
|
||||
*/
|
||||
|
||||
export const events = {}
|
||||
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* This file is automatically generated.
|
||||
* DO NOT EDIT manually
|
||||
*/
|
||||
|
||||
export const listeners = {}
|
||||
Vendored
+41
@@ -0,0 +1,41 @@
|
||||
import '@adonisjs/inertia/types'
|
||||
|
||||
import type { VNodeProps, AllowedComponentProps, ComponentInstance } from 'vue'
|
||||
|
||||
type ExtractProps<T> = Omit<
|
||||
ComponentInstance<T>['$props'],
|
||||
keyof VNodeProps | keyof AllowedComponentProps
|
||||
>
|
||||
|
||||
declare module '@adonisjs/inertia/types' {
|
||||
export interface InertiaPages {
|
||||
'account/signup': ExtractProps<(typeof import('../../inertia/pages/account/signup.vue'))['default']>
|
||||
'auth/login': ExtractProps<(typeof import('../../inertia/pages/auth/login.vue'))['default']>
|
||||
'auth/signup': ExtractProps<(typeof import('../../inertia/pages/auth/signup.vue'))['default']>
|
||||
'components/create': ExtractProps<(typeof import('../../inertia/pages/components/create.vue'))['default']>
|
||||
'components/edit': ExtractProps<(typeof import('../../inertia/pages/components/edit.vue'))['default']>
|
||||
'components/index': ExtractProps<(typeof import('../../inertia/pages/components/index.vue'))['default']>
|
||||
'components/show': ExtractProps<(typeof import('../../inertia/pages/components/show.vue'))['default']>
|
||||
'computers/create': ExtractProps<(typeof import('../../inertia/pages/computers/create.vue'))['default']>
|
||||
'computers/edit': ExtractProps<(typeof import('../../inertia/pages/computers/edit.vue'))['default']>
|
||||
'computers/index': ExtractProps<(typeof import('../../inertia/pages/computers/index.vue'))['default']>
|
||||
'computers/show': ExtractProps<(typeof import('../../inertia/pages/computers/show.vue'))['default']>
|
||||
'errors/not_found': ExtractProps<(typeof import('../../inertia/pages/errors/not_found.vue'))['default']>
|
||||
'errors/server_error': ExtractProps<(typeof import('../../inertia/pages/errors/server_error.vue'))['default']>
|
||||
'home': ExtractProps<(typeof import('../../inertia/pages/home.vue'))['default']>
|
||||
'layout/defaultLayout': ExtractProps<(typeof import('../../inertia/pages/layout/defaultLayout.vue'))['default']>
|
||||
'layout/emptyLayout': ExtractProps<(typeof import('../../inertia/pages/layout/emptyLayout.vue'))['default']>
|
||||
'layout/header': ExtractProps<(typeof import('../../inertia/pages/layout/header.vue'))['default']>
|
||||
'layout/sidebar': ExtractProps<(typeof import('../../inertia/pages/layout/sidebar.vue'))['default']>
|
||||
'widgets/AuthErrorAlert': ExtractProps<(typeof import('../../inertia/pages/widgets/AuthErrorAlert.vue'))['default']>
|
||||
'widgets/ComponentEditor': ExtractProps<(typeof import('../../inertia/pages/widgets/ComponentEditor.vue'))['default']>
|
||||
'widgets/ComponentsViewer': ExtractProps<(typeof import('../../inertia/pages/widgets/ComponentsViewer.vue'))['default']>
|
||||
'widgets/ComputerCard': ExtractProps<(typeof import('../../inertia/pages/widgets/ComputerCard.vue'))['default']>
|
||||
'widgets/ComputerComponentsTable': ExtractProps<(typeof import('../../inertia/pages/widgets/ComputerComponentsTable.vue'))['default']>
|
||||
'widgets/ComputersViewer': ExtractProps<(typeof import('../../inertia/pages/widgets/ComputersViewer.vue'))['default']>
|
||||
'widgets/DeleteConfirmationModal': ExtractProps<(typeof import('../../inertia/pages/widgets/DeleteConfirmationModal.vue'))['default']>
|
||||
'widgets/SimpleGallery': ExtractProps<(typeof import('../../inertia/pages/widgets/SimpleGallery.vue'))['default']>
|
||||
'widgets/TableComponent': ExtractProps<(typeof import('../../inertia/pages/widgets/TableComponent.vue'))['default']>
|
||||
'widgets/ValidationError': ExtractProps<(typeof import('../../inertia/pages/widgets/ValidationError.vue'))['default']>
|
||||
}
|
||||
}
|
||||
Vendored
+72
@@ -0,0 +1,72 @@
|
||||
import '@adonisjs/core/types/http'
|
||||
|
||||
type ParamValue = string | number | bigint | boolean
|
||||
|
||||
export type ScannedRoutes = {
|
||||
ALL: {
|
||||
'home': { paramsTuple?: []; params?: {} }
|
||||
'new_account.create': { paramsTuple?: []; params?: {} }
|
||||
'new_account.store': { paramsTuple?: []; params?: {} }
|
||||
'session.create': { paramsTuple?: []; params?: {} }
|
||||
'session.store': { paramsTuple?: []; params?: {} }
|
||||
'session.destroy': { paramsTuple?: []; params?: {} }
|
||||
'computers.index': { paramsTuple?: []; params?: {} }
|
||||
'computers.create': { paramsTuple?: []; params?: {} }
|
||||
'computers.store': { paramsTuple?: []; params?: {} }
|
||||
'computers.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'computers.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'computers.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'computers.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.index': { paramsTuple?: []; params?: {} }
|
||||
'components.create': { paramsTuple?: []; params?: {} }
|
||||
'components.store': { paramsTuple?: []; params?: {} }
|
||||
'components.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
}
|
||||
GET: {
|
||||
'home': { paramsTuple?: []; params?: {} }
|
||||
'new_account.create': { paramsTuple?: []; params?: {} }
|
||||
'session.create': { paramsTuple?: []; params?: {} }
|
||||
'computers.index': { paramsTuple?: []; params?: {} }
|
||||
'computers.create': { paramsTuple?: []; params?: {} }
|
||||
'computers.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'computers.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.index': { paramsTuple?: []; params?: {} }
|
||||
'components.create': { paramsTuple?: []; params?: {} }
|
||||
'components.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
}
|
||||
HEAD: {
|
||||
'home': { paramsTuple?: []; params?: {} }
|
||||
'new_account.create': { paramsTuple?: []; params?: {} }
|
||||
'session.create': { paramsTuple?: []; params?: {} }
|
||||
'computers.index': { paramsTuple?: []; params?: {} }
|
||||
'computers.create': { paramsTuple?: []; params?: {} }
|
||||
'computers.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'computers.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.index': { paramsTuple?: []; params?: {} }
|
||||
'components.create': { paramsTuple?: []; params?: {} }
|
||||
'components.show': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.edit': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
}
|
||||
POST: {
|
||||
'new_account.store': { paramsTuple?: []; params?: {} }
|
||||
'session.store': { paramsTuple?: []; params?: {} }
|
||||
'session.destroy': { paramsTuple?: []; params?: {} }
|
||||
'computers.store': { paramsTuple?: []; params?: {} }
|
||||
'components.store': { paramsTuple?: []; params?: {} }
|
||||
}
|
||||
PUT: {
|
||||
'computers.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.update': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
}
|
||||
DELETE: {
|
||||
'computers.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
'components.destroy': { paramsTuple: [ParamValue]; params: {'id': ParamValue} }
|
||||
}
|
||||
}
|
||||
declare module '@adonisjs/core/types/http' {
|
||||
export interface RoutesList extends ScannedRoutes {}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
# http://editorconfig.org
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.json]
|
||||
insert_final_newline = unset
|
||||
|
||||
[**.min.js]
|
||||
indent_style = unset
|
||||
insert_final_newline = unset
|
||||
|
||||
[MakeFile]
|
||||
indent_style = space
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
@@ -0,0 +1,21 @@
|
||||
# Node
|
||||
TZ=UTC
|
||||
PORT=3333
|
||||
HOST=localhost
|
||||
NODE_ENV=development
|
||||
|
||||
# App
|
||||
LOG_LEVEL=info
|
||||
APP_KEY=hzjnqY1-CfioBl2N-mncw4hty_66rB7V
|
||||
APP_URL=http://localhost:3333
|
||||
|
||||
# Session
|
||||
SESSION_DRIVER=cookie
|
||||
|
||||
# Database
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_USER=admin
|
||||
DB_PASSWORD=password
|
||||
DB_DATABASE=pc_builderv2
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
# Dependencies and AdonisJS build
|
||||
node_modules
|
||||
build
|
||||
tmp/*
|
||||
!tmp/.gitkeep
|
||||
dist
|
||||
.output
|
||||
|
||||
# Secrets
|
||||
.env
|
||||
.env.local
|
||||
.env.production.local
|
||||
.env.development.local
|
||||
.env.test
|
||||
|
||||
# Frontend assets compiled code
|
||||
public/assets
|
||||
|
||||
# Build tools specific
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
pnpm-debug.log
|
||||
|
||||
# Test coverage
|
||||
coverage
|
||||
|
||||
# Editors specific
|
||||
.fleet
|
||||
.idea
|
||||
.vscode
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Platform specific
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# IDE
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
|
||||
# OS
|
||||
.env.*.local
|
||||
@@ -0,0 +1,3 @@
|
||||
.adonisjs
|
||||
node_modules
|
||||
build
|
||||
@@ -0,0 +1,156 @@
|
||||
# ✅ Checklist de Migration - Pages Inertia
|
||||
|
||||
## 📦 Fichiers Migrés
|
||||
|
||||
### Pages d'Authentification
|
||||
- [x] `pages/auth/login.vue` - Page de connexion
|
||||
- [x] `pages/auth/signup.vue` - Page d'inscription
|
||||
- [x] `pages/account/signup.vue` - Création de compte
|
||||
|
||||
### Pages de Gestion des Composants
|
||||
- [x] `pages/components/index.vue` - Liste
|
||||
- [x] `pages/components/create.vue` - Création
|
||||
- [x] `pages/components/edit.vue` - Édition
|
||||
- [x] `pages/components/show.vue` - Détails
|
||||
|
||||
### Pages de Gestion des Ordinateurs
|
||||
- [x] `pages/computers/index.vue` - Liste
|
||||
- [x] `pages/computers/create.vue` - Création
|
||||
- [x] `pages/computers/edit.vue` - Édition
|
||||
- [x] `pages/computers/show.vue` - Détails
|
||||
|
||||
### Pages d'Erreur
|
||||
- [x] `pages/errors/not_found.vue` - 404
|
||||
- [x] `pages/errors/server_error.vue` - 500
|
||||
|
||||
### Layouts
|
||||
- [x] `pages/layout/defaultLayout.vue` - Layout principal
|
||||
- [x] `pages/layout/emptyLayout.vue` - Layout vide
|
||||
- [x] `pages/layout/sidebar.vue` - Navigation
|
||||
- [x] `pages/layout/header.vue` - En-tête
|
||||
|
||||
### Composants Réutilisables
|
||||
- [x] `pages/widgets/AuthErrorAlert.vue`
|
||||
- [x] `pages/widgets/ComponentEditor.vue`
|
||||
- [x] `pages/widgets/ComponentsViewer.vue`
|
||||
- [x] `pages/widgets/ComputerCard.vue`
|
||||
- [x] `pages/widgets/ComputerComponentsTable.vue`
|
||||
- [x] `pages/widgets/ComputersViewer.vue`
|
||||
- [x] `pages/widgets/DeleteConfirmationModal.vue`
|
||||
- [x] `pages/widgets/SimpleGallery.vue`
|
||||
- [x] `pages/widgets/TableComponent.vue`
|
||||
- [x] `pages/widgets/ValidationError.vue`
|
||||
|
||||
### Assets & Resources
|
||||
- [x] `assets/icons/` - 18 fichiers SVG
|
||||
- [x] `assets/images/` - Placeholders
|
||||
- [x] `composables/isAdminMode.ts` - Gestion admin
|
||||
- [x] `composables/useSidebar.ts` - Gestion sidebar
|
||||
- [x] `directives/v_validation_error.ts` - Validation
|
||||
- [x] `directives/v-delete-confirm.ts` - Confirmation
|
||||
- [x] `directives/v-price.ts` - Formatage prix
|
||||
- [x] `pages/types/UITypes.ts` - Types TypeScript
|
||||
- [x] `app.ts` - Configuration Inertia (mise à jour)
|
||||
|
||||
## 📋 Étapes de Validation
|
||||
|
||||
### 1. Vérification des Imports
|
||||
- [ ] Vérifier que tous les chemins d'import utilisent l'alias `~/`
|
||||
- [ ] Vérifier que les imports de composants existent
|
||||
- [ ] Vérifier que les imports d'icônes fonctionnent
|
||||
|
||||
### 2. Configuration du Routage
|
||||
- [ ] Vérifier que les routes AdonisJS retournent les bonnes pages Inertia
|
||||
- [ ] Tester la navigation entre les pages
|
||||
- [ ] Vérifier les redirections de layout (auth vs. default)
|
||||
|
||||
### 3. Styles et CSS
|
||||
- [ ] Vérifier que Tailwind CSS est chargé
|
||||
- [ ] Tester le design responsive
|
||||
- [ ] Vérifier l'apparence du sidebار et de l'en-tête
|
||||
|
||||
### 4. Composants & Directives
|
||||
- [ ] Vérifier que VueDatePicker fonctionne
|
||||
- [ ] Tester la directive v-validation-error
|
||||
- [ ] Tester la directive v-price
|
||||
- [ ] Tester la directive v-delete-confirm
|
||||
- [ ] Vérifier les composants Carousel
|
||||
|
||||
### 5. Fonctionnalités
|
||||
- [ ] Tester le toggle admin/classic mode
|
||||
- [ ] Tester la barre latérale responsive
|
||||
- [ ] Vérifier l'affichage du profil utilisateur
|
||||
- [ ] Tester la déconnexion
|
||||
|
||||
### 6. Pages Critiques
|
||||
- [ ] Page de connexion - formulaire et validation
|
||||
- [ ] Page de création de composant - formulaire complet
|
||||
- [ ] Page de liste des ordinateurs - grille responsive
|
||||
- [ ] Page de détails - affichage corrects des données
|
||||
- [ ] Pages d'erreur - design cohérent
|
||||
|
||||
## 🔧 Configuration Requise
|
||||
|
||||
### Dependencies Vérifiées
|
||||
```json
|
||||
{
|
||||
"@adonisjs/inertia": "^1.0",
|
||||
"@inertiajs/vue3": "^1.0",
|
||||
"@adonisjs/core": "^6.0",
|
||||
"vue": "^3.0",
|
||||
"tailwindcss": "^3.0",
|
||||
"@vuepic/vue-datepicker": "latest",
|
||||
"vue3-carousel": "latest",
|
||||
"vue-sonner": "latest"
|
||||
}
|
||||
```
|
||||
|
||||
## 🚨 Points d'Attention
|
||||
|
||||
1. **Base Données**: Assurez-vous que les modèles AdonisJS correspondent aux types TypeScript
|
||||
2. **Authentification**: Vérifier que les guards et middlewares d'auth sont correctement configurés
|
||||
3. **CSRF**: Vérifier que les tokens CSRF sont transmis correctement
|
||||
4. **Permissions**: Vérifier que le mode admin accès les bonnes données
|
||||
5. **Fichiers**: Adapter les chemins de fichiers uploadés si nécessaire
|
||||
|
||||
## 📝 Notes de Développement
|
||||
|
||||
### Modèles AdonisJS (À adapter)
|
||||
Les pages supposent les modèles suivants dans `app/models/`:
|
||||
- `Component` - Modèle de composant
|
||||
- `Computer` - Modèle d'ordinateur
|
||||
- `ComponentType` - Type de composant
|
||||
- `ComputerState` - État d'ordinateur
|
||||
- `User` - Utilisateur authentifié
|
||||
|
||||
### Types TypeScript
|
||||
Les types sont définis dans `inertia/pages/types/UITypes.ts` - adapter selon vos modèles réels
|
||||
|
||||
### Chemins d'Import
|
||||
L'alias `~/` est configuré pour pointer vers `inertia/`:
|
||||
- `~/pages/` → `inertia/pages/`
|
||||
- `~/composables/` → `inertia/composables/`
|
||||
- `~/directives/` → `inertia/directives/`
|
||||
- `~/assets/` → `inertia/assets/`
|
||||
|
||||
## 🎯 Résumé de la Migration
|
||||
|
||||
✅ **Tous les fichiers Inertia ont été migrés de pc-builder vers pc-builderV2**
|
||||
|
||||
### Fichiers Créés: 45+
|
||||
- 11 Pages Inertia
|
||||
- 4 Layouts
|
||||
- 10 Composants widgets
|
||||
- 18 Icônes SVG
|
||||
- 2 Composables
|
||||
- 3 Directives
|
||||
- 1 Fichier de types
|
||||
|
||||
### Fichiers Modifiés: 1
|
||||
- `inertia/app.ts` - Configuration complète pour AdonisJS V7
|
||||
|
||||
---
|
||||
|
||||
**Date:** Juin 2026
|
||||
**Status:** ✅ Terminé
|
||||
**Prochaine Étape:** Adapter les controllers et routes AdonisJS
|
||||
@@ -0,0 +1,218 @@
|
||||
# 🎉 Migration Complète - Pages Inertia PC Builder → PC Builder V2
|
||||
|
||||
## 📊 Statistiques
|
||||
|
||||
- **Fichiers Migrés:** 45+
|
||||
- **Pages Inertia:** 15
|
||||
- **Composants Widget:** 10
|
||||
- **Layouts:** 4
|
||||
- **Composables:** 2
|
||||
- **Directives:** 3
|
||||
- **Icônes SVG:** 18
|
||||
- **Fichiers Assets:** 2 (images)
|
||||
- **Fichiers de Configuration:** 1 (`app.ts`)
|
||||
|
||||
## ✅ Résultats
|
||||
|
||||
### Pages Inertia Créées (15)
|
||||
```
|
||||
✅ inertia/pages/auth/login.vue
|
||||
✅ inertia/pages/auth/signup.vue
|
||||
✅ inertia/pages/account/signup.vue
|
||||
✅ inertia/pages/components/index.vue
|
||||
✅ inertia/pages/components/create.vue
|
||||
✅ inertia/pages/components/edit.vue
|
||||
✅ inertia/pages/components/show.vue
|
||||
✅ inertia/pages/computers/index.vue
|
||||
✅ inertia/pages/computers/create.vue
|
||||
✅ inertia/pages/computers/edit.vue
|
||||
✅ inertia/pages/computers/show.vue
|
||||
✅ inertia/pages/errors/not_found.vue (mise à jour)
|
||||
✅ inertia/pages/errors/server_error.vue (mise à jour)
|
||||
✅ inertia/pages/layout/defaultLayout.vue
|
||||
✅ inertia/pages/layout/emptyLayout.vue
|
||||
```
|
||||
|
||||
### Layouts & Navigation (4)
|
||||
```
|
||||
✅ inertia/pages/layout/defaultLayout.vue
|
||||
✅ inertia/pages/layout/emptyLayout.vue
|
||||
✅ inertia/pages/layout/sidebar.vue
|
||||
✅ inertia/pages/layout/header.vue
|
||||
```
|
||||
|
||||
### Composants Réutilisables (10)
|
||||
```
|
||||
✅ inertia/pages/widgets/AuthErrorAlert.vue
|
||||
✅ inertia/pages/widgets/ComponentEditor.vue
|
||||
✅ inertia/pages/widgets/ComponentsViewer.vue
|
||||
✅ inertia/pages/widgets/ComputerCard.vue
|
||||
✅ inertia/pages/widgets/ComputerComponentsTable.vue
|
||||
✅ inertia/pages/widgets/ComputersViewer.vue
|
||||
✅ inertia/pages/widgets/DeleteConfirmationModal.vue
|
||||
✅ inertia/pages/widgets/SimpleGallery.vue
|
||||
✅ inertia/pages/widgets/TableComponent.vue
|
||||
✅ inertia/pages/widgets/ValidationError.vue
|
||||
```
|
||||
|
||||
### Composables (2)
|
||||
```
|
||||
✅ inertia/composables/isAdminMode.ts
|
||||
✅ inertia/composables/useSidebar.ts
|
||||
```
|
||||
|
||||
### Directives Personnalisées (3)
|
||||
```
|
||||
✅ inertia/directives/v_validation_error.ts
|
||||
✅ inertia/directives/v-delete-confirm.ts
|
||||
✅ inertia/directives/v-price.ts
|
||||
```
|
||||
|
||||
### Assets Copiés
|
||||
```
|
||||
✅ inertia/assets/icons/ (18 fichiers SVG)
|
||||
✅ inertia/assets/images/ (2 fichiers)
|
||||
✅ inertia/pages/types/UITypes.ts (types TypeScript)
|
||||
```
|
||||
|
||||
### Configuration Mise à Jour
|
||||
```
|
||||
✅ inertia/app.ts (configuration complète pour AdonisJS V7)
|
||||
```
|
||||
|
||||
## 🎯 Fonctionnalités Incluées
|
||||
|
||||
### Layout Dynamique
|
||||
- ✅ DefaultLayout pour les pages authentifiées
|
||||
- ✅ EmptyLayout pour pages d'authentification
|
||||
- ✅ Sélection automatique basée sur la route
|
||||
|
||||
### Composants Globaux
|
||||
- ✅ VueDatePicker pour sélection de dates
|
||||
- ✅ Carousel/Slide pour galeries
|
||||
- ✅ Directives d'erreur de validation
|
||||
- ✅ Directive de confirmation avant suppression
|
||||
- ✅ Directive de formatage des prix
|
||||
|
||||
### Mode Admin
|
||||
- ✅ Toggle Admin/Classic mode
|
||||
- ✅ Affichage conditionnel des données sensibles
|
||||
- ✅ Persistance du mode via composable
|
||||
|
||||
### Navigation Responsive
|
||||
- ✅ Sidebar pliable sur mobile
|
||||
- ✅ Menu hamburger
|
||||
- ✅ Menu déroulant profil utilisateur
|
||||
|
||||
## 🔄 Conversion AdonisJS V6 → V7
|
||||
|
||||
### Changements Appliqués
|
||||
1. **Directives**: Import avec `// @ts-ignore` pour compatibilité
|
||||
2. **Composables**: Exportation simplifiée avec ref()
|
||||
3. **Types**: Utilisation de types génériques pour Page Props
|
||||
4. **Imports**: Chemins relatifs remplacés par alias `~/`
|
||||
|
||||
### Améliorations V7
|
||||
- ✅ Support natif de Tailwind CSS
|
||||
- ✅ Routing simplifié avec middleware
|
||||
- ✅ Meilleur support TypeScript
|
||||
- ✅ Configuration Vite optimisée
|
||||
|
||||
## 📦 Dépendances Requises
|
||||
|
||||
Vérifiez que votre `package.json` inclut:
|
||||
```json
|
||||
{
|
||||
"@adonisjs/inertia": "^1.0",
|
||||
"@inertiajs/vue3": "^1.0",
|
||||
"@vuepic/vue-datepicker": "latest",
|
||||
"vue3-carousel": "latest",
|
||||
"vue-sonner": "latest",
|
||||
"tailwindcss": "^3.0"
|
||||
}
|
||||
```
|
||||
|
||||
## 🚀 Prochaines Étapes
|
||||
|
||||
### 1. Valider la Structure (✓ Fait)
|
||||
- [x] Pages créées
|
||||
- [x] Composants copiés
|
||||
- [x] Assets migrés
|
||||
- [x] Configuration mise à jour
|
||||
|
||||
### 2. Adapter les Controllers AdonisJS
|
||||
- [ ] Créer/adapter les controllers pour chaque page
|
||||
- [ ] Implémenter les routes correspondantes
|
||||
- [ ] Adapter les retours Inertia avec les bonnes données
|
||||
|
||||
### 3. Tester les Fonctionnalités
|
||||
- [ ] Tester la navigation
|
||||
- [ ] Vérifier les formulaires
|
||||
- [ ] Tester les directives
|
||||
- [ ] Valider le design responsive
|
||||
|
||||
### 4. Affiner les Imports
|
||||
- [ ] Vérifier tous les chemins d'import
|
||||
- [ ] Adapter les types de modèles si nécessaire
|
||||
- [ ] Résoudre les imports circulaires si présents
|
||||
|
||||
## 📝 Documentation Générée
|
||||
|
||||
- `MIGRATION_PAGES_SUMMARY.md` - Résumé détaillé de la migration
|
||||
- `MIGRATION_CHECKLIST.md` - Checklist de validation
|
||||
- `MIGRATION_COMPLETE.md` - Ce fichier
|
||||
|
||||
## 🎓 Guide Rapide
|
||||
|
||||
### Créer une Nouvelle Page
|
||||
```vue
|
||||
<!-- inertia/pages/example.vue -->
|
||||
<script setup lang="ts">
|
||||
import { Link } from '@inertiajs/vue3'
|
||||
|
||||
defineProps<{ data: any[] }>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container">
|
||||
<!-- Votre contenu -->
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
### Ajouter une Directive Personnalisée
|
||||
```vue
|
||||
<input
|
||||
v-validation-error="getErrorMessage('email')"
|
||||
type="email"
|
||||
placeholder="Email"
|
||||
/>
|
||||
```
|
||||
|
||||
### Utiliser un Composable
|
||||
```typescript
|
||||
import { useSidebar } from '~/composables/useSidebar'
|
||||
|
||||
const { isOpen } = useSidebar()
|
||||
```
|
||||
|
||||
## ⚠️ Points Critiques
|
||||
|
||||
1. **Base de Données**: Mettre à jour les schémas si différents
|
||||
2. **Authentification**: Configurer les guards correctement
|
||||
3. **CSRF**: Inclure les tokens dans les formulaires
|
||||
4. **Uploads**: Adapter les chemins de fichiers
|
||||
5. **Permissions**: Vérifier l'accès aux données sensibles
|
||||
|
||||
## 🎉 Status: COMPLET
|
||||
|
||||
✅ Migration des pages Inertia de pc-builder → pc-builderV2 **TERMINÉE**
|
||||
|
||||
La structure Inertia est maintenant prête pour l'intégration avec les controllers et routes AdonisJS V7.
|
||||
|
||||
---
|
||||
|
||||
**Date de Migration:** Juin 2026
|
||||
**Version Source:** pc-builder (AdonisJS V6)
|
||||
**Version Cible:** pc-builderV2 (AdonisJS V7)
|
||||
**Statut:** ✅ Complet
|
||||
@@ -0,0 +1,164 @@
|
||||
# Migration des Pages Inertia - PC Builder V2
|
||||
|
||||
## 📋 Résumé de la Migration
|
||||
|
||||
Toutes les pages Inertia du projet **pc-builder** ont été migrées vers **pc-builderV2** avec AdonisJS V7.
|
||||
|
||||
## ✅ Pages Migrées
|
||||
|
||||
### Pages d'Authentification (auth/)
|
||||
- ✅ `auth/login.vue` - Page de connexion
|
||||
- ✅ `auth/signup.vue` - Page d'inscription
|
||||
- ✅ `account/signup.vue` - Page de création de compte (redondant)
|
||||
|
||||
### Pages de Composants (components/)
|
||||
- ✅ `components/index.vue` - Liste des composants
|
||||
- ✅ `components/create.vue` - Création d'un composant
|
||||
- ✅ `components/edit.vue` - Édition d'un composant
|
||||
- ✅ `components/show.vue` - Détails d'un composant
|
||||
|
||||
### Pages d'Ordinateurs (computers/)
|
||||
- ✅ `computers/index.vue` - Liste des ordinateurs
|
||||
- ✅ `computers/create.vue` - Création d'un ordinateur
|
||||
- ✅ `computers/edit.vue` - Édition d'un ordinateur
|
||||
- ✅ `computers/show.vue` - Détails d'un ordinateur
|
||||
|
||||
### Pages d'Erreur (errors/)
|
||||
- ✅ `errors/not_found.vue` - Page 404 (mise à jour avec style)
|
||||
- ✅ `errors/server_error.vue` - Page 500 (mise à jour avec style)
|
||||
|
||||
### Layouts (pages/layout/)
|
||||
- ✅ `layout/defaultLayout.vue` - Layout principal avec sidebar et header
|
||||
- ✅ `layout/emptyLayout.vue` - Layout vide pour auth
|
||||
- ✅ `layout/sidebar.vue` - Barre latérale de navigation
|
||||
- ✅ `layout/header.vue` - En-tête avec profil utilisateur
|
||||
|
||||
### Composants Réutilisables (pages/widgets/)
|
||||
- ✅ `AuthErrorAlert.vue` - Alerte d'erreur d'authentification
|
||||
- ✅ `ComponentEditor.vue` - Éditeur de composants
|
||||
- ✅ `ComponentsViewer.vue` - Visionneuse de composants
|
||||
- ✅ `ComputerCard.vue` - Carte d'ordinateur
|
||||
- ✅ `ComputerComponentsTable.vue` - Table de composants d'ordinateur
|
||||
- ✅ `ComputersViewer.vue` - Visionneuse d'ordinateurs
|
||||
- ✅ `DeleteConfirmationModal.vue` - Modal de confirmation de suppression
|
||||
- ✅ `SimpleGallery.vue` - Galerie simple
|
||||
- ✅ `TableComponent.vue` - Composant de table
|
||||
- ✅ `ValidationError.vue` - Afficheur d'erreurs de validation
|
||||
|
||||
## 🎯 Ressources Copiées
|
||||
|
||||
### Assets (inertia/assets/)
|
||||
- ✅ **Icons/** - 18 fichiers SVG d'icônes
|
||||
- case.svg, cooler.svg, cpu.svg, cross-icon.svg, default-icon.svg
|
||||
- fan.svg, graphic-card.svg, hard-drive.svg, memory.svg, motherboard.svg
|
||||
- mvne.svg, power-supply.svg, site-icon-with-title.svg, site-icon.svg
|
||||
- trash-icon.svg, user-profile-icon.svg, wifi-card.svg, index.ts
|
||||
|
||||
- ✅ **Images/** - Images utilitaires
|
||||
- no-Image-placeholder.svg, index.ts
|
||||
|
||||
### Composables (inertia/composables/)
|
||||
- ✅ `isAdminMode.ts` - Gestion du mode admin
|
||||
- ✅ `useSidebar.ts` - Gestion de la sidebar
|
||||
|
||||
### Directives (inertia/directives/)
|
||||
- ✅ `v_validation_error.ts` - Directive pour afficher les erreurs de validation
|
||||
- ✅ `v-delete-confirm.ts` - Directive pour confirmation avant suppression
|
||||
- ✅ `v-price.ts` - Directive pour formatage des prix
|
||||
|
||||
### Types (inertia/pages/types/)
|
||||
- ✅ `UITypes.ts` - Types TypeScript pour l'interface utilisateur
|
||||
|
||||
## 🔧 Modifications AdonisJS V7
|
||||
|
||||
### app.ts - Mise à jour
|
||||
Le fichier `inertia/app.ts` a été mis à jour pour :
|
||||
1. Inclure les imports de directives
|
||||
2. Ajouter les composants globaux (VueDatePicker, Carousel, Slide)
|
||||
3. Implémenter la logique de sélection de layout dynamique
|
||||
4. Enregistrer les directives personnalisées
|
||||
|
||||
### Structure de répertoires
|
||||
```
|
||||
inertia/
|
||||
├── app.ts (mis à jour)
|
||||
├── client.ts
|
||||
├── ssr.ts
|
||||
├── assets/
|
||||
│ ├── icons/
|
||||
│ └── images/
|
||||
├── composables/
|
||||
│ ├── isAdminMode.ts
|
||||
│ └── useSidebar.ts
|
||||
├── directives/
|
||||
│ ├── v_validation_error.ts
|
||||
│ ├── v-delete-confirm.ts
|
||||
│ └── v-price.ts
|
||||
├── pages/
|
||||
│ ├── auth/
|
||||
│ │ ├── login.vue
|
||||
│ │ └── signup.vue
|
||||
│ ├── account/
|
||||
│ │ └── signup.vue
|
||||
│ ├── components/
|
||||
│ │ ├── index.vue
|
||||
│ │ ├── create.vue
|
||||
│ │ ├── edit.vue
|
||||
│ │ └── show.vue
|
||||
│ ├── computers/
|
||||
│ │ ├── index.vue
|
||||
│ │ ├── create.vue
|
||||
│ │ ├── edit.vue
|
||||
│ │ └── show.vue
|
||||
│ ├── errors/
|
||||
│ │ ├── not_found.vue
|
||||
│ │ └── server_error.vue
|
||||
│ ├── layout/
|
||||
│ │ ├── defaultLayout.vue
|
||||
│ │ ├── emptyLayout.vue
|
||||
│ │ ├── sidebar.vue
|
||||
│ │ └── header.vue
|
||||
│ ├── types/
|
||||
│ │ └── UITypes.ts
|
||||
│ └── widgets/
|
||||
│ ├── AuthErrorAlert.vue
|
||||
│ ├── ComponentEditor.vue
|
||||
│ ├── ComponentsViewer.vue
|
||||
│ ├── ComputerCard.vue
|
||||
│ ├── ComputerComponentsTable.vue
|
||||
│ ├── ComputersViewer.vue
|
||||
│ ├── DeleteConfirmationModal.vue
|
||||
│ ├── SimpleGallery.vue
|
||||
│ ├── TableComponent.vue
|
||||
│ └── ValidationError.vue
|
||||
└── css/
|
||||
└── app.css (existant)
|
||||
```
|
||||
|
||||
## 🎨 Améliorations Apportées
|
||||
|
||||
1. **Pages d'erreur** - Mise à jour avec design cohérent et boutons de navigation
|
||||
2. **Layout dynamique** - Sélection automatique du layout en fonction de la route
|
||||
3. **Admin mode toggle** - Basculer entre mode admin et mode classique
|
||||
4. **Intégration complète** - Toutes les directives et composants sont disponibles
|
||||
|
||||
## 📝 Notes Importantes
|
||||
|
||||
- Les chemins des imports utilisent les alias Vite (~/) configurés dans `tsconfig.inertia.json`
|
||||
- Les composants et directives sont enregistrés globalement dans `app.ts`
|
||||
- La structure de layout suit le pattern de pc-builder avec DefaultLayout et EmptyLayout
|
||||
- Les widgets réutilisables sont dans `pages/widgets/` pour maintenir la compatibilité
|
||||
|
||||
## 🚀 Prochaines Étapes
|
||||
|
||||
1. Vérifier que tous les imports sont corrects dans les controllers AdonisJS
|
||||
2. Adapter les types de modèles si nécessaire
|
||||
3. Tester la navigation et les layouts
|
||||
4. Vérifier les directives v-validation-error, v-price, v-delete-confirm
|
||||
5. Adapter les appels API selon la structure V7
|
||||
|
||||
---
|
||||
|
||||
**Date de migration:** Juin 2026
|
||||
**Source:** pc-builder
|
||||
**Destination:** pc-builderV2 (AdonisJS V7)
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| JavaScript entrypoint for running ace commands
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| DO NOT MODIFY THIS FILE AS IT WILL BE OVERRIDDEN DURING THE BUILD
|
||||
| PROCESS.
|
||||
|
|
||||
| See docs.adonisjs.com/guides/typescript-build-process#creating-production-build
|
||||
|
|
||||
| Since, we cannot run TypeScript source code using "node" binary, we need
|
||||
| a JavaScript entrypoint to run ace commands.
|
||||
|
|
||||
| This file registers the "ts-node/esm" hook with the Node.js module system
|
||||
| and then imports the "bin/console.ts" file.
|
||||
|
|
||||
*/
|
||||
|
||||
/**
|
||||
* Register hook to process TypeScript files using @poppinss/ts-exec
|
||||
*/
|
||||
import '@poppinss/ts-exec'
|
||||
|
||||
/**
|
||||
* Import ace console entrypoint
|
||||
*/
|
||||
await import('./bin/console.js')
|
||||
+138
@@ -0,0 +1,138 @@
|
||||
import { indexPages } from '@adonisjs/inertia'
|
||||
import { indexEntities } from '@adonisjs/core'
|
||||
import { defineConfig } from '@adonisjs/core/app'
|
||||
import { generateRegistry } from '@tuyau/core/hooks'
|
||||
|
||||
export default defineConfig({
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Experimental flags
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following features will be enabled by default in the next major release
|
||||
| of AdonisJS. You can opt into them today to avoid any breaking changes
|
||||
| during upgrade.
|
||||
|
|
||||
*/
|
||||
experimental: {},
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Commands
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| List of ace commands to register from packages. The application commands
|
||||
| will be scanned automatically from the "./commands" directory.
|
||||
|
|
||||
*/
|
||||
commands: [
|
||||
() => import('@adonisjs/core/commands'),
|
||||
() => import('@adonisjs/lucid/commands'),
|
||||
() => import('@adonisjs/session/commands'),
|
||||
() => import('@adonisjs/inertia/commands'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Service providers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| List of service providers to import and register when booting the
|
||||
| application
|
||||
|
|
||||
*/
|
||||
providers: [
|
||||
() => import('@adonisjs/core/providers/app_provider'),
|
||||
() => import('@adonisjs/core/providers/hash_provider'),
|
||||
{
|
||||
file: () => import('@adonisjs/core/providers/repl_provider'),
|
||||
environment: ['repl', 'test'],
|
||||
},
|
||||
() => import('@adonisjs/core/providers/vinejs_provider'),
|
||||
() => import('@adonisjs/core/providers/edge_provider'),
|
||||
() => import('@adonisjs/session/session_provider'),
|
||||
() => import('@adonisjs/vite/vite_provider'),
|
||||
() => import('@adonisjs/shield/shield_provider'),
|
||||
() => import('@adonisjs/static/static_provider'),
|
||||
() => import('@adonisjs/lucid/database_provider'),
|
||||
() => import('@adonisjs/cors/cors_provider'),
|
||||
() => import('@adonisjs/inertia/inertia_provider'),
|
||||
() => import('@adonisjs/auth/auth_provider'),
|
||||
() => import('#providers/api_provider'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Preloads
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| List of modules to import before starting the application.
|
||||
|
|
||||
*/
|
||||
preloads: [
|
||||
() => import('#start/routes'),
|
||||
() => import('#start/kernel'),
|
||||
() => import('#start/validator'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Tests
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| List of test suites to organize tests by their type. Feel free to remove
|
||||
| and add additional suites.
|
||||
|
|
||||
*/
|
||||
tests: {
|
||||
suites: [
|
||||
{
|
||||
files: ['tests/unit/**/*.spec.{ts,js}'],
|
||||
name: 'unit',
|
||||
timeout: 2000,
|
||||
},
|
||||
{
|
||||
files: ['tests/functional/**/*.spec.{ts,js}'],
|
||||
name: 'functional',
|
||||
timeout: 30000,
|
||||
},
|
||||
{
|
||||
files: ['tests/browser/**/*.spec.{ts,js}'],
|
||||
name: 'browser',
|
||||
timeout: 300000,
|
||||
},
|
||||
],
|
||||
forceExit: false,
|
||||
},
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Metafiles
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| A collection of files you want to copy to the build folder when creating
|
||||
| the production build.
|
||||
|
|
||||
*/
|
||||
metaFiles: [
|
||||
{
|
||||
pattern: 'resources/views/**/*.edge',
|
||||
reloadServer: false,
|
||||
},
|
||||
{
|
||||
pattern: 'public/**',
|
||||
reloadServer: false,
|
||||
},
|
||||
],
|
||||
|
||||
hooks: {
|
||||
init: [
|
||||
indexEntities({
|
||||
transformers: { enabled: true, withSharedProps: true },
|
||||
}),
|
||||
indexPages({ framework: 'vue3' }),
|
||||
generateRegistry(),
|
||||
],
|
||||
buildStarting: [() => import('@adonisjs/vite/build_hook')],
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,77 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import { storeComponentValidator } from '#validators/Components/store'
|
||||
import { updateComponentValidator } from '#validators/Components/update'
|
||||
import Component from '#models/component'
|
||||
import ComponentType from '#models/component_type'
|
||||
|
||||
export default class ComponentsController {
|
||||
async index({ inertia, auth }: HttpContext) {
|
||||
const user = await auth.authenticate()
|
||||
const components = await Component.query()
|
||||
.preload('type')
|
||||
.where('userId', user.id)
|
||||
return inertia.render('components/index', { components })
|
||||
}
|
||||
|
||||
async create({ inertia }: HttpContext) {
|
||||
const types = await ComponentType.all()
|
||||
return inertia.render('components/create', { types })
|
||||
}
|
||||
|
||||
async store({ request, response, auth }: HttpContext) {
|
||||
const data = request.all()
|
||||
const user = await auth.authenticate()
|
||||
const { quantity, ...componentData } = await storeComponentValidator.validate(data)
|
||||
await ComponentType.findOrFail(componentData.typeId)
|
||||
for (let i = 0; i < quantity; i++) {
|
||||
await Component.create({
|
||||
...componentData,
|
||||
userId: user.id,
|
||||
})
|
||||
}
|
||||
response.redirect('/components')
|
||||
}
|
||||
|
||||
async show({ params, auth, inertia }: HttpContext) {
|
||||
const user = await auth.authenticate()
|
||||
const componentId = params.id
|
||||
const component = await Component.query()
|
||||
.preload('type')
|
||||
.where('userId', user.id)
|
||||
.andWhere('id', componentId)
|
||||
.firstOrFail()
|
||||
return inertia.render('components/show', { component })
|
||||
}
|
||||
|
||||
async edit({ params, auth, inertia }: HttpContext) {
|
||||
const user = await auth.authenticate()
|
||||
const types = await ComponentType.all()
|
||||
const componentId = params.id
|
||||
const component = await Component.query()
|
||||
.preload('type')
|
||||
.where('userId', user.id)
|
||||
.andWhere('id', componentId)
|
||||
.firstOrFail()
|
||||
return inertia.render('components/edit', { component, types })
|
||||
}
|
||||
|
||||
async update({ params, auth, request, response }: HttpContext) {
|
||||
const data = request.all()
|
||||
const componentData = await updateComponentValidator.validate(data)
|
||||
const user = await auth.authenticate()
|
||||
const component = await Component.query()
|
||||
.where('userId', user.id)
|
||||
.andWhere('id', params.id)
|
||||
.firstOrFail()
|
||||
component.merge(componentData)
|
||||
await component.save()
|
||||
return response.redirect('/components')
|
||||
}
|
||||
|
||||
async destroy({ params, response }: HttpContext) {
|
||||
const componentId = params.id
|
||||
const component = await Component.findOrFail(componentId)
|
||||
await component.delete()
|
||||
return response.redirect('/components')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import Computer from '#models/computer'
|
||||
import ComputerState from '#models/computer_state'
|
||||
import Component from '#models/component'
|
||||
import { storeComputerValidator } from '#validators/Computers/store'
|
||||
import { handleComponents } from '#services/component_service'
|
||||
import { handlePictures } from '#services/picture_service'
|
||||
import type { Image } from '#types/UItypes'
|
||||
import { updateComputerValidator } from '#validators/Computers/update'
|
||||
|
||||
export default class ComputersController {
|
||||
async index({ auth, inertia }: HttpContext) {
|
||||
const user = await auth.authenticate()
|
||||
const computers = await Computer.query()
|
||||
.where('user_id', user.id)
|
||||
.preload('state')
|
||||
.preload('components')
|
||||
.preload('pictures', (picturesQuery) => {
|
||||
picturesQuery.where('order', 1)
|
||||
})
|
||||
|
||||
return inertia.render('computers/index', { computers })
|
||||
}
|
||||
|
||||
async create({ auth, inertia }: HttpContext) {
|
||||
const user = await auth.authenticate()
|
||||
const states = await ComputerState.all()
|
||||
const components = await Component.query()
|
||||
.where('userId', user.id)
|
||||
.whereNull('computerId')
|
||||
.preload('type')
|
||||
return inertia.render('computers/create', { components, states })
|
||||
}
|
||||
|
||||
async store({ auth, request, response }: HttpContext) {
|
||||
const data = request.all()
|
||||
const user = await auth.authenticate()
|
||||
const { pictures, componentsId, ...computerData } = await storeComputerValidator.validate(data)
|
||||
await ComputerState.findOrFail(computerData.stateId)
|
||||
const computer = await Computer.create({
|
||||
...computerData,
|
||||
userId: user.id,
|
||||
})
|
||||
await handleComponents(componentsId as number[], computer)
|
||||
await handlePictures(pictures as Image[], request, computer)
|
||||
return response.redirect('computers/')
|
||||
}
|
||||
|
||||
async show({ auth, inertia, params }: HttpContext) {
|
||||
const user = await auth.authenticate()
|
||||
const computerId = params.id
|
||||
const computer = await Computer.query()
|
||||
.preload('state')
|
||||
.preload('components', (componentsQuery) => {
|
||||
componentsQuery.preload('type')
|
||||
})
|
||||
.preload('pictures', (picturesQuery) => {
|
||||
picturesQuery.orderBy('order')
|
||||
})
|
||||
.where('user_id', user.id)
|
||||
.andWhere('id', computerId)
|
||||
.firstOrFail()
|
||||
return inertia.render('computers/show', { computer })
|
||||
}
|
||||
|
||||
async edit({ params, inertia, auth }: HttpContext) {
|
||||
const user = await auth.authenticate()
|
||||
const states = await ComputerState.all()
|
||||
const computerId = params.id
|
||||
|
||||
const computer = await Computer.query()
|
||||
.preload('state')
|
||||
.preload('components', (componentsQuery) => {
|
||||
componentsQuery.preload('type')
|
||||
})
|
||||
.preload('pictures')
|
||||
.where('user_id', user.id)
|
||||
.andWhere('id', computerId)
|
||||
.firstOrFail()
|
||||
|
||||
const availableComponents = await Component.query()
|
||||
.preload('type')
|
||||
.where('user_id', user.id)
|
||||
.whereNull('computer_id')
|
||||
.whereNotIn(
|
||||
'id',
|
||||
computer.components.map((c) => c.id)
|
||||
)
|
||||
return inertia.render('computers/edit', { computer, availableComponents, states })
|
||||
}
|
||||
|
||||
async update({ params, request, response }: HttpContext) {
|
||||
const computerId = params.id
|
||||
const { pictures, componentsId, ...computerData } = await updateComputerValidator.validate(
|
||||
request.all()
|
||||
)
|
||||
const computer = await Computer.findOrFail(computerId)
|
||||
computer.merge(computerData)
|
||||
await computer.save()
|
||||
await handleComponents(componentsId as number[], computer)
|
||||
await handlePictures(pictures as Image[], request, computer)
|
||||
return response.redirect(`${computer.id}`)
|
||||
}
|
||||
|
||||
async destroy({ params, response }: HttpContext) {
|
||||
const computerId = params.id
|
||||
const computer = await Computer.findOrFail(computerId)
|
||||
await computer.delete()
|
||||
return response.redirect('/computers')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import User from '#models/user'
|
||||
import { signupValidator } from '#validators/user'
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
|
||||
export default class NewAccountController {
|
||||
async create({ inertia }: HttpContext) {
|
||||
return inertia.render('auth/signup', {})
|
||||
}
|
||||
|
||||
async store({ request, response, auth }: HttpContext) {
|
||||
const payload = await request.validateUsing(signupValidator)
|
||||
const user = await User.create({ ...payload })
|
||||
|
||||
await auth.use('web').login(user)
|
||||
response.redirect().toRoute('home')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import { loginValidator } from '#validators/Auth/login'
|
||||
import User from '#models/user'
|
||||
|
||||
export default class SessionController {
|
||||
async create({ inertia }: HttpContext) {
|
||||
return inertia.render('auth/login', {})
|
||||
}
|
||||
|
||||
async store({ request, auth, response }: HttpContext) {
|
||||
const payload = await request.validateUsing(loginValidator)
|
||||
const user = await User.verifyCredentials(payload.email, payload.password)
|
||||
await auth.use('web').login(user)
|
||||
response.redirect('/computers')
|
||||
}
|
||||
|
||||
async destroy({ auth, response }: HttpContext) {
|
||||
await auth.use('web').logout()
|
||||
response.redirect('/auth/login')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
import app from '@adonisjs/core/services/app'
|
||||
import { type HttpContext, ExceptionHandler } from '@adonisjs/core/http'
|
||||
import type { StatusPageRange, StatusPageRenderer } from '@adonisjs/core/types/http'
|
||||
|
||||
export default class HttpExceptionHandler extends ExceptionHandler {
|
||||
/**
|
||||
* In debug mode, the exception handler will display verbose errors
|
||||
* with pretty printed stack traces.
|
||||
*/
|
||||
protected debug = !app.inProduction
|
||||
|
||||
/**
|
||||
* Status pages are used to display a custom HTML pages for certain error
|
||||
* codes. You might want to enable them in production only, but feel
|
||||
* free to enable them in development as well.
|
||||
*/
|
||||
protected renderStatusPages = app.inProduction
|
||||
|
||||
/**
|
||||
* Status pages is a collection of error code range and a callback
|
||||
* to return the HTML contents to send as a response.
|
||||
*/
|
||||
protected statusPages: Record<StatusPageRange, StatusPageRenderer> = {
|
||||
'404': (_, { inertia }) => inertia.render('errors/not_found', {}),
|
||||
'500..599': (_, { inertia }) => inertia.render('errors/server_error', {}),
|
||||
}
|
||||
|
||||
/**
|
||||
* The method is used for handling errors and returning
|
||||
* response to the client
|
||||
*/
|
||||
async handle(error: unknown, ctx: HttpContext) {
|
||||
return super.handle(error, ctx)
|
||||
}
|
||||
|
||||
/**
|
||||
* The method is used to report error to the logging service or
|
||||
* the a third party error monitoring service.
|
||||
*
|
||||
* @note You should not attempt to send a response from this method.
|
||||
*/
|
||||
async report(error: unknown, ctx: HttpContext) {
|
||||
return super.report(error, ctx)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import type { NextFn } from '@adonisjs/core/types/http'
|
||||
import type { Authenticators } from '@adonisjs/auth/types'
|
||||
|
||||
export default class AuthMiddleware {
|
||||
redirectTo = '/auth/login'
|
||||
|
||||
async handle(
|
||||
ctx: HttpContext,
|
||||
next: NextFn,
|
||||
options: { guards?: (keyof Authenticators)[] } = {}
|
||||
) {
|
||||
await ctx.auth.authenticateUsing(options.guards, { loginRoute: this.redirectTo })
|
||||
return next()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import { Logger } from '@adonisjs/core/logger'
|
||||
import { HttpContext } from '@adonisjs/core/http'
|
||||
import { type NextFn } from '@adonisjs/core/types/http'
|
||||
|
||||
/**
|
||||
* The container bindings middleware binds classes to their request
|
||||
* specific value using the container resolver.
|
||||
*
|
||||
* - We bind "HttpContext" class to the "ctx" object
|
||||
* - And bind "Logger" class to the "ctx.logger" object
|
||||
*/
|
||||
export default class ContainerBindingsMiddleware {
|
||||
handle(ctx: HttpContext, next: NextFn) {
|
||||
ctx.containerResolver.bindValue(HttpContext, ctx)
|
||||
ctx.containerResolver.bindValue(Logger, ctx.logger)
|
||||
|
||||
return next()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import type { NextFn } from '@adonisjs/core/types/http'
|
||||
import type { Authenticators } from '@adonisjs/auth/types'
|
||||
|
||||
/**
|
||||
* Guest middleware is used to deny access to routes that should
|
||||
* be accessed by unauthenticated users.
|
||||
*
|
||||
* For example, the login page should not be accessible if the user
|
||||
* is already logged-in
|
||||
*/
|
||||
export default class GuestMiddleware {
|
||||
/**
|
||||
* The URL to redirect to when user is logged-in
|
||||
*/
|
||||
redirectTo = '/computers'
|
||||
|
||||
async handle(
|
||||
ctx: HttpContext,
|
||||
next: NextFn,
|
||||
options: { guards?: (keyof Authenticators)[] } = {}
|
||||
) {
|
||||
for (let guard of options.guards || [ctx.auth.defaultGuard]) {
|
||||
if (await ctx.auth.use(guard).check()) {
|
||||
ctx.session.reflash()
|
||||
return ctx.response.redirect(this.redirectTo, true)
|
||||
}
|
||||
}
|
||||
|
||||
return next()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import type { NextFn } from '@adonisjs/core/types/http'
|
||||
import UserTransformer from '#transformers/user_transformer'
|
||||
import BaseInertiaMiddleware from '@adonisjs/inertia/inertia_middleware'
|
||||
|
||||
export default class InertiaMiddleware extends BaseInertiaMiddleware {
|
||||
share(ctx: HttpContext) {
|
||||
/**
|
||||
* The share method is called everytime an Inertia page is rendered. In
|
||||
* certain cases, a page may get rendered before the session middleware
|
||||
* or the auth middleware are executed. For example: During a 404 request.
|
||||
*
|
||||
* In that case, we must always assume that HttpContext is not fully hydrated
|
||||
* with all the properties
|
||||
*/
|
||||
const { session, auth } = ctx as Partial<HttpContext>
|
||||
|
||||
/**
|
||||
* Fetching the first error from the flash messages
|
||||
*/
|
||||
const error = session?.flashMessages.get('error') as string
|
||||
const success = session?.flashMessages.get('success') as string
|
||||
|
||||
/**
|
||||
* Data shared with all Inertia pages. Make sure you are using
|
||||
* transformers for rich data-types like Models.
|
||||
*/
|
||||
return {
|
||||
errors: ctx.inertia.always(this.getValidationErrors(ctx)),
|
||||
flash: ctx.inertia.always({
|
||||
error,
|
||||
success,
|
||||
}),
|
||||
user: ctx.inertia.always(auth?.user ? UserTransformer.transform(auth.user) : undefined),
|
||||
}
|
||||
}
|
||||
|
||||
async handle(ctx: HttpContext, next: NextFn) {
|
||||
await this.init(ctx)
|
||||
|
||||
const output = await next()
|
||||
this.dispose(ctx)
|
||||
|
||||
return output
|
||||
}
|
||||
}
|
||||
|
||||
declare module '@adonisjs/inertia/types' {
|
||||
type MiddlewareSharedProps = InferSharedProps<InertiaMiddleware>
|
||||
export interface SharedProps extends MiddlewareSharedProps {}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import type { NextFn } from '@adonisjs/core/types/http'
|
||||
|
||||
/**
|
||||
* Silent auth middleware can be used as a global middleware to silent check
|
||||
* if the user is logged-in or not.
|
||||
*
|
||||
* The request continues as usual, even when the user is not logged-in.
|
||||
*/
|
||||
export default class SilentAuthMiddleware {
|
||||
async handle(ctx: HttpContext, next: NextFn) {
|
||||
await ctx.auth.check()
|
||||
|
||||
return next()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import { DateTime } from 'luxon'
|
||||
import { BaseModel, belongsTo, column } from '@adonisjs/lucid/orm'
|
||||
import ComponentType from '#models/component_type'
|
||||
import type { BelongsTo } from '@adonisjs/lucid/types/relations'
|
||||
|
||||
export default class Component extends BaseModel {
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
|
||||
@column()
|
||||
declare name: string
|
||||
|
||||
@column()
|
||||
declare price: number
|
||||
|
||||
@column({ serializeAs: null })
|
||||
declare typeId: number
|
||||
|
||||
@belongsTo(() => ComponentType, {
|
||||
foreignKey: 'typeId',
|
||||
})
|
||||
declare type: BelongsTo<typeof ComponentType>
|
||||
|
||||
@column()
|
||||
declare computerId: number | null
|
||||
|
||||
@column({ serializeAs: null })
|
||||
declare userId: number
|
||||
|
||||
@column.date()
|
||||
declare purchaseDate: DateTime
|
||||
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime
|
||||
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import { BaseModel, column } from '@adonisjs/lucid/orm'
|
||||
|
||||
export default class ComponentType extends BaseModel {
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
|
||||
@column()
|
||||
declare name: string
|
||||
|
||||
@column()
|
||||
declare unique: boolean
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import { DateTime } from 'luxon'
|
||||
import { BaseModel, belongsTo, column, computed, hasMany } from '@adonisjs/lucid/orm'
|
||||
import type { BelongsTo, HasMany } from '@adonisjs/lucid/types/relations'
|
||||
import ComputerState from '#models/computer_state'
|
||||
import ComputerPicture from '#models/computer_picture'
|
||||
import Component from '#models/component'
|
||||
|
||||
export default class Computer extends BaseModel {
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
|
||||
@column()
|
||||
declare title: string
|
||||
|
||||
@column()
|
||||
declare sellPrice: number
|
||||
|
||||
@column()
|
||||
declare gpuScore: number
|
||||
|
||||
@column()
|
||||
declare cpuScore: number
|
||||
|
||||
@column()
|
||||
declare globalScore: number
|
||||
|
||||
@column({ serializeAs: null })
|
||||
declare stateId: number
|
||||
|
||||
@belongsTo(() => ComputerState, {
|
||||
foreignKey: 'stateId',
|
||||
})
|
||||
declare state: BelongsTo<typeof ComputerState>
|
||||
|
||||
@hasMany(() => Component)
|
||||
declare components: HasMany<typeof Component>
|
||||
|
||||
@hasMany(() => ComputerPicture, {
|
||||
foreignKey: 'computerId',
|
||||
})
|
||||
declare pictures: HasMany<typeof ComputerPicture>
|
||||
|
||||
@column({ serializeAs: null })
|
||||
declare userId: number
|
||||
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime
|
||||
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
|
||||
@computed()
|
||||
get cost(): number {
|
||||
if (!this.$preloaded.components) {
|
||||
console.warn('Components not preloaded, cost may be incorrect')
|
||||
return 0
|
||||
}
|
||||
return this.components.reduce((total, component) => total + Number(component.price), 0)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
import { DateTime } from 'luxon'
|
||||
import { BaseModel, belongsTo, column } from '@adonisjs/lucid/orm'
|
||||
import Computer from '#models/computer'
|
||||
import type { BelongsTo } from '@adonisjs/lucid/types/relations'
|
||||
|
||||
export default class ComputerPicture extends BaseModel {
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
|
||||
@column()
|
||||
declare computerId: number
|
||||
|
||||
@column()
|
||||
declare link: string
|
||||
|
||||
@column()
|
||||
declare order: number
|
||||
|
||||
@belongsTo(() => Computer)
|
||||
declare computer: BelongsTo<typeof Computer>
|
||||
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime
|
||||
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { BaseModel, column } from '@adonisjs/lucid/orm'
|
||||
|
||||
export default class ComputerState extends BaseModel {
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
|
||||
@column()
|
||||
declare name: string
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { DateTime } from 'luxon'
|
||||
import hash from '@adonisjs/core/services/hash'
|
||||
import { compose } from '@adonisjs/core/helpers'
|
||||
import { BaseModel, column } from '@adonisjs/lucid/orm'
|
||||
import { withAuthFinder } from '@adonisjs/auth/mixins/lucid'
|
||||
|
||||
const AuthFinder = withAuthFinder(() => hash.use('scrypt'), {
|
||||
uids: ['email'],
|
||||
passwordColumnName: 'password',
|
||||
})
|
||||
|
||||
export default class User extends compose(BaseModel, AuthFinder) {
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
|
||||
@column()
|
||||
declare name: string | null
|
||||
|
||||
@column()
|
||||
declare email: string
|
||||
|
||||
@column({ serializeAs: null })
|
||||
declare password: string
|
||||
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime
|
||||
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import Component from '#models/component'
|
||||
import Computer from '#models/computer'
|
||||
|
||||
async function handleComponents(componentsId: number[], computer: Computer) {
|
||||
const currentComponents = await computer.related('components').query()
|
||||
const currentComponentsIds = currentComponents.map((component) => component.id)
|
||||
const componentsToAdd = componentsId.filter((id) => !currentComponentsIds.includes(id))
|
||||
const componentsToRemove = currentComponentsIds.filter((id) => !componentsId.includes(id))
|
||||
await Promise.all(
|
||||
componentsToAdd.map(async (id: number) => {
|
||||
const component = await Component.findOrFail(id)
|
||||
component.computerId = computer.id
|
||||
await component.save()
|
||||
})
|
||||
)
|
||||
await Promise.all(
|
||||
componentsToRemove.map(async (id: number) => {
|
||||
const component = await Component.findOrFail(id)
|
||||
component.computerId = null
|
||||
await component.save()
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export { handleComponents }
|
||||
@@ -0,0 +1,57 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import ComputerPicture from '#models/computer_picture'
|
||||
import Computer from '#models/computer'
|
||||
import { v4 as uuid } from 'uuid'
|
||||
import type { Image } from '#types/UItypes'
|
||||
import { existsSync, unlinkSync } from 'node:fs'
|
||||
|
||||
async function handlePictures(
|
||||
pictures: Image[],
|
||||
request: HttpContext['request'],
|
||||
computer: Computer
|
||||
) {
|
||||
const currentPictures = await computer.related('pictures').query()
|
||||
const currentPictureIds = currentPictures.map((picture) => picture.id)
|
||||
const imagesToRemove = currentPictureIds.filter(
|
||||
(id: number) => !pictures.some((picture) => 'id' in picture && picture.id === id)
|
||||
)
|
||||
|
||||
await Promise.all(
|
||||
pictures.map(async (picture: Image, index: number) => {
|
||||
if ('id' in picture) {
|
||||
const existingPicture = await ComputerPicture.findOrFail(picture.id)
|
||||
existingPicture.order = picture.order
|
||||
await existingPicture.save()
|
||||
} else {
|
||||
const image = request.file(`pictures[${index}][file]`, {
|
||||
size: '2mb',
|
||||
extnames: ['jpg', 'png', 'jpeg', 'svg'],
|
||||
})
|
||||
if (image) {
|
||||
const imageName = `img_${uuid()}.${image.extname}`
|
||||
await image.move(`uploads/computer_${computer.id}`, {
|
||||
name: imageName,
|
||||
})
|
||||
await ComputerPicture.create({
|
||||
computerId: computer.id,
|
||||
link: `/uploads/computer_${computer.id}/${imageName}`,
|
||||
order: picture.order,
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
await Promise.all(
|
||||
imagesToRemove.map(async (id: number) => {
|
||||
const picture = await ComputerPicture.findOrFail(id)
|
||||
const filePath = `uploads/computer_${computer.id}/${picture.link.split('/').pop()}`
|
||||
if (existsSync(filePath)) {
|
||||
unlinkSync(filePath)
|
||||
}
|
||||
await picture.delete()
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export { handlePictures }
|
||||
@@ -0,0 +1,13 @@
|
||||
import { BaseModel } from '@adonisjs/lucid/orm'
|
||||
|
||||
export default class UserTransformer {
|
||||
static exclude = ['password']
|
||||
|
||||
transform(user: BaseModel) {
|
||||
return {
|
||||
id: user.id,
|
||||
name: user.name,
|
||||
email: user.email,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import vine from '@vinejs/vine'
|
||||
|
||||
export const loginValidator = vine.compile(
|
||||
vine.object({
|
||||
email: vine.string().email(),
|
||||
password: vine.string().minLength(8).maxLength(32),
|
||||
})
|
||||
)
|
||||
@@ -0,0 +1,15 @@
|
||||
import vine from '@vinejs/vine'
|
||||
|
||||
export const registerValidator = vine.compile(
|
||||
vine.object({
|
||||
name: vine.string().minLength(3).maxLength(64),
|
||||
email: vine
|
||||
.string()
|
||||
.email()
|
||||
.unique(async (query, field) => {
|
||||
const user = await query.from('users').where('email', field).first()
|
||||
return !user
|
||||
}),
|
||||
password: vine.string().minLength(8).maxLength(32),
|
||||
})
|
||||
)
|
||||
@@ -0,0 +1,11 @@
|
||||
import vine from '@vinejs/vine'
|
||||
|
||||
export const storeComponentValidator = vine.compile(
|
||||
vine.object({
|
||||
name: vine.string().trim().minLength(1),
|
||||
price: vine.number().decimal([0, 2]).min(0),
|
||||
typeId: vine.number().min(1),
|
||||
purchaseDate: vine.string().regex(/^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/),
|
||||
quantity: vine.number().min(1).withoutDecimals(),
|
||||
})
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
import vine from '@vinejs/vine'
|
||||
|
||||
const email = () => vine.string().email().maxLength(254)
|
||||
const password = () => vine.string().minLength(8).maxLength(32)
|
||||
|
||||
export const signupValidator = vine.create({
|
||||
fullName: vine.string().nullable(),
|
||||
email: email().unique({ table: 'users', column: 'email' }),
|
||||
password: password().confirmed({
|
||||
confirmationField: 'passwordConfirmation',
|
||||
}),
|
||||
})
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Ace entry point
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The "console.ts" file is the entrypoint for booting the AdonisJS
|
||||
| command-line framework and executing commands.
|
||||
|
|
||||
| Commands do not boot the application, unless the currently running command
|
||||
| has "options.startApp" flag set to true.
|
||||
|
|
||||
*/
|
||||
|
||||
await import('reflect-metadata')
|
||||
const { Ignitor, prettyPrintError } = await import('@adonisjs/core')
|
||||
|
||||
/**
|
||||
* URL to the application root. AdonisJS need it to resolve
|
||||
* paths to file and directories for scaffolding commands
|
||||
*/
|
||||
const APP_ROOT = new URL('../', import.meta.url)
|
||||
|
||||
/**
|
||||
* The importer is used to import files in context of the
|
||||
* application.
|
||||
*/
|
||||
const IMPORTER = (filePath: string) => {
|
||||
if (filePath.startsWith('./') || filePath.startsWith('../')) {
|
||||
return import(new URL(filePath, APP_ROOT).href)
|
||||
}
|
||||
return import(filePath)
|
||||
}
|
||||
|
||||
new Ignitor(APP_ROOT, { importer: IMPORTER })
|
||||
.tap((app) => {
|
||||
app.booting(async () => {
|
||||
await import('#start/env')
|
||||
})
|
||||
app.listen('SIGTERM', () => app.terminate())
|
||||
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate())
|
||||
})
|
||||
.ace()
|
||||
.handle(process.argv.splice(2))
|
||||
.catch((error) => {
|
||||
process.exitCode = 1
|
||||
prettyPrintError(error)
|
||||
})
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTP server entrypoint
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The "server.ts" file is the entrypoint for starting the AdonisJS HTTP
|
||||
| server. Either you can run this file directly or use the "serve"
|
||||
| command to run this file and monitor file changes
|
||||
|
|
||||
*/
|
||||
|
||||
await import('reflect-metadata')
|
||||
const { Ignitor, prettyPrintError } = await import('@adonisjs/core')
|
||||
|
||||
/**
|
||||
* URL to the application root. AdonisJS need it to resolve
|
||||
* paths to file and directories for scaffolding commands
|
||||
*/
|
||||
const APP_ROOT = new URL('../', import.meta.url)
|
||||
|
||||
/**
|
||||
* The importer is used to import files in context of the
|
||||
* application.
|
||||
*/
|
||||
const IMPORTER = (filePath: string) => {
|
||||
if (filePath.startsWith('./') || filePath.startsWith('../')) {
|
||||
return import(new URL(filePath, APP_ROOT).href)
|
||||
}
|
||||
return import(filePath)
|
||||
}
|
||||
|
||||
new Ignitor(APP_ROOT, { importer: IMPORTER })
|
||||
.tap((app) => {
|
||||
app.booting(async () => {
|
||||
await import('#start/env')
|
||||
})
|
||||
app.listen('SIGTERM', () => app.terminate())
|
||||
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate())
|
||||
})
|
||||
.httpServer()
|
||||
.start()
|
||||
.catch((error) => {
|
||||
process.exitCode = 1
|
||||
prettyPrintError(error)
|
||||
})
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Test runner entrypoint
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The "test.ts" file is the entrypoint for running tests using Japa.
|
||||
|
|
||||
| Either you can run this file directly or use the "test"
|
||||
| command to run this file and monitor file changes.
|
||||
|
|
||||
*/
|
||||
|
||||
process.env.NODE_ENV = 'test'
|
||||
|
||||
import 'reflect-metadata'
|
||||
import { Ignitor, prettyPrintError } from '@adonisjs/core'
|
||||
import { configure, processCLIArgs, run } from '@japa/runner'
|
||||
|
||||
/**
|
||||
* URL to the application root. AdonisJS need it to resolve
|
||||
* paths to file and directories for scaffolding commands
|
||||
*/
|
||||
const APP_ROOT = new URL('../', import.meta.url)
|
||||
|
||||
/**
|
||||
* The importer is used to import files in context of the
|
||||
* application.
|
||||
*/
|
||||
const IMPORTER = (filePath: string) => {
|
||||
if (filePath.startsWith('./') || filePath.startsWith('../')) {
|
||||
return import(new URL(filePath, APP_ROOT).href)
|
||||
}
|
||||
return import(filePath)
|
||||
}
|
||||
|
||||
new Ignitor(APP_ROOT, { importer: IMPORTER })
|
||||
.tap((app) => {
|
||||
app.booting(async () => {
|
||||
await import('#start/env')
|
||||
})
|
||||
app.listen('SIGTERM', () => app.terminate())
|
||||
app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate())
|
||||
})
|
||||
.testRunner()
|
||||
.configure(async (app) => {
|
||||
const { runnerHooks, ...config } = await import('../tests/bootstrap.js')
|
||||
|
||||
processCLIArgs(process.argv.splice(2))
|
||||
configure({
|
||||
...app.rcFile.tests,
|
||||
...config,
|
||||
...{
|
||||
setup: runnerHooks.setup,
|
||||
teardown: runnerHooks.teardown.concat([() => app.terminate()]),
|
||||
},
|
||||
})
|
||||
})
|
||||
.run(() => run())
|
||||
.catch((error) => {
|
||||
process.exitCode = 1
|
||||
prettyPrintError(error)
|
||||
})
|
||||
@@ -0,0 +1,76 @@
|
||||
import app from '@adonisjs/core/services/app'
|
||||
import { defineConfig } from '@adonisjs/core/http'
|
||||
|
||||
/**
|
||||
* The configuration settings used by the HTTP server
|
||||
*/
|
||||
export const http = defineConfig({
|
||||
/**
|
||||
* Generate a unique request id for each incoming request.
|
||||
* Useful to correlate logs and debug a request flow.
|
||||
*/
|
||||
generateRequestId: true,
|
||||
|
||||
/**
|
||||
* Allow HTTP method spoofing via the "_method" form/query parameter.
|
||||
* This lets HTML forms target PUT/PATCH/DELETE routes while still
|
||||
* submitting with POST.
|
||||
*/
|
||||
allowMethodSpoofing: false,
|
||||
|
||||
/**
|
||||
* Enabling async local storage will let you access HTTP context
|
||||
* from anywhere inside your application.
|
||||
*/
|
||||
useAsyncLocalStorage: false,
|
||||
|
||||
/**
|
||||
* Redirect configuration controls the behavior of
|
||||
* response.redirect().back() and query string forwarding.
|
||||
*/
|
||||
redirect: {
|
||||
/**
|
||||
* When enabled, all redirects automatically carry over the current
|
||||
* request's query string parameters to the redirect destination.
|
||||
* Use withQs(false) to opt out for a specific redirect.
|
||||
*/
|
||||
forwardQueryString: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* Manage cookies configuration. The settings for the session id cookie are
|
||||
* defined inside the "config/session.ts" file.
|
||||
*/
|
||||
cookie: {
|
||||
/**
|
||||
* Restrict the cookie to a specific domain.
|
||||
* Keep empty to use the current host.
|
||||
*/
|
||||
domain: '',
|
||||
|
||||
/**
|
||||
* Restrict the cookie to a URL path. '/' means all routes.
|
||||
*/
|
||||
path: '/',
|
||||
|
||||
/**
|
||||
* Default lifetime for cookies managed by the HTTP layer.
|
||||
*/
|
||||
maxAge: '2h',
|
||||
|
||||
/**
|
||||
* Prevent JavaScript access to the cookie in the browser.
|
||||
*/
|
||||
httpOnly: true,
|
||||
|
||||
/**
|
||||
* Send cookies only over HTTPS in production.
|
||||
*/
|
||||
secure: app.inProduction,
|
||||
|
||||
/**
|
||||
* Cross-site policy for cookie sending.
|
||||
*/
|
||||
sameSite: 'lax',
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,39 @@
|
||||
import { defineConfig } from '@adonisjs/auth'
|
||||
import { sessionGuard, sessionUserProvider } from '@adonisjs/auth/session'
|
||||
import type { InferAuthenticators, InferAuthEvents, Authenticators } from '@adonisjs/auth/types'
|
||||
|
||||
const authConfig = defineConfig({
|
||||
/**
|
||||
* Default guard used when no guard is explicitly specified.
|
||||
*/
|
||||
default: 'web',
|
||||
|
||||
guards: {
|
||||
/**
|
||||
* Session-based guard for browser authentication.
|
||||
*/
|
||||
web: sessionGuard({
|
||||
/**
|
||||
* Enable persistent login using remember-me tokens.
|
||||
*/
|
||||
useRememberMeTokens: false,
|
||||
|
||||
provider: sessionUserProvider({
|
||||
model: () => import('#models/user'),
|
||||
}),
|
||||
}),
|
||||
},
|
||||
})
|
||||
|
||||
export default authConfig
|
||||
|
||||
/**
|
||||
* Inferring types from the configured auth
|
||||
* guards.
|
||||
*/
|
||||
declare module '@adonisjs/auth/types' {
|
||||
export interface Authenticators extends InferAuthenticators<typeof authConfig> {}
|
||||
}
|
||||
declare module '@adonisjs/core/types' {
|
||||
interface EventsList extends InferAuthEvents<Authenticators> {}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
import { defineConfig } from '@adonisjs/core/bodyparser'
|
||||
|
||||
const bodyParserConfig = defineConfig({
|
||||
/**
|
||||
* Parse request bodies for these HTTP methods.
|
||||
* Keep this aligned with methods that receive payloads in your routes.
|
||||
*/
|
||||
allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],
|
||||
|
||||
/**
|
||||
* Config for the "application/x-www-form-urlencoded"
|
||||
* content-type parser.
|
||||
*/
|
||||
form: {
|
||||
/**
|
||||
* Normalize empty string values to null.
|
||||
*/
|
||||
convertEmptyStringsToNull: true,
|
||||
|
||||
/**
|
||||
* Content types handled by the form parser.
|
||||
*/
|
||||
types: ['application/x-www-form-urlencoded'],
|
||||
},
|
||||
|
||||
/**
|
||||
* Config for the JSON parser.
|
||||
*/
|
||||
json: {
|
||||
/**
|
||||
* Normalize empty string values to null.
|
||||
*/
|
||||
convertEmptyStringsToNull: true,
|
||||
|
||||
/**
|
||||
* Content types handled by the JSON parser.
|
||||
*/
|
||||
types: [
|
||||
'application/json',
|
||||
'application/json-patch+json',
|
||||
'application/vnd.api+json',
|
||||
'application/csp-report',
|
||||
],
|
||||
},
|
||||
|
||||
/**
|
||||
* Config for the "multipart/form-data" content-type parser.
|
||||
* File uploads are handled by the multipart parser.
|
||||
*/
|
||||
multipart: {
|
||||
/**
|
||||
* Automatically process uploaded files into the system tmp directory.
|
||||
*/
|
||||
autoProcess: true,
|
||||
|
||||
/**
|
||||
* Normalize empty string values to null.
|
||||
*/
|
||||
convertEmptyStringsToNull: true,
|
||||
|
||||
/**
|
||||
* Routes where multipart processing is handled manually.
|
||||
*/
|
||||
processManually: [],
|
||||
|
||||
/**
|
||||
* Maximum accepted payload size for multipart requests.
|
||||
*/
|
||||
limit: '20mb',
|
||||
|
||||
/**
|
||||
* Content types handled by the multipart parser.
|
||||
*/
|
||||
types: ['multipart/form-data'],
|
||||
},
|
||||
})
|
||||
|
||||
export default bodyParserConfig
|
||||
@@ -0,0 +1,50 @@
|
||||
import app from '@adonisjs/core/services/app'
|
||||
import { defineConfig } from '@adonisjs/cors'
|
||||
|
||||
/**
|
||||
* Configuration options to tweak the CORS policy. The following
|
||||
* options are documented on the official documentation website.
|
||||
*
|
||||
* https://docs.adonisjs.com/guides/security/cors
|
||||
*/
|
||||
const corsConfig = defineConfig({
|
||||
/**
|
||||
* Enable or disable CORS handling globally.
|
||||
*/
|
||||
enabled: true,
|
||||
|
||||
/**
|
||||
* In development, allow every origin to simplify local front/backend setup.
|
||||
* In production, keep an explicit allowlist (empty by default, so no
|
||||
* cross-origin browser access is allowed until configured).
|
||||
*/
|
||||
origin: app.inDev ? true : [],
|
||||
|
||||
/**
|
||||
* HTTP methods accepted for cross-origin requests.
|
||||
*/
|
||||
methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE'],
|
||||
|
||||
/**
|
||||
* Reflect request headers by default. Use a string array to restrict
|
||||
* allowed headers.
|
||||
*/
|
||||
headers: true,
|
||||
|
||||
/**
|
||||
* Response headers exposed to the browser.
|
||||
*/
|
||||
exposeHeaders: [],
|
||||
|
||||
/**
|
||||
* Allow cookies/authorization headers on cross-origin requests.
|
||||
*/
|
||||
credentials: true,
|
||||
|
||||
/**
|
||||
* Cache CORS preflight response for N seconds.
|
||||
*/
|
||||
maxAge: 90,
|
||||
})
|
||||
|
||||
export default corsConfig
|
||||
@@ -0,0 +1,55 @@
|
||||
import env from '#start/env'
|
||||
import app from '@adonisjs/core/services/app'
|
||||
import { defineConfig } from '@adonisjs/lucid'
|
||||
|
||||
const dbConfig = defineConfig({
|
||||
connection: env.get('DB_CONNECTION', 'sqlite'),
|
||||
|
||||
connections: {
|
||||
sqlite: {
|
||||
client: 'better-sqlite3',
|
||||
connection: {
|
||||
filename: app.tmpPath('db.sqlite3'),
|
||||
},
|
||||
useNullAsDefault: true,
|
||||
migrations: {
|
||||
naturalSort: true,
|
||||
paths: ['database/migrations'],
|
||||
},
|
||||
},
|
||||
|
||||
mysql: {
|
||||
client: 'mysql2',
|
||||
connection: {
|
||||
host: env.get('DB_HOST'),
|
||||
port: Number(env.get('DB_PORT', '3306')),
|
||||
user: env.get('DB_USER'),
|
||||
password: env.get('DB_PASSWORD'),
|
||||
database: env.get('DB_DATABASE'),
|
||||
},
|
||||
migrations: {
|
||||
naturalSort: true,
|
||||
paths: ['database/migrations'],
|
||||
},
|
||||
debug: app.inDev,
|
||||
},
|
||||
|
||||
pg: {
|
||||
client: 'pg',
|
||||
connection: {
|
||||
host: env.get('DB_HOST'),
|
||||
port: Number(env.get('DB_PORT', '5432')),
|
||||
user: env.get('DB_USER'),
|
||||
password: env.get('DB_PASSWORD'),
|
||||
database: env.get('DB_DATABASE'),
|
||||
},
|
||||
migrations: {
|
||||
naturalSort: true,
|
||||
paths: ['database/migrations'],
|
||||
},
|
||||
debug: app.inDev,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
export default dbConfig
|
||||
@@ -0,0 +1,34 @@
|
||||
import env from '#start/env'
|
||||
import { defineConfig, drivers } from '@adonisjs/core/encryption'
|
||||
|
||||
const encryptionConfig = defineConfig({
|
||||
/**
|
||||
* Default encryption driver used by the application.
|
||||
*/
|
||||
default: 'gcm',
|
||||
|
||||
list: {
|
||||
gcm: drivers.aes256gcm({
|
||||
/**
|
||||
* Keys used for encryption/decryption.
|
||||
* First key encrypts, all keys are tried for decryption.
|
||||
*/
|
||||
keys: [env.get('APP_KEY')],
|
||||
|
||||
/**
|
||||
* Stable identifier for this driver.
|
||||
*/
|
||||
id: 'gcm',
|
||||
}),
|
||||
},
|
||||
})
|
||||
|
||||
export default encryptionConfig
|
||||
|
||||
/**
|
||||
* Inferring types for the list of encryptors you have configured
|
||||
* in your application.
|
||||
*/
|
||||
declare module '@adonisjs/core/types' {
|
||||
export interface EncryptorsList extends InferEncryptors<typeof encryptionConfig> {}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
import { defineConfig, drivers } from '@adonisjs/core/hash'
|
||||
|
||||
/**
|
||||
* Hashing configuration.
|
||||
*
|
||||
* This starter uses Node.js scrypt under the hood.
|
||||
* Node.js reference: https://nodejs.org/api/crypto.html#cryptoscryptpassword-salt-keylen-options-callback
|
||||
*/
|
||||
const hashConfig = defineConfig({
|
||||
/**
|
||||
* Default hasher used by the application.
|
||||
*/
|
||||
default: 'scrypt',
|
||||
|
||||
list: {
|
||||
/**
|
||||
* Scrypt is memory-hard, which makes brute-force attacks more expensive.
|
||||
*/
|
||||
scrypt: drivers.scrypt({
|
||||
/**
|
||||
* Work factor (Node alias: N / cost).
|
||||
* Higher values increase security and CPU+memory usage.
|
||||
*
|
||||
* Tuning guideline:
|
||||
* - Start with 16384.
|
||||
* - Increase gradually (for example 32768) and benchmark login/signup latency.
|
||||
* - Keep values practical for your slowest production machine.
|
||||
*
|
||||
* Node constraint: value must be a power of two greater than 1.
|
||||
*/
|
||||
cost: 16384,
|
||||
|
||||
/**
|
||||
* Block size (Node alias: r / blockSize).
|
||||
* Increases memory and CPU linearly.
|
||||
*
|
||||
* Tuning guideline:
|
||||
* - Keep 8 unless you have a measured reason to change it.
|
||||
* - Raise only with benchmark data, because memory usage grows quickly.
|
||||
*/
|
||||
blockSize: 8,
|
||||
|
||||
/**
|
||||
* Parallelization (Node alias: p / parallelization).
|
||||
* Controls how many independent computations are performed.
|
||||
*
|
||||
* Tuning guideline:
|
||||
* - Keep 1 for most applications.
|
||||
* - Increase only after load testing if your infrastructure benefits from it.
|
||||
*/
|
||||
parallelization: 1,
|
||||
|
||||
/**
|
||||
* Maximum memory limit in bytes (Node alias: maxmem / maxMemory).
|
||||
* Hashing throws if the estimated memory usage is above this limit.
|
||||
* Node documents the check as approximately: 128 * N * r > maxmem.
|
||||
*
|
||||
* Tuning guideline:
|
||||
* - Keep this aligned with your cost/blockSize choices.
|
||||
* - Increase carefully on memory-constrained environments.
|
||||
*/
|
||||
maxMemory: 33554432,
|
||||
}),
|
||||
},
|
||||
})
|
||||
|
||||
export default hashConfig
|
||||
|
||||
/**
|
||||
* Inferring types for the list of hashers you have configured
|
||||
* in your application.
|
||||
*/
|
||||
declare module '@adonisjs/core/types' {
|
||||
export interface HashersList extends InferHashers<typeof hashConfig> {}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { defineConfig } from '@adonisjs/inertia'
|
||||
|
||||
const inertiaConfig = defineConfig({
|
||||
/**
|
||||
* Server-side rendering options.
|
||||
*/
|
||||
ssr: {
|
||||
/**
|
||||
* Toggle SSR mode for Inertia pages.
|
||||
*/
|
||||
enabled: false,
|
||||
|
||||
/**
|
||||
* Entry file used by the SSR server build.
|
||||
*/
|
||||
entrypoint: 'inertia/ssr.ts',
|
||||
},
|
||||
})
|
||||
|
||||
export default inertiaConfig
|
||||
@@ -0,0 +1,50 @@
|
||||
import env from '#start/env'
|
||||
import app from '@adonisjs/core/services/app'
|
||||
import { defineConfig, targets } from '@adonisjs/core/logger'
|
||||
|
||||
const loggerConfig = defineConfig({
|
||||
/**
|
||||
* Default logger name used by ctx.logger and app logger calls.
|
||||
*/
|
||||
default: 'app',
|
||||
|
||||
loggers: {
|
||||
app: {
|
||||
/**
|
||||
* Toggle this logger on/off.
|
||||
*/
|
||||
enabled: true,
|
||||
|
||||
/**
|
||||
* Logger name shown in log records.
|
||||
*/
|
||||
name: env.get('APP_NAME'),
|
||||
|
||||
/**
|
||||
* Minimum level to output (trace, debug, info, warn, error, fatal).
|
||||
*/
|
||||
level: env.get('LOG_LEVEL'),
|
||||
|
||||
/**
|
||||
* Configure where logs are written.
|
||||
* Pretty logs in development, stdout in production.
|
||||
*/
|
||||
transport: {
|
||||
targets: targets()
|
||||
.pushIf(!app.inProduction, targets.pretty())
|
||||
.pushIf(app.inProduction, targets.file({ destination: 1 }))
|
||||
.toArray(),
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
export default loggerConfig
|
||||
|
||||
/**
|
||||
* Inferring types for the list of loggers you have configured
|
||||
* in your application.
|
||||
*/
|
||||
declare module '@adonisjs/core/types' {
|
||||
export interface LoggersList extends InferLoggers<typeof loggerConfig> {}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
import env from '#start/env'
|
||||
import app from '@adonisjs/core/services/app'
|
||||
import { defineConfig, stores } from '@adonisjs/session'
|
||||
|
||||
const sessionConfig = defineConfig({
|
||||
/**
|
||||
* Enable or disable session support globally.
|
||||
*/
|
||||
enabled: true,
|
||||
|
||||
/**
|
||||
* Cookie name storing the session identifier.
|
||||
*/
|
||||
cookieName: 'adonis-session',
|
||||
|
||||
/**
|
||||
* When set to true, the session id cookie will be deleted
|
||||
* once the user closes the browser.
|
||||
*/
|
||||
clearWithBrowser: false,
|
||||
|
||||
/**
|
||||
* Define how long to keep the session data alive without
|
||||
* any activity.
|
||||
*/
|
||||
age: '2h',
|
||||
|
||||
/**
|
||||
* Configuration for session cookie and the
|
||||
* cookie store.
|
||||
*/
|
||||
cookie: {
|
||||
/**
|
||||
* Restrict the cookie to a URL path. '/' means all routes.
|
||||
*/
|
||||
path: '/',
|
||||
|
||||
/**
|
||||
* Prevent JavaScript access to the cookie in the browser.
|
||||
*/
|
||||
httpOnly: true,
|
||||
|
||||
/**
|
||||
* Send cookies only over HTTPS in production.
|
||||
*/
|
||||
secure: app.inProduction,
|
||||
|
||||
/**
|
||||
* Cross-site policy for cookie sending.
|
||||
*/
|
||||
sameSite: 'lax',
|
||||
},
|
||||
|
||||
/**
|
||||
* The store to use. Make sure to validate the environment
|
||||
* variable in order to infer the store name without any
|
||||
* errors.
|
||||
*/
|
||||
store: env.get('SESSION_DRIVER'),
|
||||
|
||||
/**
|
||||
* List of configured stores. Refer documentation to see
|
||||
* list of available stores and their config.
|
||||
*/
|
||||
stores: {
|
||||
/**
|
||||
* Store session data inside encrypted cookies.
|
||||
*/
|
||||
cookie: stores.cookie(),
|
||||
|
||||
/**
|
||||
* Store session data inside the configured database.
|
||||
*/
|
||||
database: stores.database(),
|
||||
},
|
||||
})
|
||||
|
||||
export default sessionConfig
|
||||
@@ -0,0 +1,95 @@
|
||||
import { defineConfig } from '@adonisjs/shield'
|
||||
|
||||
const shieldConfig = defineConfig({
|
||||
/**
|
||||
* Configure CSP policies for your app. Refer documentation
|
||||
* to learn more.
|
||||
*/
|
||||
csp: {
|
||||
/**
|
||||
* Enable the Content-Security-Policy header.
|
||||
*/
|
||||
enabled: false,
|
||||
|
||||
/**
|
||||
* Per-resource CSP directives.
|
||||
*/
|
||||
directives: {},
|
||||
|
||||
/**
|
||||
* Report violations without blocking resources.
|
||||
*/
|
||||
reportOnly: false,
|
||||
},
|
||||
|
||||
/**
|
||||
* Configure CSRF protection options. Refer documentation
|
||||
* to learn more.
|
||||
*/
|
||||
csrf: {
|
||||
/**
|
||||
* Enable CSRF token verification for state-changing requests.
|
||||
*/
|
||||
enabled: true,
|
||||
|
||||
/**
|
||||
* Route patterns to exclude from CSRF checks.
|
||||
* Useful for external webhooks or API endpoints.
|
||||
*/
|
||||
exceptRoutes: [],
|
||||
|
||||
/**
|
||||
* Expose an encrypted XSRF-TOKEN cookie for frontend HTTP clients.
|
||||
*/
|
||||
enableXsrfCookie: true,
|
||||
|
||||
/**
|
||||
* HTTP methods protected by CSRF validation.
|
||||
*/
|
||||
methods: ['POST', 'PUT', 'PATCH', 'DELETE'],
|
||||
},
|
||||
|
||||
/**
|
||||
* Control how your website should be embedded inside
|
||||
* iframes.
|
||||
*/
|
||||
xFrame: {
|
||||
/**
|
||||
* Enable the X-Frame-Options header.
|
||||
*/
|
||||
enabled: true,
|
||||
|
||||
/**
|
||||
* Block all framing attempts. Default value is DENY.
|
||||
*/
|
||||
action: 'DENY',
|
||||
},
|
||||
|
||||
/**
|
||||
* Force browser to always use HTTPS.
|
||||
*/
|
||||
hsts: {
|
||||
/**
|
||||
* Enable the Strict-Transport-Security header.
|
||||
*/
|
||||
enabled: true,
|
||||
|
||||
/**
|
||||
* HSTS policy duration remembered by browsers.
|
||||
*/
|
||||
maxAge: '180 days',
|
||||
},
|
||||
|
||||
/**
|
||||
* Disable browsers from sniffing content types and rely only
|
||||
* on the response content-type header.
|
||||
*/
|
||||
contentTypeSniffing: {
|
||||
/**
|
||||
* Enable X-Content-Type-Options: nosniff.
|
||||
*/
|
||||
enabled: true,
|
||||
},
|
||||
})
|
||||
|
||||
export default shieldConfig
|
||||
@@ -0,0 +1,32 @@
|
||||
import { defineConfig } from '@adonisjs/static'
|
||||
|
||||
/**
|
||||
* Configuration options to tweak the static files middleware.
|
||||
* The complete set of options are documented on the
|
||||
* official documentation website.
|
||||
*
|
||||
* https://docs.adonisjs.com/guides/basics/static-file-server
|
||||
*/
|
||||
const staticServerConfig = defineConfig({
|
||||
/**
|
||||
* Enable or disable static file serving middleware.
|
||||
*/
|
||||
enabled: true,
|
||||
|
||||
/**
|
||||
* Generate ETag headers for client/proxy caching.
|
||||
*/
|
||||
etag: true,
|
||||
|
||||
/**
|
||||
* Include Last-Modified headers for conditional requests.
|
||||
*/
|
||||
lastModified: true,
|
||||
|
||||
/**
|
||||
* Policy for files starting with a dot.
|
||||
*/
|
||||
dotFiles: 'ignore',
|
||||
})
|
||||
|
||||
export default staticServerConfig
|
||||
@@ -0,0 +1,34 @@
|
||||
import { defineConfig } from '@adonisjs/vite'
|
||||
|
||||
const viteBackendConfig = defineConfig({
|
||||
/**
|
||||
* The output of vite will be written inside this
|
||||
* directory. The path should be relative from
|
||||
* the application root.
|
||||
*/
|
||||
buildDirectory: 'public/assets',
|
||||
|
||||
/**
|
||||
* The path to the manifest file generated by the
|
||||
* "vite build" command.
|
||||
*/
|
||||
manifestFile: 'public/assets/.vite/manifest.json',
|
||||
|
||||
/**
|
||||
* Feel free to change the value of the "assetsUrl" to
|
||||
* point to a CDN in production.
|
||||
*/
|
||||
assetsUrl: '/assets',
|
||||
|
||||
/**
|
||||
* HTML attributes added to generated script tags.
|
||||
*/
|
||||
scriptAttributes: {
|
||||
/**
|
||||
* Execute scripts after HTML parsing is complete.
|
||||
*/
|
||||
defer: true,
|
||||
},
|
||||
})
|
||||
|
||||
export default viteBackendConfig
|
||||
@@ -0,0 +1,20 @@
|
||||
import { BaseSchema } from '@adonisjs/lucid/schema'
|
||||
|
||||
export default class extends BaseSchema {
|
||||
protected tableName = 'users'
|
||||
|
||||
async up() {
|
||||
this.schema.createTable(this.tableName, (table) => {
|
||||
table.increments('id')
|
||||
table.string('name').nullable()
|
||||
table.string('email', 254).notNullable().unique()
|
||||
table.string('password').notNullable()
|
||||
table.timestamp('created_at').notNullable()
|
||||
table.timestamp('updated_at').nullable()
|
||||
})
|
||||
}
|
||||
|
||||
async down() {
|
||||
this.schema.dropTable(this.tableName)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import { BaseSchema } from '@adonisjs/lucid/schema'
|
||||
|
||||
export default class extends BaseSchema {
|
||||
protected tableName = 'computers'
|
||||
|
||||
async up() {
|
||||
this.schema.createTable(this.tableName, (table) => {
|
||||
table.increments('id')
|
||||
table.string('title').notNullable()
|
||||
table.integer('state_id').notNullable()
|
||||
table.float('sell_price', 6, 2).nullable()
|
||||
table.integer('gpu_score').notNullable()
|
||||
table.integer('cpu_score').notNullable()
|
||||
table.integer('global_score').notNullable()
|
||||
table.integer('user_id').unsigned().references('id').inTable('users').onDelete('CASCADE')
|
||||
table.timestamp('created_at')
|
||||
table.timestamp('updated_at')
|
||||
})
|
||||
}
|
||||
|
||||
async down() {
|
||||
this.schema.dropTable(this.tableName)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import { BaseSchema } from '@adonisjs/lucid/schema'
|
||||
|
||||
export default class extends BaseSchema {
|
||||
protected tableName = 'component_types'
|
||||
|
||||
async up() {
|
||||
this.schema.createTable(this.tableName, (table) => {
|
||||
table.increments('id')
|
||||
table.string('name').notNullable()
|
||||
table.boolean('unique').notNullable()
|
||||
})
|
||||
}
|
||||
|
||||
async down() {
|
||||
this.schema.dropTable(this.tableName)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import { BaseSchema } from '@adonisjs/lucid/schema'
|
||||
|
||||
export default class extends BaseSchema {
|
||||
protected tableName = 'components'
|
||||
|
||||
async up() {
|
||||
this.schema.createTable(this.tableName, (table) => {
|
||||
table.increments('id')
|
||||
table.string('name').notNullable()
|
||||
table.decimal('price', 8, 2).notNullable()
|
||||
table.integer('type_id').unsigned().references('id').inTable('component_types').onDelete('CASCADE')
|
||||
table.integer('computer_id').unsigned().nullable().references('id').inTable('computers').onDelete('CASCADE')
|
||||
table.integer('user_id').unsigned().references('id').inTable('users').onDelete('CASCADE')
|
||||
table.date('purchase_date').notNullable()
|
||||
table.timestamp('created_at')
|
||||
table.timestamp('updated_at')
|
||||
})
|
||||
}
|
||||
|
||||
async down() {
|
||||
this.schema.dropTable(this.tableName)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { BaseSchema } from '@adonisjs/lucid/schema'
|
||||
|
||||
export default class extends BaseSchema {
|
||||
protected tableName = 'computer_states'
|
||||
|
||||
async up() {
|
||||
this.schema.createTable(this.tableName, (table) => {
|
||||
table.increments('id')
|
||||
table.string('name').notNullable()
|
||||
})
|
||||
}
|
||||
|
||||
async down() {
|
||||
this.schema.dropTable(this.tableName)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { BaseSchema } from '@adonisjs/lucid/schema'
|
||||
|
||||
export default class extends BaseSchema {
|
||||
protected tableName = 'computer_pictures'
|
||||
|
||||
async up() {
|
||||
this.schema.createTable(this.tableName, (table) => {
|
||||
table.increments('id')
|
||||
table.integer('computer_id').unsigned().references('id').inTable('computers').onDelete('CASCADE')
|
||||
table.string('link').notNullable()
|
||||
table.integer('order').notNullable()
|
||||
table.timestamp('created_at')
|
||||
table.timestamp('updated_at')
|
||||
})
|
||||
}
|
||||
|
||||
async down() {
|
||||
this.schema.dropTable(this.tableName)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
* This file is automatically generated
|
||||
* DO NOT EDIT manually
|
||||
* Run "node ace migration:run" command to re-generate this file
|
||||
*/
|
||||
|
||||
import { BaseModel, column } from '@adonisjs/lucid/orm'
|
||||
import { DateTime } from 'luxon'
|
||||
|
||||
export class ComponentTypeSchema extends BaseModel {
|
||||
static $columns = ['id', 'name', 'unique'] as const
|
||||
$columns = ComponentTypeSchema.$columns
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
@column()
|
||||
declare name: string
|
||||
@column()
|
||||
declare unique: boolean
|
||||
}
|
||||
|
||||
export class ComponentSchema extends BaseModel {
|
||||
static $columns = ['computerId', 'createdAt', 'id', 'name', 'price', 'purchaseDate', 'typeId', 'updatedAt', 'userId'] as const
|
||||
$columns = ComponentSchema.$columns
|
||||
@column()
|
||||
declare computerId: number | null
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime | null
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
@column()
|
||||
declare name: string
|
||||
@column()
|
||||
declare price: string
|
||||
@column.date()
|
||||
declare purchaseDate: DateTime
|
||||
@column()
|
||||
declare typeId: number | null
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
@column()
|
||||
declare userId: number | null
|
||||
}
|
||||
|
||||
export class ComputerPictureSchema extends BaseModel {
|
||||
static $columns = ['computerId', 'createdAt', 'id', 'link', 'order', 'updatedAt'] as const
|
||||
$columns = ComputerPictureSchema.$columns
|
||||
@column()
|
||||
declare computerId: number | null
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime | null
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
@column()
|
||||
declare link: string
|
||||
@column()
|
||||
declare order: number
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
}
|
||||
|
||||
export class ComputerStateSchema extends BaseModel {
|
||||
static $columns = ['id', 'name'] as const
|
||||
$columns = ComputerStateSchema.$columns
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
@column()
|
||||
declare name: string
|
||||
}
|
||||
|
||||
export class ComputerSchema extends BaseModel {
|
||||
static $columns = ['cpuScore', 'createdAt', 'globalScore', 'gpuScore', 'id', 'sellPrice', 'stateId', 'title', 'updatedAt', 'userId'] as const
|
||||
$columns = ComputerSchema.$columns
|
||||
@column()
|
||||
declare cpuScore: number
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime | null
|
||||
@column()
|
||||
declare globalScore: number
|
||||
@column()
|
||||
declare gpuScore: number
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
@column()
|
||||
declare sellPrice: number | null
|
||||
@column()
|
||||
declare stateId: number
|
||||
@column()
|
||||
declare title: string
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
@column()
|
||||
declare userId: number | null
|
||||
}
|
||||
|
||||
export class UserSchema extends BaseModel {
|
||||
static $columns = ['createdAt', 'email', 'id', 'name', 'password', 'updatedAt'] as const
|
||||
$columns = UserSchema.$columns
|
||||
@column.dateTime({ autoCreate: true })
|
||||
declare createdAt: DateTime
|
||||
@column()
|
||||
declare email: string
|
||||
@column({ isPrimary: true })
|
||||
declare id: number
|
||||
@column()
|
||||
declare name: string | null
|
||||
@column({ serializeAs: null })
|
||||
declare password: string
|
||||
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
||||
declare updatedAt: DateTime | null
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
import { type SchemaRules } from '@adonisjs/lucid/types/schema_generator'
|
||||
|
||||
export default {} satisfies SchemaRules
|
||||
@@ -0,0 +1,23 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: 'mysql/mysql-server:8.0.32'
|
||||
container_name: mysql-pcbuilderv2
|
||||
ports:
|
||||
- '3306:3306'
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: 'password'
|
||||
MYSQL_ROOT_HOST: '%'
|
||||
MYSQL_DATABASE: 'pc_builderv2'
|
||||
MYSQL_USER: 'admin'
|
||||
MYSQL_PASSWORD: 'password'
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ['CMD', 'mysqladmin', 'ping', '-ppassword']
|
||||
retries: 3
|
||||
timeout: 5s
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
@@ -0,0 +1,10 @@
|
||||
import { configApp } from '@adonisjs/eslint-config'
|
||||
import { vue } from '@adonisjs/eslint-config/vue'
|
||||
|
||||
export default configApp(...vue, {
|
||||
name: 'inertia-vue ts overrides',
|
||||
files: ['inertia/**/*.ts'],
|
||||
rules: {
|
||||
'vue/component-api-style': 'off',
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,66 @@
|
||||
import './css/app.css'
|
||||
import 'vue-sonner/style.css'
|
||||
import { client } from '~/client'
|
||||
import Layout from '~/layouts/default.vue'
|
||||
import { createInertiaApp } from '@inertiajs/vue3'
|
||||
import { TuyauProvider } from '@adonisjs/inertia/vue'
|
||||
import { createApp, type DefineComponent, h } from 'vue'
|
||||
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
|
||||
|
||||
import DefaultLayout from '~/pages/layout/defaultLayout.vue'
|
||||
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
|
||||
|
||||
// directives
|
||||
// @ts-ignore
|
||||
import validationErrorDirective from '~/directives/v_validation_error'
|
||||
// @ts-ignore
|
||||
import priceDirective from '~/directives/v-price'
|
||||
// @ts-ignore
|
||||
import deleteConfirmDirective from '~/directives/v-delete-confirm'
|
||||
|
||||
const appName = import.meta.env.VITE_APP_NAME || 'AdonisJS'
|
||||
|
||||
createInertiaApp({
|
||||
title: (title) => (title ? `${title} - ${appName}` : appName),
|
||||
|
||||
resolve: async (name) => {
|
||||
const page = await resolvePageComponent(
|
||||
`./pages/${name}.vue`,
|
||||
import.meta.glob<DefineComponent>('./pages/**/*.vue')
|
||||
)
|
||||
|
||||
// Choix du layout
|
||||
const layout =
|
||||
name.startsWith('auth/') || name.startsWith('account')
|
||||
? EmptyLayout
|
||||
: DefaultLayout
|
||||
|
||||
page.default.layout = page.default.layout || layout
|
||||
|
||||
return page
|
||||
},
|
||||
|
||||
setup({ el, App, props, plugin }) {
|
||||
const vueApp = createApp({
|
||||
render: () =>
|
||||
h(
|
||||
TuyauProvider,
|
||||
{ client },
|
||||
{
|
||||
default: () => h(App, props),
|
||||
}
|
||||
),
|
||||
})
|
||||
|
||||
vueApp
|
||||
.use(plugin)
|
||||
.directive('validation-error', validationErrorDirective)
|
||||
.directive('price', priceDirective)
|
||||
.directive('delete-confirm', deleteConfirmDirective)
|
||||
.mount(el)
|
||||
},
|
||||
|
||||
progress: {
|
||||
color: '#4B5563',
|
||||
},
|
||||
})
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M627 5102 c-16 -17 -17 -165 -17 -1930 0 -1899 0 -1912 20 -1932 18
|
||||
-18 33 -20 174 -20 l154 0 5 -342 c4 -364 6 -377 57 -478 12 -24 45 -68 73
|
||||
-98 96 -101 218 -152 364 -152 79 0 81 0 92 -29 7 -15 27 -42 44 -59 67 -65
|
||||
20 -62 967 -62 947 0 900 -3 967 62 17 17 37 44 44 59 11 29 13 29 92 29 224
|
||||
0 403 128 474 339 13 37 17 112 20 389 l5 342 154 0 c141 0 156 2 174 20 20
|
||||
20 20 33 20 1933 0 1841 -1 1915 -18 1930 -17 16 -166 17 -1934 17 -1842 0
|
||||
-1916 -1 -1931 -18z m2165 -327 c246 -37 462 -119 663 -253 853 -567 974
|
||||
-1772 250 -2497 -633 -633 -1657 -633 -2290 0 -305 306 -475 715 -475 1146 0
|
||||
803 582 1479 1381 1604 118 18 349 18 471 0z m-1202 -3834 l0 -280 -27 -45
|
||||
c-28 -45 -28 -45 -84 -46 -99 0 -94 -18 -97 339 l-3 311 106 0 105 0 0 -279z
|
||||
m1510 29 l0 -250 -540 0 -540 0 0 250 0 250 540 0 540 0 0 -250z m638 -61 c-3
|
||||
-357 2 -339 -97 -339 -56 1 -56 1 -83 46 l-28 45 0 280 0 279 105 0 106 0 -3
|
||||
-311z"/>
|
||||
<path d="M2415 4534 c-92 -14 -191 -35 -253 -54 l-71 -21 36 -82 c34 -80 164
|
||||
-418 178 -466 7 -23 7 -23 -36 6 -77 53 -280 178 -417 257 l-134 77 -48 -41
|
||||
c-120 -101 -259 -278 -333 -426 -41 -80 -90 -221 -111 -311 l-14 -62 31 -5
|
||||
c18 -3 100 -14 182 -26 83 -11 203 -30 267 -42 l118 -21 -68 -37 c-37 -20
|
||||
-134 -73 -217 -117 -82 -44 -189 -104 -236 -132 l-87 -51 20 -92 c40 -183 101
|
||||
-327 208 -486 62 -93 225 -272 247 -272 7 0 25 19 42 43 35 51 227 291 292
|
||||
365 l45 52 0 -347 -1 -347 88 -28 c255 -82 572 -84 815 -6 l70 23 -43 102
|
||||
c-52 121 -178 454 -173 458 2 2 70 -40 152 -92 82 -52 214 -133 294 -179 l145
|
||||
-83 65 57 c186 163 335 399 405 642 14 47 27 99 28 115 4 28 1 30 -31 33 -62
|
||||
5 -372 52 -469 70 l-95 18 159 83 c87 45 224 120 305 167 l148 84 -19 88 c-60
|
||||
277 -188 510 -387 706 l-70 68 -63 -83 c-52 -70 -209 -264 -294 -365 l-21 -24
|
||||
1 346 0 346 -62 23 c-112 43 -256 67 -413 70 -80 2 -158 1 -175 -1z m226
|
||||
-1018 c248 -58 355 -352 204 -558 -67 -92 -165 -140 -285 -140 -85 0 -139 17
|
||||
-206 62 -168 116 -198 370 -63 524 49 56 114 95 183 112 67 16 100 16 167 0z"/>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg version="1.1" id="_x32_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 512 512" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#000000;}
|
||||
</style>
|
||||
<g>
|
||||
<rect x="141.312" class="st0" width="32.771" height="71.683"/>
|
||||
<rect x="206.853" class="st0" width="32.761" height="71.683"/>
|
||||
<rect x="272.385" class="st0" width="32.761" height="71.683"/>
|
||||
<rect x="337.917" class="st0" width="32.77" height="71.683"/>
|
||||
<rect x="141.312" y="440.326" class="st0" width="32.771" height="71.674"/>
|
||||
<rect x="206.853" y="440.326" class="st0" width="32.761" height="71.674"/>
|
||||
<rect x="272.385" y="440.326" class="st0" width="32.761" height="71.674"/>
|
||||
<rect x="337.917" y="440.326" class="st0" width="32.77" height="71.674"/>
|
||||
<rect x="440.321" y="141.307" class="st0" width="71.674" height="32.771"/>
|
||||
<rect x="440.321" y="206.849" class="st0" width="71.674" height="32.77"/>
|
||||
<rect x="440.321" y="272.39" class="st0" width="71.674" height="32.761"/>
|
||||
<rect x="440.321" y="337.922" class="st0" width="71.674" height="32.77"/>
|
||||
<rect x="0.005" y="141.307" class="st0" width="71.674" height="32.771"/>
|
||||
<rect x="0.005" y="206.849" class="st0" width="71.674" height="32.77"/>
|
||||
<rect x="0.005" y="272.39" class="st0" width="71.674" height="32.761"/>
|
||||
<rect x="0.005" y="337.922" class="st0" width="71.674" height="32.77"/>
|
||||
<path class="st0" d="M255.246,252.209c6.171,0,9.862-3.586,9.862-9.06c0-5.485-3.69-9.176-9.862-9.176h-11.16
|
||||
c-0.4,0-0.6,0.21-0.6,0.61v17.025c0,0.4,0.2,0.601,0.6,0.601H255.246z"/>
|
||||
<path class="st0" d="M92.165,419.84h327.67V92.17H92.165V419.84z M367.359,130.568c8.479,0,15.356,6.867,15.356,15.356
|
||||
c0,8.488-6.876,15.355-15.356,15.355c-8.479,0-15.356-6.867-15.356-15.355C352.004,137.434,358.88,130.568,367.359,130.568z
|
||||
M367.359,353.287c8.479,0,15.356,6.867,15.356,15.356c0,8.488-6.876,15.355-15.356,15.355c-8.479,0-15.356-6.867-15.356-15.355
|
||||
C352.004,360.154,358.88,353.287,367.359,353.287z M290.821,222.318c0-0.591,0.4-0.991,1.001-0.991h12.648
|
||||
c0.6,0,1.001,0.4,1.001,0.991v42.242c0,8.069,4.483,12.648,11.35,12.648c6.772,0,11.264-4.578,11.264-12.648v-42.242
|
||||
c0-0.591,0.4-0.991,0.992-0.991h12.646c0.601,0,0.992,0.4,0.992,0.991v41.851c0,16.825-10.749,25.99-25.895,25.99
|
||||
c-15.232,0-25.999-9.165-25.999-25.99V222.318z M228.846,222.318c0-0.591,0.4-0.991,1.001-0.991h26.295
|
||||
c14.745,0,23.605,8.87,23.605,21.822c0,12.741-8.966,21.707-23.605,21.707h-12.056c-0.4,0-0.6,0.2-0.6,0.6v22.614
|
||||
c0,0.591-0.391,0.991-0.991,0.991h-12.648c-0.601,0-1.001-0.4-1.001-0.991V222.318z M167.673,236.872
|
||||
c3.586-11.063,12.256-16.633,24.112-16.633c11.454,0,19.819,5.57,23.605,15.03c0.295,0.496,0.095,0.992-0.496,1.202l-10.863,4.874
|
||||
c-0.592,0.296-1.097,0.104-1.393-0.486c-1.889-4.387-5.084-7.678-10.759-7.678c-5.274,0-8.66,2.795-10.157,7.468
|
||||
c-0.801,2.499-1.097,4.883-1.097,14.554c0,9.652,0.296,12.046,1.097,14.535c1.497,4.673,4.883,7.468,10.157,7.468
|
||||
c5.675,0,8.87-3.291,10.759-7.669c0.296-0.6,0.801-0.791,1.393-0.496l10.863,4.874c0.591,0.21,0.791,0.706,0.496,1.202
|
||||
c-3.786,9.461-12.152,15.04-23.605,15.04c-11.856,0-20.525-5.58-24.112-16.643c-1.487-4.368-1.888-7.859-1.888-18.312
|
||||
C165.785,244.732,166.186,241.26,167.673,236.872z M144.64,130.568c8.489,0,15.365,6.876,15.365,15.356
|
||||
c0,8.478-6.876,15.355-15.365,15.355c-8.488,0-15.355-6.876-15.355-15.355C129.285,137.444,136.152,130.568,144.64,130.568z
|
||||
M144.64,353.287c8.489,0,15.365,6.876,15.365,15.356c0,8.478-6.876,15.355-15.365,15.355c-8.488,0-15.355-6.877-15.355-15.355
|
||||
C129.285,360.163,136.152,353.287,144.64,353.287z"/>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,5 @@
|
||||
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 490 490" xml:space="preserve">
|
||||
<polygon points="456.851,0 245,212.564 33.149,0 0.708,32.337 212.669,245.004 0.708,457.678 33.149,490 245,277.443 456.851,490
|
||||
489.292,457.678 277.331,245.004 489.292,32.337 "/>
|
||||
</svg>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 512 512" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M256,120.457c-74.739,0-135.543,60.804-135.543,135.543c0,74.739,60.804,135.543,135.543,135.543
|
||||
S391.543,330.739,391.543,256C391.543,181.261,330.74,120.457,256,120.457z M256,357.391
|
||||
c-55.908,0-101.391-45.484-101.391-101.391c0-55.907,45.483-101.391,101.391-101.391S357.391,200.093,357.391,256
|
||||
C357.391,311.907,311.907,357.391,256,357.391z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M256,185.027c-39.135,0-70.973,31.839-70.973,70.973c0,39.135,31.839,70.973,70.973,70.973
|
||||
c39.135,0,70.973-31.839,70.973-70.973C326.974,216.865,295.134,185.027,256,185.027z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M511.999,315.659V196.341h-47.416c-4.534-15.894-10.867-31.172-18.918-45.636l33.539-33.539l-84.37-84.37l-33.539,33.54
|
||||
c-14.467-8.053-29.741-14.385-45.636-18.919V0H196.341v47.416c-15.895,4.534-31.168,10.866-45.636,18.919l-33.539-33.54
|
||||
l-84.37,84.37l33.539,33.539c-8.051,14.464-14.385,29.741-18.918,45.636H0.001v119.318h47.416
|
||||
c4.534,15.894,10.867,31.172,18.918,45.636l-33.539,33.539l84.37,84.37l33.539-33.54c14.467,8.053,29.741,14.385,45.636,18.919
|
||||
V512H315.66v-47.416c15.895-4.534,31.169-10.866,45.636-18.919l33.539,33.54l84.37-84.37l-33.539-33.539
|
||||
c8.051-14.464,14.385-29.741,18.918-45.636H511.999z M256,421.959c-91.511,0-165.96-74.449-165.96-165.96S164.489,90.04,256,90.04
|
||||
s165.96,74.449,165.96,165.96S347.512,421.959,256,421.959z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg fill="#000000" width="800px" height="800px" viewBox="-0.01 0 122.89 122.89" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="enable-background:new 0 0 122.88 122.89" xml:space="preserve">
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
<![CDATA[
|
||||
.st0{fill-rule:evenodd;clip-rule:evenodd;}
|
||||
]]>
|
||||
|
||||
</style>
|
||||
|
||||
<g>
|
||||
|
||||
<path class="st0" d="M11.56,0h99.75c3.18,0,6.07,1.3,8.17,3.4c2.1,2.1,3.4,4.99,3.4,8.17v99.75c0,3.18-1.3,6.07-3.4,8.17 c-2.09,2.09-4.99,3.4-8.17,3.4H11.56c-3.18,0-6.07-1.3-8.17-3.4C1.3,117.39,0,114.5,0,111.32V11.56C0,8.38,1.3,5.49,3.4,3.4 C5.49,1.3,8.38,0,11.56,0L11.56,0z M57.23,72.48c-1.52-0.48-2.91-1.24-4.19-2.3c-1.36-1.13-2.58-2.57-3.66-4.36 c-0.5,0.03-0.97,0.04-1.43,0.04c-0.8,0.01-1.63-0.03-2.5-0.09c-3.42-0.25-6-1.19-8.57-2.12c-1.67-0.61-3.34-1.21-5.15-1.58 c-0.65-0.13-1.23-0.14-1.74-0.08c-0.87,0.13-1.55,0.56-2.06,1.19c-0.58,0.7-0.97,1.66-1.18,2.7c-0.23,1.15-0.25,2.41-0.07,3.59 c0.16,1.05,0.46,2.12,0.84,3.16c0.39,1.08,0.87,2.12,1.38,3.09c0.46,0.9,0.98,1.75,1.55,2.56c0.57,0.82,1.2,1.61,1.86,2.36 c2.23,2.54,4.54,4.26,6.82,5.21c2.08,0.87,4.15,1.08,6.12,0.72c1.99-0.37,3.9-1.35,5.65-2.89c2.25-1.97,4.22-4.84,5.75-8.54 c0.26-0.62,0.41-1.25,0.49-1.89C57.21,73.02,57.23,72.75,57.23,72.48L57.23,72.48L57.23,72.48z M73.98,65.82 c-0.6,1.47-1.48,2.79-2.65,3.98c-1.24,1.26-2.78,2.35-4.66,3.27c-0.02,0.5-0.04,0.97-0.09,1.43c-0.06,0.8-0.16,1.63-0.3,2.48 c-0.54,3.38-1.69,5.88-2.84,8.36c-0.75,1.62-1.49,3.22-2.01,4.99c-0.19,0.64-0.25,1.21-0.22,1.73c0.06,0.88,0.43,1.59,1.01,2.15 c0.65,0.64,1.57,1.11,2.59,1.41c1.13,0.33,2.38,0.46,3.57,0.38c1.06-0.07,2.15-0.28,3.22-0.57c1.11-0.3,2.18-0.69,3.2-1.12 c0.94-0.39,1.83-0.83,2.68-1.33c0.87-0.5,1.7-1.06,2.51-1.65c2.72-2,4.62-4.16,5.77-6.35c1.04-2,1.44-4.05,1.24-6.04 c-0.2-2.01-1.02-4-2.4-5.88c-1.77-2.41-4.47-4.62-8.02-6.45c-0.59-0.31-1.21-0.52-1.84-0.64C74.51,65.89,74.25,65.85,73.98,65.82 L73.98,65.82L73.98,65.82z M65.86,50.31c1.49,0.54,2.85,1.36,4.09,2.47c1.32,1.19,2.48,2.68,3.48,4.51c0.47,0,0.95,0.01,1.43,0.03 c0.86,0.03,1.68,0.09,2.49,0.18c3.38,0.39,5.93,1.43,8.47,2.48c1.63,0.66,3.25,1.33,5.09,1.78c0.02,0.01,0.03,0.01,0.06,0.02 c0.62,0.15,1.18,0.18,1.67,0.13c0.88-0.09,1.57-0.5,2.11-1.1c0.6-0.68,1.03-1.62,1.29-2.66c0.28-1.14,0.34-2.4,0.22-3.58 c-0.11-1.07-0.37-2.14-0.7-3.2c-0.35-1.09-0.78-2.15-1.26-3.15c-0.43-0.91-0.92-1.79-1.45-2.62c-0.53-0.82-1.12-1.63-1.76-2.43 c-2.12-2.63-4.36-4.43-6.6-5.47c-2.04-0.94-4.11-1.25-6.09-0.97c-2,0.29-3.95,1.19-5.77,2.65c-2.33,1.87-4.42,4.67-6.09,8.29 c-0.28,0.61-0.46,1.24-0.57,1.87C65.91,49.78,65.88,50.04,65.86,50.31L65.86,50.31L65.86,50.31z M68.08,55.6 c-1.54-1.54-3.67-2.49-6.02-2.49c-2.35,0-4.48,0.95-6.02,2.49c-1.54,1.54-2.49,3.67-2.49,6.02s0.95,4.48,2.49,6.01 c1.54,1.54,3.67,2.49,6.02,2.49c2.35,0,4.48-0.96,6.02-2.49c1.54-1.54,2.49-3.67,2.49-6.01S69.61,57.13,68.08,55.6L68.08,55.6 L68.08,55.6z M50.36,57.33c0.53-1.5,1.35-2.86,2.45-4.1c1.17-1.31,2.67-2.47,4.5-3.48c0-0.48,0-0.95,0.02-1.43 c0.03-0.85,0.09-1.68,0.18-2.49c0.38-3.4,1.42-5.95,2.45-8.48c0.67-1.65,1.34-3.3,1.78-5.09c0.16-0.64,0.2-1.22,0.14-1.73 c-0.09-0.87-0.51-1.57-1.11-2.11c-0.69-0.61-1.62-1.03-2.66-1.28c-1.14-0.27-2.4-0.34-3.58-0.21c-1.07,0.12-2.15,0.37-3.2,0.71 c-1.07,0.34-2.13,0.78-3.15,1.26c-0.91,0.43-1.78,0.92-2.62,1.46c-0.85,0.55-1.66,1.13-2.42,1.76c-2.63,2.13-4.43,4.37-5.47,6.63 c-0.94,2.04-1.25,4.11-0.95,6.08c0.29,2,1.19,3.95,2.66,5.76c1.88,2.32,4.68,4.41,8.31,6.08c0.61,0.28,1.24,0.46,1.86,0.56 C49.82,57.28,50.09,57.31,50.36,57.33L50.36,57.33L50.36,57.33z M61.44,15.39c25.44,0,46.06,20.62,46.06,46.06 c0,25.44-20.62,46.06-46.06,46.06c-25.44,0-46.06-20.62-46.06-46.06C15.38,36.01,36,15.39,61.44,15.39L61.44,15.39z M108.06,9.56 c3.23,0,5.84,2.62,5.84,5.84c0,3.23-2.62,5.84-5.84,5.84c-3.22,0-5.84-2.62-5.84-5.84C102.22,12.17,104.84,9.56,108.06,9.56 L108.06,9.56z M14.81,9.56c3.23,0,5.84,2.62,5.84,5.84c0,3.23-2.62,5.84-5.84,5.84c-3.23,0-5.84-2.62-5.84-5.84 C8.97,12.17,11.59,9.56,14.81,9.56L14.81,9.56z M108.06,101.73c3.23,0,5.84,2.62,5.84,5.84s-2.62,5.84-5.84,5.84 c-3.22,0-5.84-2.62-5.84-5.84S104.84,101.73,108.06,101.73L108.06,101.73z M20.66,107.57c0,3.23-2.62,5.84-5.84,5.84 c-3.23,0-5.84-2.62-5.84-5.84s2.62-5.84,5.84-5.84C18.04,101.73,20.66,104.35,20.66,107.57L20.66,107.57z"/>
|
||||
|
||||
</g>
|
||||
|
||||
</svg>
|
||||
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="923.000000pt" height="923.000000pt" viewBox="0 0 923.000000 923.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,923.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M110 7235 l0 -95 293 -2 292 -3 3 -2482 2 -2483 95 0 95 0 0 2580 0
|
||||
2580 -390 0 -390 0 0 -95z"/>
|
||||
<path d="M1010 4750 l0 -2100 3853 0 c4175 0 3902 -3 4009 51 105 53 203 184
|
||||
228 302 7 36 10 571 8 1782 l-3 1730 -33 69 c-61 129 -147 208 -271 246 -62
|
||||
20 -108 20 -3927 20 l-3864 0 0 -2100z m2739 1605 c800 -165 1351 -903 1290
|
||||
-1728 -58 -767 -641 -1394 -1392 -1496 -101 -14 -343 -14 -444 0 -598 81
|
||||
-1118 516 -1312 1096 -264 788 98 1648 841 2003 166 79 328 126 518 150 127
|
||||
15 358 4 499 -25z m3373 24 c670 -72 1232 -564 1398 -1223 40 -157 54 -294 47
|
||||
-466 -9 -247 -59 -446 -167 -665 -230 -469 -669 -799 -1178 -886 -156 -26
|
||||
-389 -26 -545 1 -660 112 -1172 614 -1319 1290 -19 91 -22 134 -22 325 0 190
|
||||
3 234 22 322 73 334 216 598 451 834 354 353 823 521 1313 468z"/>
|
||||
<path d="M3290 6081 c-34 -6 -35 -8 -47 -66 -48 -237 -39 -537 23 -798 9 -37
|
||||
15 -69 13 -70 -2 -2 -27 -17 -56 -34 l-51 -31 -69 71 c-189 197 -327 419 -384
|
||||
622 -13 44 -24 82 -25 83 -5 8 -95 -61 -168 -129 -96 -89 -187 -206 -255 -324
|
||||
-75 -130 -75 -130 -11 -187 156 -139 411 -283 635 -357 l120 -40 3 -65 3 -64
|
||||
-108 -25 c-171 -41 -257 -51 -418 -50 -139 0 -248 15 -371 49 -18 5 -20 2 -17
|
||||
-28 27 -239 94 -430 215 -620 55 -86 42 -84 168 -36 206 79 443 231 606 390
|
||||
l60 59 56 -33 c66 -38 66 -21 3 -214 -73 -224 -181 -416 -313 -555 -75 -80
|
||||
-78 -73 43 -120 164 -64 306 -89 504 -89 94 0 132 4 139 13 36 43 62 385 43
|
||||
572 -11 109 -44 306 -57 339 -4 11 85 76 105 76 14 0 154 -159 231 -261 84
|
||||
-112 191 -320 222 -436 13 -46 26 -82 30 -80 4 1 45 33 92 70 97 77 208 198
|
||||
271 296 45 70 115 204 115 221 0 14 -80 86 -169 151 -151 111 -336 203 -537
|
||||
269 l-102 34 5 60 c3 34 8 64 12 67 10 11 175 49 284 65 141 22 399 14 515
|
||||
-15 46 -12 86 -21 89 -21 12 0 -7 148 -31 242 -42 165 -131 360 -205 449 l-26
|
||||
31 -65 -22 c-212 -70 -464 -225 -658 -405 -33 -30 -62 -55 -65 -55 -3 0 -28
|
||||
14 -55 31 l-50 31 24 88 c66 249 189 482 340 648 36 40 65 74 63 76 -14 12
|
||||
-198 78 -264 95 -145 36 -349 51 -455 32z m190 -1197 c98 -39 119 -164 39
|
||||
-240 -27 -26 -37 -29 -94 -29 -57 0 -67 3 -94 29 -78 75 -61 194 34 237 50 23
|
||||
64 23 115 3z"/>
|
||||
<path d="M6819 6083 l-37 -4 -18 -92 c-30 -145 -27 -498 5 -667 13 -69 26
|
||||
-137 28 -151 4 -21 -1 -29 -24 -41 -15 -8 -39 -22 -53 -31 -26 -17 -26 -16
|
||||
-82 41 -130 134 -239 284 -311 427 -39 78 -97 237 -97 265 0 34 -17 30 -81
|
||||
-17 -142 -104 -296 -290 -378 -457 l-42 -84 43 -40 c182 -167 434 -305 718
|
||||
-394 l45 -15 3 -65 3 -66 -108 -25 c-276 -65 -509 -70 -719 -17 -42 11 -79 18
|
||||
-82 16 -8 -9 27 -213 53 -301 29 -102 126 -306 180 -377 l35 -48 77 29 c229
|
||||
85 423 204 628 386 l83 75 51 -33 c49 -31 51 -34 46 -67 -11 -65 -85 -275
|
||||
-130 -366 -56 -115 -145 -249 -226 -337 -34 -37 -60 -69 -58 -71 29 -25 200
|
||||
-87 314 -112 77 -17 403 -30 422 -17 43 31 68 453 39 663 -9 63 -25 150 -35
|
||||
192 l-18 78 55 30 56 30 54 -52 c173 -170 327 -415 388 -618 14 -47 28 -91 30
|
||||
-98 10 -35 246 179 337 306 31 44 80 124 109 178 l52 98 -55 48 c-159 144
|
||||
-417 289 -643 363 l-117 39 3 65 3 66 115 27 c173 41 280 51 458 45 111 -4
|
||||
182 -11 241 -26 46 -12 86 -19 89 -16 8 8 -16 165 -39 252 -38 143 -137 353
|
||||
-209 441 l-20 24 -67 -22 c-210 -68 -463 -225 -646 -399 l-68 -65 -55 30 -55
|
||||
29 6 40 c10 67 73 244 126 354 64 134 145 257 232 348 l68 72 -38 19 c-59 30
|
||||
-212 79 -304 97 -83 16 -309 27 -380 18z m210 -1210 c65 -49 83 -122 47 -191
|
||||
-46 -89 -185 -98 -244 -15 -56 79 -23 184 68 222 34 15 98 6 129 -16z"/>
|
||||
<path d="M348 6231 l-33 -29 -3 -539 c-3 -477 -1 -541 13 -568 25 -48 51 -59
|
||||
158 -63 l97 -4 0 616 0 616 -100 0 c-96 0 -101 -1 -132 -29z"/>
|
||||
<path d="M362 4454 c-52 -36 -52 -33 -52 -594 0 -571 0 -574 59 -604 21 -11
|
||||
58 -16 121 -16 l90 0 0 615 0 615 -98 0 c-72 0 -103 -4 -120 -16z"/>
|
||||
<path d="M1652 2309 l3 -221 33 -29 32 -29 1661 0 c1532 0 1663 1 1689 17 16
|
||||
9 33 27 39 40 7 15 11 104 11 233 l0 210 -1736 0 -1735 0 3 -221z"/>
|
||||
<path d="M5310 2323 c0 -190 2 -211 20 -241 11 -18 32 -37 46 -42 14 -6 169
|
||||
-10 366 -10 l340 0 34 34 34 34 0 216 0 216 -420 0 -420 0 0 -207z"/>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 502.664 502.664" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M70.364,0v502.664H432.3V0H70.364z M243.966,457.732H109.536V316.185l46.981,43.53
|
||||
c-15.509,6.795-26.381,22.239-26.381,40.251c0,24.202,19.673,43.897,43.94,43.897s43.918-19.673,43.918-43.897
|
||||
c0-1.208-0.259-2.33-0.367-3.538c0.043-0.043,0.086-0.065,0.129-0.108l26.208,0.453
|
||||
C243.966,396.773,243.966,457.732,243.966,457.732z M198.537,396.557c0.086,1.165,0.626,2.222,0.626,3.408
|
||||
c0,13.848-11.238,25.065-25.087,25.065c-13.892,0-25.13-11.238-25.13-25.065c0-13.935,11.238-25.13,25.13-25.13
|
||||
c2.243,0,4.228,0.733,6.32,1.273c39.755-30.415,114.778-86.52,116.267-84.903C297.936,292.672,233.223,360.728,198.537,396.557z
|
||||
M272.87,339.308c47.779-52.201,42.645-58.392,39.237-62.145c-8.499-9.405-8.499-9.405-86.089,48.577l-13.331,10.181
|
||||
c-63.677-16.998-110.723-74.915-110.723-143.985c0-82.422,66.826-149.248,149.162-149.248
|
||||
c82.465,0,149.227,66.848,149.227,149.248C400.354,266.895,345.003,328.782,272.87,339.308z"/>
|
||||
<path d="M251.127,147.544c-24.461,0-44.328,19.91-44.328,44.393c0,24.504,19.888,44.306,44.328,44.306
|
||||
c24.591,0,44.393-19.824,44.393-44.306C295.498,167.476,275.653,147.566,251.127,147.544z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,35 @@
|
||||
import motherboard from './motherboard.svg'
|
||||
import pcCase from './case.svg'
|
||||
import cooler from './cooler.svg'
|
||||
import cpu from './cpu.svg'
|
||||
import fan from './fan.svg'
|
||||
import ssd from './mvne.svg'
|
||||
import graphicCard from './graphic-card.svg'
|
||||
import hardDrive from './hard-drive.svg'
|
||||
import memory from './memory.svg'
|
||||
import defaultIcon from './default-icon.svg'
|
||||
import powerSupply from './power-supply.svg'
|
||||
import wiFiCard from './wifi-card.svg'
|
||||
import siteIcon from './site-icon.svg'
|
||||
import trashIcon from './trash-icon.svg'
|
||||
import crossIcon from './cross-icon.svg'
|
||||
import userProfileIcon from './user-profile-icon.svg'
|
||||
|
||||
export {
|
||||
motherboard,
|
||||
defaultIcon,
|
||||
pcCase,
|
||||
cooler,
|
||||
cpu,
|
||||
fan,
|
||||
graphicCard,
|
||||
hardDrive,
|
||||
memory,
|
||||
powerSupply,
|
||||
wiFiCard,
|
||||
siteIcon,
|
||||
trashIcon,
|
||||
crossIcon,
|
||||
userProfileIcon,
|
||||
ssd,
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="1300.000000pt" height="1300.000000pt" viewBox="0 0 1300.000000 1300.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,1300.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M0 8101 l0 -499 233 -4 c227 -3 233 -4 289 -30 182 -84 266 -308 183
|
||||
-486 -33 -71 -106 -146 -174 -179 -51 -25 -68 -28 -193 -31 l-138 -4 0 -177 0
|
||||
-178 124 -6 c154 -8 214 -28 291 -98 201 -184 148 -494 -105 -612 -41 -19 -67
|
||||
-22 -277 -25 l-233 -4 0 -944 0 -944 6500 0 6500 0 0 945 0 945 -209 0 c-241
|
||||
0 -296 11 -381 76 -96 73 -144 169 -144 289 1 103 28 176 94 247 82 91 188
|
||||
127 368 128 l72 0 0 179 0 179 -137 4 c-123 3 -143 6 -187 28 -281 144 -282
|
||||
526 -1 665 l60 30 233 3 232 4 0 499 0 499 -6500 0 -6500 0 0 -499z m2790
|
||||
-1046 l0 -1145 -685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0
|
||||
-1145 -685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0 -1145
|
||||
-685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1755 0 l0 -1140 -687 -3
|
||||
-688 -2 0 1145 0 1145 688 -2 687 -3 0 -1140z m1755 0 l0 -1145 -685 0 -685 0
|
||||
0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0 -1145 -685 0 -685 0 0 1145 0
|
||||
1145 685 0 685 0 0 -1145z m-10512 -1817 l-3 -243 -162 -3 -163 -2 0 245 0
|
||||
245 165 0 165 0 -2 -242z m510 0 l-3 -243 -162 -3 -163 -2 0 245 0 245 165 0
|
||||
165 0 -2 -242z m507 -3 l0 -240 -162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0
|
||||
-240z m505 0 l0 -245 -160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0
|
||||
l0 -245 -160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0
|
||||
-160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230
|
||||
c-1 126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m510 0 l0 -245 -162 2
|
||||
-163 3 -3 230 c-1 126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m505 0
|
||||
l0 -240 -162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0 -240z m510 0 l0 -240
|
||||
-162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0 -240z m2035 0 l0 -245 -160 0
|
||||
-160 0 0 245 0 245 160 0 160 0 0 -245z m505 0 l0 -240 -162 -3 -163 -2 0 245
|
||||
0 245 163 -2 162 -3 0 -240z m515 0 l0 -245 -162 2 -163 3 -3 230 c-1 126 0
|
||||
235 2 242 4 10 45 13 166 13 l160 0 0 -245z m508 3 l-3 -243 -162 -3 -163 -2
|
||||
0 245 0 245 165 0 165 0 -2 -242z m505 215 c0 -13 -1 -122 -2 -243 l-1 -220
|
||||
-160 0 -160 0 0 245 0 245 162 -2 c161 -3 162 -3 161 -25z m507 -218 l0 -245
|
||||
-160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0 -160 0
|
||||
0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0 -160 0 0 245 0 245
|
||||
160 0 160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230 c-1 126 0 235 2 242
|
||||
4 10 45 13 166 13 l160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230 c-1
|
||||
126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m-5627 142 c24 -14 58 -42
|
||||
76 -62 60 -69 65 -89 69 -327 l4 -218 -281 0 -281 0 0 185 c0 101 5 206 11
|
||||
234 19 92 90 175 176 207 60 23 171 13 226 -19z"/>
|
||||
</g>
|
||||
</svg>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,271 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="1013.000000pt" height="1013.000000pt" viewBox="0 0 1013.000000 1013.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,1013.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M167 6653 c-4 -3 -7 -262 -7 -575 l0 -568 28 0 c16 0 57 -14 91 -31
|
||||
96 -48 141 -122 141 -233 0 -121 -78 -218 -201 -249 l-54 -14 0 -569 0 -569
|
||||
4690 0 4690 0 3 21 c2 12 17 34 33 50 l30 29 220 3 219 3 0 205 0 204 -221 0
|
||||
-221 0 -29 29 c-35 36 -41 80 -16 129 23 47 50 52 277 52 l210 0 0 989 c0 892
|
||||
-2 989 -16 995 -9 3 -109 6 -223 6 l-207 0 -26 28 c-14 15 -28 36 -30 47 -3
|
||||
20 -12 20 -4689 23 -2577 1 -4689 -1 -4692 -5z m9059 -199 c19 -9 44 -31 57
|
||||
-48 l22 -31 0 -1085 0 -1085 -22 -31 c-49 -69 82 -64 -1703 -64 -1785 0 -1654
|
||||
-5 -1703 64 l-22 31 0 1085 0 1085 22 31 c49 68 -84 64 1701 64 1469 0 1617
|
||||
-1 1648 -16z m759 -19 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135
|
||||
45 l128 -3 0 -30z m-9115 -61 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3
|
||||
37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15
|
||||
-21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42
|
||||
-13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1 c0 -38 -3
|
||||
-45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m108 3
|
||||
c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17
|
||||
-42z m110 0 c-2 -30 -8 -44 -19 -46 -13 -2 -18 7 -21 35 -6 46 -3 53 23 53 17
|
||||
0 20 -6 17 -42z m110 0 c-2 -35 -7 -43 -23 -43 -16 0 -21 8 -23 43 -3 39 -2
|
||||
42 23 42 25 0 26 -3 23 -42z m107 -3 c0 -33 -3 -40 -20 -40 -16 0 -21 8 -23
|
||||
43 -3 40 -2 43 20 40 20 -3 23 -9 23 -43z m105 -1 c0 -38 -3 -45 -17 -42 -13
|
||||
2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1 c0 -38 -3 -45
|
||||
-20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 -1 c0
|
||||
-38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z
|
||||
m650 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21
|
||||
-6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17
|
||||
42 18 0 21 -6 21 -46z m108 4 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0
|
||||
40 3 46 21 46 18 0 20 -5 17 -42z m112 -3 c0 -38 -3 -45 -20 -45 -17 0 -20 7
|
||||
-20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m108 3 c-2 -31 -8 -44 -20 -46 -15
|
||||
-3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2 -31 -8 -44
|
||||
-20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2
|
||||
-31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z
|
||||
m110 0 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20
|
||||
-5 17 -42z m107 -3 c0 -33 -3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25
|
||||
55 14 -2 18 -13 18 -43z m105 -1 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46
|
||||
-3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19
|
||||
15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m650 0 c0 -38 -3 -45 -17 -42
|
||||
-13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3
|
||||
-45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0
|
||||
c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21
|
||||
-46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18
|
||||
0 21 -6 21 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
|
||||
20 45 17 0 20 -7 20 -45z m108 3 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42
|
||||
0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2 -35 -7 -43 -23 -43 -15 0 -21
|
||||
8 -23 28 -5 40 4 57 28 57 19 0 21 -5 18 -42z m107 -3 c0 -33 -3 -40 -20 -40
|
||||
-16 0 -21 8 -23 43 -3 40 -2 43 20 40 20 -3 23 -9 23 -43z m105 -1 c0 -38 -3
|
||||
-45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1
|
||||
c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
|
||||
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
|
||||
20 -45z m4546 -50 c13 -52 5 -55 -131 -55 -136 0 -144 3 -131 55 6 25 6 25
|
||||
131 25 125 0 125 0 131 -25z m-7958 -31 l22 -6 0 -999 0 -999 -652 2 -653 3
|
||||
-3 1003 -2 1002 632 0 c348 0 643 -3 656 -6z m1764 -22 c9 -32 8 -1957 -1
|
||||
-1970 -6 -9 -149 -12 -657 -10 l-649 3 -3 985 c-1 542 0 991 3 998 3 9 143 12
|
||||
654 12 622 0 649 -1 653 -18z m1738 -982 l0 -1000 -652 2 -653 3 -3 985 c-1
|
||||
542 0 991 3 998 3 9 144 12 655 12 l650 0 0 -1000z m4451 923 c6 -6 9 -21 7
|
||||
-34 -3 -24 -4 -24 -133 -24 l-130 0 0 30 c0 30 1 30 65 36 92 8 179 4 191 -8z
|
||||
m-9281 -33 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45
|
||||
-3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20
|
||||
38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4
|
||||
17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46
|
||||
21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0 -18 -5 -20 -42 -17 -31 2
|
||||
-44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42
|
||||
-17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m-4962 -97 c3
|
||||
-22 0 -23 -40 -20 -31 2 -44 8 -46 20 -2 12 5 18 25 21 46 7 58 3 61 -21z
|
||||
m1475 19 c4 -1 7 -10 7 -21 0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 19 0 11 8
|
||||
21 18 23 15 3 26 3 65 -1z m265 -18 c3 -21 -1 -23 -37 -23 -42 0 -57 11 -47
|
||||
36 4 11 17 14 43 12 31 -2 39 -7 41 -25z m1480 -1 c3 -19 -1 -22 -37 -22 -41
|
||||
0 -57 11 -48 34 3 7 20 12 43 11 32 -2 40 -6 42 -23z m246 22 c9 -3 16 -15 16
|
||||
-25 0 -16 -7 -19 -40 -19 -28 0 -43 5 -47 16 -10 26 32 43 71 28z m1494 -23
|
||||
c3 -20 0 -22 -40 -19 -30 2 -44 8 -46 20 -2 11 5 18 20 21 43 7 63 1 66 -22z
|
||||
m4327 -21 l0 -35 -130 0 c-128 0 -130 0 -133 23 -7 51 -2 53 135 50 l128 -3 0
|
||||
-35z m-9285 -75 c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15
|
||||
36 0 40 -2 40 -25z m1480 0 c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10
|
||||
20 15 46 15 36 0 40 -2 40 -25z m260 0 c0 -22 -4 -25 -39 -25 -42 0 -57 11
|
||||
-47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m1480 0 c0 -22 -4 -25 -39 -25
|
||||
-42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m260 0 c0 -22 -4
|
||||
-25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m1480 0
|
||||
c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40
|
||||
-25z m4325 -50 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45 l128
|
||||
-3 0 -30z m-9287 -47 c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11 19
|
||||
16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9
|
||||
-48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m260 0 c-2 -18 -11 -24 -37 -26
|
||||
-38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1477 -3 c0 -15 -8
|
||||
-21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m263 3
|
||||
c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11 19 16 47 16 37 0 41 -2 38
|
||||
-22z m1477 -3 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30
|
||||
-2 38 -7 38 -23z m4331 -60 c13 -53 6 -56 -133 -53 -125 3 -128 3 -131 26 -7
|
||||
50 -1 52 132 52 126 0 126 0 132 -25z m-9291 -40 c0 -15 -8 -21 -34 -23 -38
|
||||
-4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m1480 0 c0 -15 -8 -21
|
||||
-34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m265 0 c0
|
||||
-22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z
|
||||
m1475 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38
|
||||
-7 38 -23z m260 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43
|
||||
13 30 -2 38 -7 38 -23z m1480 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4
|
||||
12 16 15 43 13 30 -2 38 -7 38 -23z m4325 -69 c6 -8 10 -25 8 -38 -3 -23 -5
|
||||
-23 -133 -23 l-130 0 -3 24 c-6 41 20 51 139 51 81 0 109 -3 119 -14z m-9280
|
||||
-26 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38
|
||||
-20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0
|
||||
38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52
|
||||
27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21
|
||||
11 27 52 27 31 0 38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45
|
||||
13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0
|
||||
-45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20
|
||||
-45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0
|
||||
-17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z
|
||||
m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3
|
||||
38 -20z m1478 -2 c3 -15 -4 -18 -42 -18 -32 0 -46 4 -46 13 0 22 12 28 50 25
|
||||
24 -2 36 -9 38 -20z m262 2 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11
|
||||
27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45
|
||||
13 0 21 11 27 52 27 31 0 38 -3 38 -20z m4328 -18 c6 -42 -11 -49 -123 -51
|
||||
-59 -1 -113 3 -125 9 -19 10 -27 49 -13 64 4 3 63 5 132 4 123 -3 126 -4 129
|
||||
-26z m-9288 -82 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38
|
||||
0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20
|
||||
45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0
|
||||
21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -39 -20 -40 0 -57
|
||||
11 -46 30 3 6 24 10 46 10 32 0 39 -3 39 -20z m260 0 c0 -17 -7 -20 -45 -20
|
||||
-31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7
|
||||
-20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m4325
|
||||
-55 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45 l128 -3 0 -30z
|
||||
m-9285 -45 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45
|
||||
-3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20
|
||||
38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4
|
||||
17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -39 -20 -40 0 -57 11 -46
|
||||
30 3 6 24 10 46 10 32 0 39 -3 39 -20z m260 0 c0 -17 -7 -20 -45 -20 -38 0
|
||||
-45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
|
||||
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m4328 -68 c7 -45
|
||||
-12 -52 -128 -52 -60 0 -115 3 -124 6 -16 6 -22 54 -9 68 4 3 63 5 132 4 123
|
||||
-3 126 -4 129 -26z m-9288 -33 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3
|
||||
14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20 -38 0 -45 3
|
||||
-45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31
|
||||
2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20
|
||||
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0
|
||||
-18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
|
||||
m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
|
||||
-3 46 -21z m4320 -73 c6 -8 10 -25 8 -38 -3 -23 -5 -23 -133 -23 -128 0 -130
|
||||
0 -133 23 -7 45 12 52 133 52 86 0 115 -3 125 -14z m-9280 -27 c0 -18 -5 -20
|
||||
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0
|
||||
-17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z
|
||||
m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
|
||||
-3 46 -21z m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42
|
||||
17 40 0 46 -3 46 -21z m260 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14
|
||||
4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45
|
||||
20 0 17 7 20 45 20 38 0 45 -3 45 -20z m-4960 -100 c0 -17 -7 -20 -45 -20 -38
|
||||
0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
|
||||
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7
|
||||
-20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0
|
||||
c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z
|
||||
m260 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3
|
||||
45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38
|
||||
0 45 -3 45 -20z m4325 -25 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48
|
||||
135 45 l128 -3 0 -30z m-6065 -76 c0 -15 -7 -19 -39 -19 -41 0 -57 11 -48 33
|
||||
3 8 19 11 46 9 32 -3 41 -8 41 -23z m-3220 0 c0 -18 -5 -20 -42 -17 -31 2 -44
|
||||
8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20
|
||||
-38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20
|
||||
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1740 0 c0
|
||||
-18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
|
||||
m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
|
||||
-3 46 -21z m4325 -54 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45
|
||||
l128 -3 0 -30z m-6065 -46 c0 -15 -7 -19 -39 -19 -41 0 -57 11 -48 33 3 8 19
|
||||
11 46 9 32 -3 41 -8 41 -23z m1740 0 c0 -17 -6 -20 -42 -17 -31 2 -44 8 -46
|
||||
20 -2 13 5 17 35 20 47 4 53 2 53 -23z m-4960 0 c0 -18 -5 -20 -42 -17 -31 2
|
||||
-44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42
|
||||
-17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0 -18 -5
|
||||
-20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1740 0
|
||||
c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
|
||||
m5808 -67 c7 -45 -12 -52 -132 -52 -74 0 -116 4 -124 12 -13 13 -16 51 -5 62
|
||||
4 3 63 5 132 4 123 -3 126 -4 129 -26z m-9290 -24 c-2 -18 -11 -24 -37 -26
|
||||
-38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11
|
||||
-24 -37 -26 -38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m262 -3
|
||||
c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40
|
||||
-25z m1478 3 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9 -48 32 4 11 19 16 47 16
|
||||
37 0 41 -2 38 -22z m260 0 c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11
|
||||
19 16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9
|
||||
-48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m4328 -83 c4 -8 3 -26 0 -40 l-7
|
||||
-26 -127 3 -127 3 -3 29 c-2 16 2 32 10 37 7 5 66 9 131 9 95 0 119 -3 123
|
||||
-15z m-9286 -14 c0 -12 -9 -20 -26 -24 -34 -6 -64 2 -64 17 0 20 11 26 52 26
|
||||
31 0 38 -4 38 -19z m1478 -3 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9 -48 32 4
|
||||
11 19 16 47 16 37 0 41 -2 38 -22z m260 0 c-2 -17 -10 -24 -33 -26 -37 -3 -60
|
||||
11 -52 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1480 0 c2 -12 -6 -19 -33 -24
|
||||
-40 -7 -61 5 -51 31 8 23 80 17 84 -7z m260 0 c-2 -16 -11 -23 -33 -25 -37 -4
|
||||
-60 10 -52 31 4 11 19 16 47 16 37 0 41 -2 38 -22z m1477 -3 c0 -16 -7 -20
|
||||
-37 -22 -40 -2 -53 8 -44 33 4 11 17 14 43 12 30 -2 38 -7 38 -23z m-4955 -95
|
||||
c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z
|
||||
m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38
|
||||
-3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27
|
||||
31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11
|
||||
27 52 27 31 0 38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13
|
||||
0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45
|
||||
4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20 -45
|
||||
-20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17
|
||||
-7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m260
|
||||
0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38
|
||||
-20z m1478 -2 c3 -15 -4 -18 -42 -18 -32 0 -46 4 -46 13 0 22 12 28 50 25 24
|
||||
-2 36 -9 38 -20z m262 2 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27
|
||||
52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0
|
||||
21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20 -45 -20 -38 0
|
||||
-45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
|
||||
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7
|
||||
-20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0
|
||||
c0 -17 -7 -20 -39 -20 -40 0 -57 11 -46 30 3 6 24 10 46 10 32 0 39 -3 39 -20z
|
||||
m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3
|
||||
38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27
|
||||
31 0 38 -3 38 -20z m4320 -94 c6 -8 10 -25 8 -38 -3 -23 -5 -23 -133 -23 -128
|
||||
0 -130 0 -133 23 -7 45 12 52 133 52 86 0 115 -3 125 -14z m-9110 -101 c0 -38
|
||||
-3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0 13 -14 13 -45z m110 0
|
||||
c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
|
||||
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
|
||||
20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
|
||||
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
|
||||
20 45 17 0 20 -7 20 -45z m108 -3 c3 -36 0 -42 -16 -42 -15 0 -21 9 -25 37 -7
|
||||
42 -2 55 21 51 12 -2 18 -16 20 -46z m107 3 c0 -33 -3 -40 -20 -40 -15 0 -21
|
||||
8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z m110 0 c0 -34 -3 -40 -22 -43
|
||||
-21 -3 -23 1 -23 36 0 43 7 54 30 50 10 -2 15 -15 15 -43z m105 0 c0 -38 -3
|
||||
-45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0
|
||||
-38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
|
||||
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
|
||||
20 -45z m650 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
|
||||
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
|
||||
20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0
|
||||
38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7
|
||||
-20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17
|
||||
0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20
|
||||
-45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m105 0 c0 -30 -4
|
||||
-41 -17 -43 -15 -3 -18 4 -18 43 0 39 3 46 18 43 13 -2 17 -13 17 -43z m110 0
|
||||
c0 -30 -4 -41 -17 -43 -15 -3 -18 4 -18 43 0 39 3 46 18 43 13 -2 17 -13 17
|
||||
-43z m110 0 c0 -33 -3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2
|
||||
18 -13 18 -43z m105 -1 c0 -38 -3 -45 -17 -42 -32 6 -30 88 2 88 11 0 15 -11
|
||||
15 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
|
||||
0 20 -7 20 -45z m650 -1 c0 -38 -3 -45 -17 -42 -32 6 -30 88 2 88 11 0 15 -11
|
||||
15 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0
|
||||
13 -14 13 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20
|
||||
45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38
|
||||
3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20
|
||||
45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0
|
||||
-20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m105 0 c0 -33 -3 -40 -20
|
||||
-40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z m110 0 c0 -33
|
||||
-3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z
|
||||
m105 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0 13 -14
|
||||
13 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
|
||||
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
|
||||
20 45 17 0 20 -7 20 -45z m4548 -46 c5 -43 -15 -50 -144 -47 -116 3 -119 4
|
||||
-122 26 -7 51 -2 53 135 50 l128 -3 3 -26z m-2 -114 c13 -53 6 -56 -133 -53
|
||||
-125 3 -128 3 -131 26 -7 50 -1 52 132 52 126 0 126 0 132 -25z"/>
|
||||
<path d="M6090 5300 l0 -480 85 0 85 0 0 332 c0 188 4 328 9 323 8 -9 107
|
||||
-286 198 -552 l35 -103 109 0 109 0 0 480 0 480 -85 0 -85 0 0 -315 c0 -173
|
||||
-4 -315 -8 -315 -8 0 -55 125 -177 475 l-53 150 -111 3 -111 3 0 -481z"/>
|
||||
<path d="M6800 5772 c0 -4 23 -106 50 -227 28 -121 76 -330 106 -465 31 -135
|
||||
58 -248 61 -252 2 -5 59 -8 127 -8 l123 0 51 228 c28 125 76 337 107 471 30
|
||||
134 55 247 55 252 0 5 -44 9 -99 9 l-98 0 -68 -345 c-38 -190 -71 -345 -75
|
||||
-345 -3 0 -34 152 -69 338 -35 185 -65 340 -68 345 -6 10 -203 9 -203 -1z"/>
|
||||
<path d="M7560 5300 l0 -480 90 0 90 0 1 368 c0 225 4 359 9 347 5 -11 25 -96
|
||||
45 -190 20 -93 54 -248 76 -343 21 -96 39 -176 39 -178 0 -2 35 -4 78 -4 l77
|
||||
0 79 358 c43 196 82 364 87 372 5 8 9 -151 9 -357 l0 -373 90 0 90 0 -2 478
|
||||
-3 477 -142 3 c-128 2 -142 1 -147 -15 -8 -27 -62 -289 -96 -468 -18 -88 -36
|
||||
-164 -41 -169 -5 -6 -9 -7 -9 -3 0 10 -120 619 -126 640 -5 15 -21 17 -150 17
|
||||
l-144 0 0 -480z"/>
|
||||
<path d="M8683 5544 c-57 -21 -118 -89 -138 -156 -9 -29 -19 -102 -22 -163
|
||||
-10 -199 27 -328 111 -384 35 -23 52 -26 139 -29 54 -2 114 -1 133 3 72 13
|
||||
140 101 151 196 l6 49 -87 0 -86 0 0 -27 c0 -40 -35 -91 -66 -99 -70 -18 -114
|
||||
40 -114 148 l0 68 178 2 177 3 0 100 c-1 164 -52 263 -151 293 -55 16 -179 14
|
||||
-231 -4z m184 -140 c9 -15 19 -53 21 -85 l4 -59 -92 0 -92 0 4 60 c6 79 33
|
||||
110 95 110 35 0 46 -5 60 -26z"/>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1080" height="1080" viewBox="0 0 1080 1080" xml:space="preserve">
|
||||
<desc>Created with Fabric.js 5.2.4</desc>
|
||||
<defs>
|
||||
</defs>
|
||||
<g transform="matrix(1 0 0 1 540 540)" id="67f78da0-5e9d-4333-b8b9-8faaa9c6791d" >
|
||||
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-540" y="-540" rx="0" ry="0" width="1080" height="1080" />
|
||||
</g>
|
||||
<g transform="matrix(1 0 0 1 540 540)" id="6fd75371-cd76-47c5-a752-7df1f9cbc828" >
|
||||
</g>
|
||||
<g transform="matrix(1 0 0 1 540 540)" >
|
||||
<g style="" vector-effect="non-scaling-stroke" >
|
||||
<g transform="matrix(0.13 0 0 -0.13 -179.33 0)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3655, -5802.99)" d="M 3650 9084 C 2360 8868 1304 8691 1303 8691 C 1301 8690 1300 7435 1300 5900 L 1300 3110 L 1348 3110 C 1374 3110 2253 3074 3303 3030 C 4818 2967 5216 2947 5238 2936 C 5346 2879 5367 2745 5279 2665 C 5258 2646 5228 2627 5213 2624 C 5188 2617 1547 2762 1373 2776 L 1300 2782 L 1300 2611 C 1300 2517 1301 2440 1303 2439 C 1317 2435 5997 2124 6003 2127 C 6007 2129 6010 3785 6010 5806 C 6010 7827 6007 9479 6003 9479 C 5998 9478 4940 9301 3650 9084 z M 5715 8659 C 5798 8636 5852 8550 5836 8465 C 5828 8422 5777 8362 5733 8344 C 5682 8322 5485 8326 5434 8349 C 5298 8411 5314 8617 5459 8660 C 5499 8672 5670 8671 5715 8659 z M 3976 8296 C 4317 8225 4608 8066 4884 7800 C 5296 7402 5556 6854 5646 6195 C 5673 5996 5671 5562 5643 5380 C 5563 4868 5398 4457 5128 4092 C 5049 3985 4857 3784 4755 3700 C 4587 3563 4353 3433 4161 3371 C 3979 3312 3867 3295 3650 3296 C 3436 3296 3345 3310 3151 3371 C 2722 3507 2309 3856 2038 4312 C 1842 4644 1721 5006 1664 5435 C 1639 5619 1639 6028 1663 6200 C 1715 6568 1804 6861 1956 7160 C 2073 7391 2199 7567 2380 7754 C 2685 8068 3033 8254 3434 8315 C 3572 8337 3822 8327 3976 8296 z M 2066 8134 C 2120 8094 2135 8064 2135 7995 C 2135 7924 2118 7892 2060 7853 C 2030 7832 2015 7830 1898 7830 C 1750 7830 1717 7840 1675 7894 C 1609 7981 1646 8112 1750 8153 C 1758 8156 1827 8158 1902 8157 C 2022 8155 2042 8153 2066 8134 z M 2066 3764 C 2120 3724 2135 3694 2135 3625 C 2135 3556 2120 3526 2066 3486 C 2041 3467 2024 3465 1892 3465 C 1754 3465 1743 3466 1712 3488 C 1672 3517 1640 3577 1640 3625 C 1640 3689 1689 3759 1750 3783 C 1758 3786 1827 3788 1902 3787 C 2022 3785 2042 3783 2066 3764 z M 5752 3604 C 5767 3596 5791 3574 5806 3555 C 5866 3476 5839 3359 5750 3312 C 5708 3290 5695 3289 5574 3292 C 5448 3295 5442 3296 5406 3324 C 5291 3411 5334 3592 5477 3621 C 5531 3631 5720 3620 5752 3604 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -124.6 -197.7)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4065.48, -7285.68)" d="M 3707 7883 C 3582 7585 3519 7276 3518 6965 C 3517 6800 3536 6594 3552 6584 C 3557 6580 3585 6581 3613 6584 L 3665 6591 L 3722 6708 C 3893 7060 4179 7362 4519 7552 L 4613 7604 L 4569 7642 C 4364 7821 4072 7951 3804 7984 L 3752 7990 L 3707 7883 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -272.27 -179.3)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2958, -7147.72)" d="M 3241 7924 C 3028 7854 2842 7737 2656 7559 L 2546 7453 L 2559 7374 C 2588 7199 2676 6939 2767 6755 C 2825 6639 2943 6455 3008 6381 L 3047 6337 L 3104 6383 C 3135 6409 3174 6437 3190 6445 C 3225 6463 3225 6465 3203 6601 C 3182 6734 3179 7131 3198 7270 C 3227 7471 3288 7726 3346 7879 C 3359 7914 3370 7946 3370 7951 C 3370 7965 3352 7961 3241 7924 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -46.09 -131.01)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4654.36, -6785.5)" d="M 4749 7299 C 4496 7177 4248 6948 4098 6700 C 4032 6590 3996 6516 4008 6512 C 4029 6505 4137 6437 4185 6400 L 4235 6362 L 4325 6383 C 4459 6413 4736 6412 4876 6382 C 4991 6357 5151 6304 5242 6260 L 5303 6231 L 5296 6283 C 5276 6437 5194 6713 5114 6895 C 5042 7059 4873 7340 4845 7340 C 4839 7340 4796 7322 4749 7299 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -344.4 -67.06)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2417, -6305.89)" d="M 2222 6940 C 2072 6629 1987 6268 1978 5910 L 1976 5805 L 2029 5768 C 2158 5678 2358 5594 2515 5565 C 2595 5550 2794 5541 2805 5551 C 2807 5554 2805 5594 2800 5640 C 2788 5744 2801 5871 2834 5974 L 2858 6049 L 2832 6072 C 2784 6117 2656 6276 2597 6365 C 2511 6496 2398 6732 2336 6910 L 2282 7065 L 2222 6940 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -179.05 10.2)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3657.14, -5726.48)" d="M 3543 6240 C 3382 6208 3224 6067 3163 5900 C 3139 5835 3135 5812 3136 5720 C 3138 5569 3180 5464 3280 5361 C 3483 5152 3820 5150 4026 5356 C 4135 5465 4188 5604 4177 5755 C 4167 5895 4118 6002 4021 6099 C 3899 6221 3718 6274 3543 6240 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -13.2 65.1)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4901, -5314.68)" d="M 4464 6064 C 4456 6061 4460 6036 4476 5985 C 4511 5873 4524 5749 4510 5638 C 4504 5587 4497 5544 4495 5541 C 4492 5539 4514 5509 4543 5476 C 4729 5262 4879 4995 4977 4703 C 5003 4624 5028 4560 5031 4560 C 5039 4560 5127 4755 5170 4865 C 5260 5101 5317 5389 5335 5697 L 5342 5809 L 5293 5844 C 5172 5934 4929 6034 4767 6060 C 4705 6070 4485 6073 4464 6064 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -316.67 129.85)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2625, -4829.11)" d="M 2010 5372 C 2010 5364 2021 5303 2035 5236 C 2078 5023 2175 4750 2272 4570 C 2333 4458 2452 4280 2467 4280 C 2490 4280 2671 4375 2747 4426 C 2859 4503 2976 4607 3058 4705 C 3131 4791 3240 4949 3240 4967 C 3240 4971 3213 4992 3181 5013 C 3122 5051 3024 5140 2978 5197 L 2952 5229 L 2889 5220 C 2647 5185 2321 5239 2080 5354 C 2026 5379 2010 5384 2010 5372 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -85.99 183.36)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4355.05, -4427.75)" d="M 4292 5151 C 4270 5125 4220 5079 4181 5049 L 4110 4996 L 4118 4955 C 4122 4933 4125 4803 4125 4665 C 4125 4331 4093 4131 3989 3816 C 3962 3734 3942 3664 3945 3662 C 3954 3653 4147 3720 4240 3765 C 4390 3838 4522 3932 4652 4058 C 4744 4147 4769 4177 4765 4194 C 4693 4548 4575 4851 4421 5083 C 4381 5141 4346 5192 4341 5194 C 4336 5197 4314 5178 4292 5151 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 -233.78 206.39)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3246.68, -4255.03)" d="M 3768 4874 C 3765 4871 3719 4868 3666 4868 L 3571 4868 L 3510 4768 C 3354 4510 3154 4301 2905 4137 C 2856 4105 2788 4064 2755 4048 L 2696 4018 L 2740 3979 C 2873 3864 3070 3753 3244 3695 C 3341 3663 3545 3622 3556 3633 C 3567 3644 3639 3820 3670 3910 C 3760 4180 3809 4513 3795 4763 C 3788 4870 3784 4890 3768 4874 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 336 0.6)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7520, -5798.45)" d="M 6340 5801 C 6340 3782 6343 2129 6348 2127 C 6352 2125 6877 2156 7515 2196 C 8153 2236 8681 2269 8688 2270 C 8697 2270 8700 2953 8700 5649 C 8700 8859 8699 9029 8683 9034 C 8658 9041 6366 9470 6352 9470 C 6343 9470 6340 8580 6340 5801 z M 6929 8979 C 6978 8949 6998 8922 7010 8865 C 7018 8829 7020 7955 7018 5774 L 7015 2734 L 6990 2697 C 6915 2588 6752 2597 6699 2714 C 6681 2754 6680 2852 6680 5810 L 6680 8866 L 6703 8910 C 6744 8993 6853 9026 6929 8979 z M 7906 8744 C 8258 8655 8292 8643 8334 8587 C 8355 8559 8355 8554 8358 7671 L 8360 6784 L 8337 6740 C 8321 6710 8300 6689 8270 6673 C 8227 6650 8224 6650 7858 6650 C 7569 6650 7482 6653 7457 6664 C 7414 6681 7373 6731 7360 6780 C 7353 6806 7350 7130 7352 7768 L 7355 8716 L 7381 8756 C 7413 8804 7460 8829 7518 8830 C 7541 8830 7716 8791 7906 8744 z M 7619 6280 C 7637 6268 7661 6239 7671 6216 C 7689 6177 7690 6111 7690 4466 L 7690 2756 L 7669 2713 C 7641 2656 7600 2627 7534 2622 C 7470 2617 7410 2646 7377 2700 L 7355 2735 L 7355 4466 L 7355 6196 L 7381 6236 C 7396 6259 7423 6284 7441 6294 C 7489 6318 7576 6311 7619 6280 z M 8270 6295 C 8286 6287 8312 6263 8327 6243 L 8355 6207 L 8355 4465 L 8355 2723 L 8326 2686 C 8249 2585 8101 2601 8041 2717 C 8033 2733 8030 3205 8030 4465 C 8030 6331 8026 6216 8082 6266 C 8094 6278 8114 6292 8125 6298 C 8154 6314 8236 6312 8270 6295 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.13 0 0 -0.13 381.27 -255.61)" >
|
||||
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7859.5, -7720)" d="M 7690 7720 L 7690 6990 L 7860 6990 L 8029 6990 L 8027 7674 C 8026 8050 8022 8361 8018 8365 C 8012 8371 7717 8449 7698 8450 C 7693 8450 7690 8122 7690 7720 z" stroke-linecap="round" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,262 @@
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="494.000000pt" height="555.000000pt" viewBox="0 0 494.000000 555.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)">
|
||||
<path d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23
|
||||
19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44
|
||||
l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8
|
||||
-335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10
|
||||
1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748
|
||||
-30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343
|
||||
-53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47
|
||||
4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4
|
||||
437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151
|
||||
-80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450
|
||||
-238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494
|
||||
243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96
|
||||
-66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83
|
||||
-180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95
|
||||
44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360
|
||||
-187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0
|
||||
-95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107
|
||||
49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64
|
||||
-42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45
|
||||
-62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93
|
||||
198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4
|
||||
6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177
|
||||
-121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11
|
||||
75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353
|
||||
-84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24
|
||||
-45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68
|
||||
523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6
|
||||
56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7
|
||||
-302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0
|
||||
-9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196
|
||||
-15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219
|
||||
-9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2
|
||||
-203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212
|
||||
1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10
|
||||
-42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305
|
||||
-33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0
|
||||
30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338
|
||||
63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3
|
||||
-191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25
|
||||
-34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81
|
||||
-54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360
|
||||
9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0
|
||||
-16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694
|
||||
4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3
|
||||
1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153
|
||||
79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17
|
||||
0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44
|
||||
800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125
|
||||
-181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93
|
||||
c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50
|
||||
8 50 -2z m100 -141 c44 -16 93 -37 108 -45 27 -16 26 -16 -23 -10 -27 3 -79
|
||||
14 -113 25 -76 24 -82 24 -82 5 0 -8 -31 -29 -72 -49 -40 -18 -158 -75 -261
|
||||
-125 -103 -50 -192 -91 -198 -91 -5 0 -9 14 -9 31 0 30 4 32 263 159 144 71
|
||||
272 129 284 129 12 1 58 -12 103 -29z m-530 -70 c0 -11 -73 -50 -95 -50 -25 0
|
||||
-17 19 18 40 34 21 77 27 77 10z m1381 -26 c248 -133 381 -551 260 -811 -108
|
||||
-229 -397 -283 -583 -108 -47 44 -26 65 25 25 14 -11 56 -32 94 -46 56 -21 81
|
||||
-25 143 -22 90 4 141 32 190 103 79 115 101 272 60 429 -19 70 -54 156 -64
|
||||
156 -2 0 -34 -40 -70 -90 -45 -59 -74 -90 -87 -90 -39 0 -19 40 62 125 69 71
|
||||
79 86 70 103 -19 36 -130 130 -185 157 -49 24 -64 27 -123 22 -38 -3 -79 -8
|
||||
-93 -12 -21 -5 -18 0 19 34 53 50 87 61 167 57 44 -3 77 -12 115 -32z m-1581
|
||||
-70 c0 -16 -56 -44 -90 -44 -31 0 -24 18 18 39 45 24 72 26 72 5z m-200 -105
|
||||
c0 -12 -77 -48 -102 -49 -31 0 -8 27 40 48 46 20 62 20 62 1z m228 -21 c-4
|
||||
-39 44 -13 -416 -229 -45 -21 -87 -39 -93 -39 -6 0 -9 12 -7 27 3 24 27 38
|
||||
248 149 135 68 251 123 258 123 9 1 12 -9 10 -31z m1421 -121 c1 -53 -2 -69
|
||||
-15 -74 -32 -12 -38 12 -25 102 6 47 15 93 19 103 9 24 21 -45 21 -131z
|
||||
m-1979 -152 c0 -22 -23 -36 -202 -124 -206 -101 -228 -107 -228 -60 0 19 10
|
||||
25 315 169 55 26 103 46 108 43 4 -2 7 -15 7 -28z m2260 -44 c0 -6 -25 -30
|
||||
-56 -55 -54 -44 -86 -56 -98 -37 -13 20 8 40 72 69 74 34 82 36 82 23z m-934
|
||||
-237 c16 -65 -19 -211 -53 -222 -10 -3 -13 24 -13 112 0 112 1 117 23 126 33
|
||||
13 36 12 43 -16z m855 6 l24 -20 -45 2 c-33 2 -46 7 -48 21 -5 24 39 23 69 -3z
|
||||
m-781 -113 c0 -1 -9 -33 -19 -70 -65 -226 -274 -413 -573 -511 -40 -13 -90
|
||||
-27 -111 -30 -36 -7 -38 -6 -35 16 2 14 12 25 28 29 114 32 184 55 235 81 185
|
||||
92 341 245 425 416 19 39 38 72 43 72 4 0 7 -1 7 -3z m-29 -272 c-62 -139
|
||||
-328 -322 -573 -394 -86 -25 -163 -25 -163 -1 0 9 11 16 25 18 48 6 191 43
|
||||
243 63 164 64 278 148 420 309 34 39 63 66 65 61 2 -6 -6 -31 -17 -56z m777
|
||||
-36 c95 -42 179 -132 221 -234 29 -68 34 -96 39 -185 4 -94 2 -112 -21 -179
|
||||
-14 -40 -38 -91 -54 -114 -61 -88 -209 -167 -315 -167 -54 0 -163 33 -191 58
|
||||
-28 25 -4 37 40 19 140 -56 285 -14 368 107 83 121 107 292 60 427 -58 167
|
||||
-180 263 -332 263 -40 -1 -73 2 -73 6 0 16 28 29 70 32 73 5 121 -3 188 -33z
|
||||
m-2013 -9 c7 -11 -42 -37 -51 -27 -9 9 15 37 32 37 7 0 16 -4 19 -10z m414
|
||||
-21 c40 -24 35 -36 -10 -20 -53 18 -93 13 -136 -18 -167 -121 -105 -387 77
|
||||
-332 36 11 110 79 110 101 0 6 7 10 16 10 33 0 -6 -74 -62 -116 -29 -22 -50
|
||||
-29 -100 -32 -57 -4 -69 -1 -105 22 -128 85 -92 313 61 388 47 24 108 22 149
|
||||
-3z m-409 -69 c0 -16 -38 -32 -46 -19 -7 12 12 29 34 29 6 0 12 -4 12 -10z
|
||||
m485 -31 c8 -23 1 -34 -14 -24 -13 8 -15 45 -2 45 5 0 13 -9 16 -21z m-71 -21
|
||||
c3 -18 7 -59 10 -91 4 -55 3 -58 -21 -68 -31 -12 -54 4 -35 23 18 18 15 95 -4
|
||||
102 -14 5 -13 9 3 36 23 39 41 38 47 -2z m1586 15 c0 -31 -84 -163 -104 -163
|
||||
-15 0 -17 5 -11 28 11 45 86 152 107 152 4 0 8 -7 8 -17z m-1706 -9 c10 -4 16
|
||||
-18 16 -39 0 -19 5 -37 10 -40 17 -11 11 -64 -11 -86 -27 -27 -84 -23 -84 6 0
|
||||
16 7 20 30 20 20 0 31 6 33 18 3 13 -3 17 -22 17 -29 0 -37 27 -11 36 23 9 19
|
||||
37 -5 31 -26 -7 -34 7 -14 27 16 17 33 20 58 10z m-290 -69 c-6 -15 -42 -30
|
||||
-51 -21 -12 12 8 36 31 36 18 0 24 -4 20 -15z m1216 -211 c0 -210 -1 -215 -41
|
||||
-194 -17 10 -19 22 -19 123 0 157 25 297 50 282 6 -4 10 -85 10 -211z m-120
|
||||
150 c9 -10 15 -65 18 -171 l5 -155 -34 7 c-19 3 -60 13 -92 21 -32 8 -61 14
|
||||
-63 14 -2 0 -4 61 -4 135 0 126 1 135 21 145 11 7 22 10 23 8 2 -2 7 -60 12
|
||||
-130 9 -117 16 -149 29 -136 3 2 9 55 14 117 11 137 36 188 71 145z m-1102
|
||||
-46 c-5 -15 -48 -24 -48 -10 0 14 12 22 33 22 10 0 17 -5 15 -12z m750 -121
|
||||
c2 -53 0 -67 -11 -67 -10 0 -16 17 -19 58 -6 63 -1 85 16 79 6 -2 12 -32 14
|
||||
-70z m1342 60 c0 -17 -94 -62 -110 -52 -17 10 1 26 53 47 52 21 57 21 57 5z
|
||||
m-1402 -69 c-2 -35 -7 -63 -13 -63 -5 0 -11 28 -13 63 -2 51 0 62 13 62 13 0
|
||||
15 -11 13 -62z m-443 -13 c53 -9 127 8 167 36 35 26 37 8 2 -20 l-26 -20 41
|
||||
-7 c65 -10 48 -23 -36 -27 -68 -3 -66 -4 14 -3 78 2 97 5 122 24 17 12 33 22
|
||||
36 22 3 0 5 -17 5 -39 0 -38 -1 -39 -42 -45 -45 -7 -243 -48 -340 -70 l-58
|
||||
-14 0 115 0 115 35 -30 c22 -20 50 -33 80 -37z m-245 41 c0 -17 -34 -31 -50
|
||||
-21 -16 10 8 35 31 35 11 0 19 -6 19 -14z m624 -36 c7 -51 3 -70 -15 -70 -5 0
|
||||
-9 27 -9 60 0 73 15 79 24 10z m-626 -58 c5 -17 -27 -27 -41 -13 -9 9 -8 14 3
|
||||
21 18 11 32 8 38 -8z m883 -76 c120 -24 313 -72 333 -84 5 -3 0 -9 -12 -13
|
||||
-14 -5 -57 0 -119 16 -309 76 -353 84 -353 65 0 -5 7 -10 15 -10 13 0 15 -19
|
||||
13 -127 l-3 -128 -26 -3 c-22 -3 -27 2 -33 29 -3 17 -6 59 -7 93 -2 116 -17
|
||||
116 -18 0 -1 -76 -5 -115 -13 -121 -7 -5 -51 -17 -98 -26 -47 -9 -95 -20 -107
|
||||
-23 -21 -6 -23 -3 -23 34 0 23 5 44 10 47 13 8 13 122 0 130 -10 6 -215 -30
|
||||
-256 -45 -21 -8 -24 -16 -24 -62 0 -62 8 -77 35 -75 18 2 21 -6 26 -98 5 -75
|
||||
14 -118 34 -170 35 -88 123 -223 174 -267 l39 -33 -187 0 c-197 -1 -241 -6
|
||||
-241 -30 0 -10 -11 -15 -34 -15 l-34 0 -7 103 c-13 196 -12 261 5 264 8 1 60
|
||||
7 116 13 113 13 107 7 98 102 l-6 58 -38 -6 c-36 -6 -37 -5 -44 26 -3 18 -6
|
||||
83 -6 145 l0 113 28 10 c15 6 104 24 197 41 94 18 213 40 265 50 128 25 155
|
||||
25 301 -3z m-887 5 c3 -5 -1 -14 -10 -21 -11 -10 -18 -10 -27 -1 -9 9 -9 14 3
|
||||
21 19 12 27 12 34 1z m2040 -6 c45 -19 46 -35 2 -35 -35 0 -71 24 -61 41 8 12
|
||||
17 11 59 -6z m-2769 -94 l40 -6 6 -60 c4 -33 7 -225 8 -427 l1 -368 -33 0 -34
|
||||
0 -6 113 c-4 61 -7 207 -7 322 0 116 -3 240 -7 278 -12 132 -23 63 -23 -147 0
|
||||
-121 -4 -217 -9 -221 -5 -3 -21 0 -35 6 l-26 12 -1 209 c-2 233 -1 224 -11
|
||||
234 -5 4 -8 -13 -9 -37 0 -34 -2 -39 -9 -24 -11 25 -13 119 -3 129 7 7 70 1
|
||||
158 -13z m1603 9 c6 0 12 -9 12 -19 0 -17 -4 -18 -40 -9 -22 6 -40 14 -40 18
|
||||
0 14 15 21 35 16 11 -3 26 -6 33 -6z m110 -20 c6 0 12 -10 12 -21 0 -19 -4
|
||||
-21 -32 -15 -18 3 -36 10 -41 15 -15 15 4 33 27 27 11 -3 27 -6 34 -6z m-1562
|
||||
-136 c-4 -76 -10 -143 -15 -151 -7 -14 -21 142 -21 244 0 37 3 43 22 43 21 0
|
||||
21 -1 14 -136z m628 94 c13 -83 15 -221 5 -240 -9 -17 -13 -18 -19 -7 -7 12
|
||||
-14 192 -11 262 2 30 20 19 25 -15z m1057 22 c22 -12 25 -36 7 -42 -7 -3 -28
|
||||
-1 -45 4 -23 6 -33 14 -33 28 0 23 37 28 71 10z m-1117 -32 c9 -35 7 -258 -3
|
||||
-258 -10 0 -21 107 -21 208 0 70 12 95 24 50z m-114 -122 l0 -134 -72 -12
|
||||
c-198 -31 -233 -40 -247 -60 -7 -11 -17 -20 -22 -20 -12 0 -11 247 1 270 15
|
||||
29 211 87 303 89 l37 1 0 -134z m53 120 c9 -22 11 -245 3 -253 -17 -17 -26 30
|
||||
-26 145 0 110 8 148 23 108z m955 -35 c3 -10 -3 -11 -29 -6 -42 9 -51 14 -44
|
||||
24 7 13 68 -3 73 -18z m90 -7 c27 -8 29 -24 3 -24 -26 0 -51 10 -51 21 0 10
|
||||
16 11 48 3z m111 -20 c18 -4 31 -13 31 -21 0 -11 -7 -14 -22 -9 -13 3 -31 6
|
||||
-40 6 -10 0 -18 7 -18 15 0 17 4 18 49 9z m-673 -131 c24 -122 65 -224 135
|
||||
-333 55 -86 85 -118 149 -155 l45 -27 -40 7 c-82 14 -139 59 -216 174 -65 95
|
||||
-122 247 -135 356 -8 63 -2 85 24 85 15 0 21 -18 38 -107z m-108 -3 c28 -200
|
||||
77 -314 187 -427 41 -43 72 -79 70 -81 -9 -9 -71 24 -108 57 -76 68 -136 178
|
||||
-172 314 -27 98 -33 205 -13 225 18 18 23 5 36 -88z m572 90 c24 -15 -2 -31
|
||||
-38 -24 -40 8 -43 34 -4 34 15 0 34 -5 42 -10z m117 -25 c8 -22 1 -26 -35 -19
|
||||
-18 4 -32 13 -32 20 0 20 59 18 67 -1z m167 -25 c78 -25 89 -46 19 -35 -100
|
||||
14 -143 27 -143 41 0 20 46 18 124 -6z m881 -120 c72 -36 165 -132 204 -211
|
||||
112 -229 26 -517 -186 -625 -53 -26 -67 -29 -158 -29 -107 0 -144 12 -223 72
|
||||
-47 36 -26 52 23 19 74 -51 184 -69 270 -45 60 17 153 116 189 204 47 113 48
|
||||
317 3 379 -13 17 -19 15 -112 -48 -98 -65 -115 -74 -115 -57 0 9 77 76 152
|
||||
131 26 19 48 40 48 45 0 20 -57 80 -98 103 l-41 23 -16 -38 c-63 -154 -89
|
||||
-202 -101 -190 -8 8 5 59 42 160 25 67 27 79 14 88 -19 13 -151 5 -180 -11
|
||||
-30 -16 -51 3 -28 26 24 25 74 33 173 31 72 -2 100 -8 140 -27z m-845 -19 c0
|
||||
-13 -38 -19 -250 -36 -107 -8 -244 -20 -304 -25 -112 -10 -136 -5 -136 26 0
|
||||
10 14 14 43 15 23 1 146 7 272 14 296 16 375 17 375 6z m35 -100 c-10 -17
|
||||
-103 -30 -375 -56 -247 -23 -266 -23 -278 -8 -6 9 -9 20 -5 24 11 11 426 47
|
||||
556 48 65 1 106 -3 102 -8z m-1600 -16 c241 -29 255 -32 255 -50 0 -20 -39
|
||||
-19 -199 5 -142 21 -151 23 -151 47 0 11 7 14 23 10 12 -3 45 -8 72 -12z m0
|
||||
-100 c58 -7 175 -23 223 -31 34 -5 46 -34 15 -34 -21 0 -277 30 -310 36 -15 3
|
||||
-23 12 -23 25 0 17 5 20 23 16 12 -3 45 -8 72 -12z m1602 1 c-21 -17 -116 -30
|
||||
-357 -51 -96 -9 -182 -18 -191 -21 -16 -4 -49 19 -49 35 0 4 73 14 163 20 89
|
||||
7 203 16 252 21 50 4 115 8 145 8 49 1 53 0 37 -12z m1 -113 c-3 -16 -22 -19
|
||||
-183 -24 -170 -5 -245 1 -185 15 43 11 191 23 283 25 79 1 88 -1 85 -16z
|
||||
m-1538 -19 c165 -21 180 -24 180 -34 0 -24 -316 -2 -332 22 -16 25 -9 41 15
|
||||
33 12 -3 74 -13 137 -21z m2369 -137 c48 -24 65 -47 34 -47 -37 0 -143 42
|
||||
-143 56 0 21 58 17 109 -9z m-70 -153 c33 -28 39 -44 17 -44 -20 0 -66 39 -66
|
||||
56 0 21 15 17 49 -12z m335 -80 c13 -99 0 -290 -17 -244 -8 22 -16 245 -10
|
||||
270 9 33 20 23 27 -26z m-2795 -383 c19 -12 7 -41 -33 -80 -46 -45 -60 -37
|
||||
-33 19 37 76 39 78 66 61z m461 -26 c12 -14 43 -106 37 -111 -1 -2 -108 -6
|
||||
-236 -10 l-234 -7 39 71 38 72 172 0 c138 0 174 -3 184 -15z m93 -47 c22 -69
|
||||
7 -83 -27 -26 -31 53 -33 78 -8 78 13 0 23 -15 35 -52z m912 6 c15 -25 23 -50
|
||||
19 -54 -11 -10 -633 -19 -639 -10 -3 4 2 31 11 59 l15 51 283 0 284 0 27 -46z
|
||||
m205 36 c0 -20 -50 -90 -65 -90 -22 0 -85 60 -85 81 0 17 8 19 75 19 44 0 75
|
||||
-4 75 -10z m839 -32 c17 -23 31 -48 31 -55 0 -10 -59 -13 -295 -13 -215 0
|
||||
-295 3 -295 11 0 7 12 31 28 55 l27 44 237 0 236 0 31 -42z m341 27 c0 -22
|
||||
-12 -24 -143 -28 -99 -3 -119 -1 -132 13 -8 9 -12 20 -8 23 3 4 69 7 145 7
|
||||
117 0 138 -2 138 -15z"/>
|
||||
<path d="M1713 2370 c-76 -11 -103 -19 -103 -30 0 -14 63 -23 144 -18 82 4 96
|
||||
10 80 36 -13 20 -48 23 -121 12z"/>
|
||||
<path d="M1825 2275 c-5 -2 -44 -6 -85 -10 -85 -7 -115 -19 -90 -35 33 -22
|
||||
228 -7 237 17 9 23 -28 40 -62 28z"/>
|
||||
<path d="M1720 2156 c-46 -8 -65 -15 -65 -26 0 -12 23 -15 139 -18 152 -3 181
|
||||
5 150 39 -14 15 -31 19 -88 18 -39 -1 -100 -6 -136 -13z"/>
|
||||
<path d="M2515 4414 c-178 -26 -270 -62 -301 -119 -16 -31 -16 -35 -2 -58 33
|
||||
-50 79 -62 251 -65 182 -4 271 8 342 46 78 43 97 111 39 148 -49 33 -242 60
|
||||
-329 48z m275 -118 c0 -22 -24 -26 -215 -41 -208 -16 -197 -15 -165 -25 14 -4
|
||||
91 -8 173 -9 213 -1 192 -25 -34 -38 -164 -9 -299 25 -299 76 0 17 10 20 68
|
||||
27 147 16 232 21 350 23 98 1 122 -2 122 -13z"/>
|
||||
<path d="M2140 4363 c-19 -9 -87 -41 -150 -72 l-115 -55 120 -8 c66 -4 126 -6
|
||||
133 -3 6 2 12 16 12 30 0 14 11 48 25 75 28 55 26 56 -25 33z"/>
|
||||
<path d="M1810 4137 c-134 -26 -203 -94 -131 -132 34 -17 42 -10 14 11 -91 67
|
||||
339 137 456 74 38 -20 12 -30 -77 -30 -129 0 -282 -12 -282 -22 0 -4 64 -8
|
||||
143 -8 113 -1 138 -3 122 -12 -11 -7 -49 -17 -85 -23 -75 -12 -82 -29 -13 -33
|
||||
102 -7 261 41 277 84 9 25 -20 63 -62 81 -49 21 -273 27 -362 10z"/>
|
||||
<path d="M1250 3929 c-61 -12 -95 -39 -95 -75 0 -23 5 -30 25 -33 24 -3 25 -3
|
||||
7 17 -18 20 -18 21 5 36 30 19 176 31 264 21 l69 -8 -45 -7 c-25 -4 -89 -11
|
||||
-142 -15 -161 -12 -120 -28 104 -41 96 -6 108 -9 93 -21 -11 -7 -27 -13 -37
|
||||
-13 -10 0 -18 -5 -18 -11 0 -19 119 -1 165 24 80 44 33 103 -100 126 -72 13
|
||||
-230 13 -295 0z"/>
|
||||
<path d="M1013 3912 c-39 -19 -42 -32 -9 -32 34 0 56 10 56 25 0 22 -13 24
|
||||
-47 7z"/>
|
||||
<path d="M997 3696 c-46 -14 -132 -64 -123 -73 2 -3 26 7 52 21 27 14 61 26
|
||||
75 26 22 0 28 -7 39 -42 15 -52 54 -127 45 -88 -3 14 -8 51 -12 83 l-6 59 49
|
||||
-7 c27 -4 52 -9 57 -12 4 -2 4 -43 1 -91 -6 -94 4 -96 26 -5 17 75 28 80 85
|
||||
40 75 -51 75 -54 4 -125 -46 -46 -60 -65 -51 -74 8 -8 31 -1 86 25 l76 36 11
|
||||
-22 c7 -12 16 -37 20 -55 6 -29 4 -34 -18 -43 -13 -5 -46 -9 -73 -9 -52 0 -80
|
||||
-7 -80 -21 0 -9 88 -36 135 -41 36 -4 45 -36 20 -74 -18 -28 -20 -28 -123 39
|
||||
-46 31 -61 46 -57 58 7 21 -20 89 -34 89 -6 0 -8 -19 -4 -49 5 -43 3 -50 -18
|
||||
-65 -67 -46 -166 26 -123 91 18 28 12 42 -10 23 -22 -18 -30 -73 -16 -112 11
|
||||
-30 8 -40 -29 -120 -22 -49 -44 -88 -48 -88 -5 0 -19 7 -32 16 -15 11 -26 13
|
||||
-32 7 -14 -14 72 -68 147 -94 177 -62 380 30 444 201 63 170 -32 381 -213 470
|
||||
-78 38 -190 49 -270 26z m224 -478 c9 -7 38 -39 64 -72 l49 -58 -28 -25 c-44
|
||||
-38 -57 -28 -93 72 -18 50 -33 91 -33 93 0 7 28 0 41 -10z m-90 -118 c6 -40 7
|
||||
-76 2 -81 -8 -8 -73 2 -76 12 -5 14 49 157 56 150 5 -5 13 -41 18 -81z"/>
|
||||
<path d="M892 3538 c6 -18 57 -53 65 -45 9 9 -37 57 -55 57 -7 0 -12 -5 -10
|
||||
-12z"/>
|
||||
<path d="M840 3361 c0 -20 34 -31 96 -31 50 0 41 14 -19 33 -68 21 -77 21 -77
|
||||
-2z"/>
|
||||
<path d="M929 3218 c-65 -44 -72 -55 -45 -73 11 -7 20 -2 38 20 12 17 35 43
|
||||
51 59 15 16 26 30 24 33 -2 2 -33 -16 -68 -39z"/>
|
||||
<path d="M1200 1030 c-42 -10 -75 -47 -89 -98 -14 -47 -14 -385 -1 -433 23
|
||||
-81 106 -119 194 -88 59 21 80 56 84 145 l4 74 -46 0 -46 0 0 -57 c0 -71 -9
|
||||
-86 -50 -86 -17 0 -36 6 -41 14 -14 22 -11 423 3 437 16 16 63 15 76 -1 6 -7
|
||||
12 -35 14 -62 l3 -50 40 0 40 0 3 49 c4 57 -19 118 -52 140 -29 18 -93 26
|
||||
-136 16z"/>
|
||||
<path d="M1706 1030 c-41 -13 -74 -48 -86 -89 -5 -20 -10 -124 -10 -231 0
|
||||
-263 14 -295 133 -306 102 -10 157 48 157 163 l0 63 -45 0 -45 0 0 -60 c0 -51
|
||||
-3 -62 -23 -74 -29 -20 -66 -10 -78 21 -14 38 -11 373 4 403 14 27 61 40 80
|
||||
21 7 -7 14 -35 17 -64 l5 -52 43 -3 42 -3 0 53 c0 60 -23 113 -60 140 -31 21
|
||||
-95 30 -134 18z"/>
|
||||
<path d="M3510 1030 c-43 -10 -76 -47 -90 -102 -7 -25 -10 -113 -8 -232 2
|
||||
-160 6 -197 21 -228 43 -86 201 -90 253 -5 17 29 19 52 19 257 0 219 -1 226
|
||||
-23 258 -13 17 -31 36 -40 41 -28 14 -95 20 -132 11z m88 -92 c13 -13 17 -415
|
||||
4 -434 -12 -18 -41 -24 -67 -14 l-25 10 0 213 c0 152 3 216 12 225 15 15 61
|
||||
15 76 0z"/>
|
||||
<path d="M757 1023 c-4 -3 -7 -143 -7 -310 l0 -303 50 0 50 0 0 114 0 113 48
|
||||
5 c111 11 142 53 142 196 0 156 -35 192 -186 192 -50 0 -94 -3 -97 -7z m173
|
||||
-93 c16 -16 20 -33 20 -91 0 -92 -10 -109 -60 -109 l-40 0 0 104 c0 91 2 105
|
||||
18 109 33 9 42 7 62 -13z"/>
|
||||
<path d="M1987 1023 c-4 -3 -7 -143 -7 -310 l0 -303 45 0 44 0 3 123 3 122 36
|
||||
3 c54 5 63 -14 69 -137 l5 -106 45 -3 45 -3 -5 125 c-6 120 -7 127 -34 154
|
||||
-23 25 -25 30 -11 36 26 9 45 70 45 141 0 132 -38 165 -187 165 -49 0 -93 -3
|
||||
-96 -7z m181 -101 c6 -9 12 -43 12 -77 0 -66 -11 -85 -58 -100 -42 -12 -52 9
|
||||
-52 105 0 76 2 89 18 92 29 6 66 -3 80 -20z"/>
|
||||
<path d="M2360 720 l0 -310 130 0 130 0 0 40 0 40 -85 0 -85 0 0 95 0 94 68 3
|
||||
67 3 3 34 c4 38 -11 53 -45 44 -13 -3 -39 -2 -58 1 l-35 7 0 84 c0 81 1 85 23
|
||||
86 12 0 49 1 82 2 l60 2 3 43 3 42 -130 0 -131 0 0 -310z"/>
|
||||
<path d="M2777 1017 c-3 -8 -12 -59 -21 -113 -19 -120 -64 -404 -72 -456 l-6
|
||||
-38 40 0 40 0 9 53 8 52 65 0 65 0 8 -52 9 -53 44 0 c52 0 52 0 29 125 -8 44
|
||||
-24 139 -35 210 -11 72 -26 164 -33 205 l-13 75 -66 3 c-49 2 -67 -1 -71 -11z
|
||||
m113 -399 c0 -15 -9 -18 -44 -18 -25 0 -47 3 -49 8 -6 10 30 270 40 285 6 10
|
||||
51 -226 53 -275z"/>
|
||||
<path d="M3062 988 l3 -43 45 -1 45 -1 3 -266 2 -267 45 0 45 0 0 264 c0 225
|
||||
2 265 15 270 8 3 22 3 30 0 8 -4 26 -3 40 0 21 5 25 12 25 46 l0 40 -151 0
|
||||
-150 0 3 -42z"/>
|
||||
<path d="M3790 720 l0 -310 45 0 44 0 3 123 3 122 40 0 c54 0 65 -24 65 -147
|
||||
l0 -98 48 0 47 0 -3 83 c-4 126 -11 165 -36 194 l-22 26 22 24 c27 29 39 94
|
||||
31 162 -13 107 -48 131 -192 131 l-95 0 0 -310z m188 203 c17 -24 15 -124 -3
|
||||
-150 -19 -27 -74 -41 -86 -22 -10 16 -12 182 -3 192 12 12 79 -3 92 -20z"/>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,225 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
width="494.000000pt" height="555.000000pt" viewBox="0 0 494.000000 555.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)" fill="white">
|
||||
<path d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23
|
||||
19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44
|
||||
l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8
|
||||
-335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10
|
||||
1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748
|
||||
-30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343
|
||||
-53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47
|
||||
4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4
|
||||
437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151
|
||||
-80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450
|
||||
-238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494
|
||||
243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96
|
||||
-66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83
|
||||
-180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95
|
||||
44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360
|
||||
-187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0
|
||||
-95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107
|
||||
49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64
|
||||
-42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45
|
||||
-62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93
|
||||
198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4
|
||||
6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177
|
||||
-121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11
|
||||
75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353
|
||||
-84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24
|
||||
-45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68
|
||||
523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6
|
||||
56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7
|
||||
-302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0
|
||||
-9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196
|
||||
-15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219
|
||||
-9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2
|
||||
-203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212
|
||||
1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10
|
||||
-42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305
|
||||
-33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0
|
||||
30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338
|
||||
63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3
|
||||
-191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25
|
||||
-34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81
|
||||
-54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360
|
||||
9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0
|
||||
-16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694
|
||||
4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3
|
||||
1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153
|
||||
79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17
|
||||
0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44
|
||||
800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125
|
||||
-181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93
|
||||
c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50
|
||||
8 50 -2z m100 -141 c44 -16 93 -37 108 -45 27 -16 26 -16 -23 -10 -27 3 -79
|
||||
14 -113 25 -76 24 -82 24 -82 5 0 -8 -31 -29 -72 -49 -40 -18 -158 -75 -261
|
||||
-125 -103 -50 -192 -91 -198 -91 -5 0 -9 14 -9 31 0 30 4 32 263 159 144 71
|
||||
272 129 284 129 12 1 58 -12 103 -29z m-530 -70 c0 -11 -73 -50 -95 -50 -25 0
|
||||
-17 19 18 40 34 21 77 27 77 10z m1381 -26 c248 -133 381 -551 260 -811 -108
|
||||
-229 -397 -283 -583 -108 -47 44 -26 65 25 25 14 -11 56 -32 94 -46 56 -21 81
|
||||
-25 143 -22 90 4 141 32 190 103 79 115 101 272 60 429 -19 70 -54 156 -64
|
||||
156 -2 0 -34 -40 -70 -90 -45 -59 -74 -90 -87 -90 -39 0 -19 40 62 125 69 71
|
||||
79 86 70 103 -19 36 -130 130 -185 157 -49 24 -64 27 -123 22 -38 -3 -79 -8
|
||||
-93 -12 -21 -5 -18 0 19 34 53 50 87 61 167 57 44 -3 77 -12 115 -32z m-1581
|
||||
-70 c0 -16 -56 -44 -90 -44 -31 0 -24 18 18 39 45 24 72 26 72 5z m-200 -105
|
||||
c0 -12 -77 -48 -102 -49 -31 0 -8 27 40 48 46 20 62 20 62 1z m228 -21 c-4
|
||||
-39 44 -13 -416 -229 -45 -21 -87 -39 -93 -39 -6 0 -9 12 -7 27 3 24 27 38
|
||||
248 149 135 68 251 123 258 123 9 1 12 -9 10 -31z m1421 -121 c1 -53 -2 -69
|
||||
-15 -74 -32 -12 -38 12 -25 102 6 47 15 93 19 103 9 24 21 -45 21 -131z
|
||||
m-1979 -152 c0 -22 -23 -36 -202 -124 -206 -101 -228 -107 -228 -60 0 19 10
|
||||
25 315 169 55 26 103 46 108 43 4 -2 7 -15 7 -28z m2260 -44 c0 -6 -25 -30
|
||||
-56 -55 -54 -44 -86 -56 -98 -37 -13 20 8 40 72 69 74 34 82 36 82 23z m-934
|
||||
-237 c16 -65 -19 -211 -53 -222 -10 -3 -13 24 -13 112 0 112 1 117 23 126 33
|
||||
13 36 12 43 -16z m855 6 l24 -20 -45 2 c-33 2 -46 7 -48 21 -5 24 39 23 69 -3z
|
||||
m-781 -113 c0 -1 -9 -33 -19 -70 -65 -226 -274 -413 -573 -511 -40 -13 -90
|
||||
-27 -111 -30 -36 -7 -38 -6 -35 16 2 14 12 25 28 29 114 32 184 55 235 81 185
|
||||
92 341 245 425 416 19 39 38 72 43 72 4 0 7 -1 7 -3z m-29 -272 c-62 -139
|
||||
-328 -322 -573 -394 -86 -25 -163 -25 -163 -1 0 9 11 16 25 18 48 6 191 43
|
||||
243 63 164 64 278 148 420 309 34 39 63 66 65 61 2 -6 -6 -31 -17 -56z m777
|
||||
-36 c95 -42 179 -132 221 -234 29 -68 34 -96 39 -185 4 -94 2 -112 -21 -179
|
||||
-14 -40 -38 -91 -54 -114 -61 -88 -209 -167 -315 -167 -54 0 -163 33 -191 58
|
||||
-28 25 -4 37 40 19 140 -56 285 -14 368 107 83 121 107 292 60 427 -58 167
|
||||
-180 263 -332 263 -40 -1 -73 2 -73 6 0 16 28 29 70 32 73 5 121 -3 188 -33z
|
||||
m-2013 -9 c7 -11 -42 -37 -51 -27 -9 9 15 37 32 37 7 0 16 -4 19 -10z m414
|
||||
-21 c40 -24 35 -36 -10 -20 -53 18 -93 13 -136 -18 -167 -121 -105 -387 77
|
||||
-332 36 11 110 79 110 101 0 6 7 10 16 10 33 0 -6 -74 -62 -116 -29 -22 -50
|
||||
-29 -100 -32 -57 -4 -69 -1 -105 22 -128 85 -92 313 61 388 47 24 108 22 149
|
||||
-3z m-409 -69 c0 -16 -38 -32 -46 -19 -7 12 12 29 34 29 6 0 12 -4 12 -10z
|
||||
m485 -31 c8 -23 1 -34 -14 -24 -13 8 -15 45 -2 45 5 0 13 -9 16 -21z m-71 -21
|
||||
c3 -18 7 -59 10 -91 4 -55 3 -58 -21 -68 -31 -12 -54 4 -35 23 18 18 15 95 -4
|
||||
102 -14 5 -13 9 3 36 23 39 41 38 47 -2z m1586 15 c0 -31 -84 -163 -104 -163
|
||||
-15 0 -17 5 -11 28 11 45 86 152 107 152 4 0 8 -7 8 -17z m-1706 -9 c10 -4 16
|
||||
-18 16 -39 0 -19 5 -37 10 -40 17 -11 11 -64 -11 -86 -27 -27 -84 -23 -84 6 0
|
||||
16 7 20 30 20 20 0 31 6 33 18 3 13 -3 17 -22 17 -29 0 -37 27 -11 36 23 9 19
|
||||
37 -5 31 -26 -7 -34 7 -14 27 16 17 33 20 58 10z m-290 -69 c-6 -15 -42 -30
|
||||
-51 -21 -12 12 8 36 31 36 18 0 24 -4 20 -15z m1216 -211 c0 -210 -1 -215 -41
|
||||
-194 -17 10 -19 22 -19 123 0 157 25 297 50 282 6 -4 10 -85 10 -211z m-120
|
||||
150 c9 -10 15 -65 18 -171 l5 -155 -34 7 c-19 3 -60 13 -92 21 -32 8 -61 14
|
||||
-63 14 -2 0 -4 61 -4 135 0 126 1 135 21 145 11 7 22 10 23 8 2 -2 7 -60 12
|
||||
-130 9 -117 16 -149 29 -136 3 2 9 55 14 117 11 137 36 188 71 145z m-1102
|
||||
-46 c-5 -15 -48 -24 -48 -10 0 14 12 22 33 22 10 0 17 -5 15 -12z m750 -121
|
||||
c2 -53 0 -67 -11 -67 -10 0 -16 17 -19 58 -6 63 -1 85 16 79 6 -2 12 -32 14
|
||||
-70z m1342 60 c0 -17 -94 -62 -110 -52 -17 10 1 26 53 47 52 21 57 21 57 5z
|
||||
m-1402 -69 c-2 -35 -7 -63 -13 -63 -5 0 -11 28 -13 63 -2 51 0 62 13 62 13 0
|
||||
15 -11 13 -62z m-443 -13 c53 -9 127 8 167 36 35 26 37 8 2 -20 l-26 -20 41
|
||||
-7 c65 -10 48 -23 -36 -27 -68 -3 -66 -4 14 -3 78 2 97 5 122 24 17 12 33 22
|
||||
36 22 3 0 5 -17 5 -39 0 -38 -1 -39 -42 -45 -45 -7 -243 -48 -340 -70 l-58
|
||||
-14 0 115 0 115 35 -30 c22 -20 50 -33 80 -37z m-245 41 c0 -17 -34 -31 -50
|
||||
-21 -16 10 8 35 31 35 11 0 19 -6 19 -14z m624 -36 c7 -51 3 -70 -15 -70 -5 0
|
||||
-9 27 -9 60 0 73 15 79 24 10z m-626 -58 c5 -17 -27 -27 -41 -13 -9 9 -8 14 3
|
||||
21 18 11 32 8 38 -8z m883 -76 c120 -24 313 -72 333 -84 5 -3 0 -9 -12 -13
|
||||
-14 -5 -57 0 -119 16 -309 76 -353 84 -353 65 0 -5 7 -10 15 -10 13 0 15 -19
|
||||
13 -127 l-3 -128 -26 -3 c-22 -3 -27 2 -33 29 -3 17 -6 59 -7 93 -2 116 -17
|
||||
116 -18 0 -1 -76 -5 -115 -13 -121 -7 -5 -51 -17 -98 -26 -47 -9 -95 -20 -107
|
||||
-23 -21 -6 -23 -3 -23 34 0 23 5 44 10 47 13 8 13 122 0 130 -10 6 -215 -30
|
||||
-256 -45 -21 -8 -24 -16 -24 -62 0 -62 8 -77 35 -75 18 2 21 -6 26 -98 5 -75
|
||||
14 -118 34 -170 35 -88 123 -223 174 -267 l39 -33 -187 0 c-197 -1 -241 -6
|
||||
-241 -30 0 -10 -11 -15 -34 -15 l-34 0 -7 103 c-13 196 -12 261 5 264 8 1 60
|
||||
7 116 13 113 13 107 7 98 102 l-6 58 -38 -6 c-36 -6 -37 -5 -44 26 -3 18 -6
|
||||
83 -6 145 l0 113 28 10 c15 6 104 24 197 41 94 18 213 40 265 50 128 25 155
|
||||
25 301 -3z m-887 5 c3 -5 -1 -14 -10 -21 -11 -10 -18 -10 -27 -1 -9 9 -9 14 3
|
||||
21 19 12 27 12 34 1z m2040 -6 c45 -19 46 -35 2 -35 -35 0 -71 24 -61 41 8 12
|
||||
17 11 59 -6z m-2769 -94 l40 -6 6 -60 c4 -33 7 -225 8 -427 l1 -368 -33 0 -34
|
||||
0 -6 113 c-4 61 -7 207 -7 322 0 116 -3 240 -7 278 -12 132 -23 63 -23 -147 0
|
||||
-121 -4 -217 -9 -221 -5 -3 -21 0 -35 6 l-26 12 -1 209 c-2 233 -1 224 -11
|
||||
234 -5 4 -8 -13 -9 -37 0 -34 -2 -39 -9 -24 -11 25 -13 119 -3 129 7 7 70 1
|
||||
158 -13z m1603 9 c6 0 12 -9 12 -19 0 -17 -4 -18 -40 -9 -22 6 -40 14 -40 18
|
||||
0 14 15 21 35 16 11 -3 26 -6 33 -6z m110 -20 c6 0 12 -10 12 -21 0 -19 -4
|
||||
-21 -32 -15 -18 3 -36 10 -41 15 -15 15 4 33 27 27 11 -3 27 -6 34 -6z m-1562
|
||||
-136 c-4 -76 -10 -143 -15 -151 -7 -14 -21 142 -21 244 0 37 3 43 22 43 21 0
|
||||
21 -1 14 -136z m628 94 c13 -83 15 -221 5 -240 -9 -17 -13 -18 -19 -7 -7 12
|
||||
-14 192 -11 262 2 30 20 19 25 -15z m1057 22 c22 -12 25 -36 7 -42 -7 -3 -28
|
||||
-1 -45 4 -23 6 -33 14 -33 28 0 23 37 28 71 10z m-1117 -32 c9 -35 7 -258 -3
|
||||
-258 -10 0 -21 107 -21 208 0 70 12 95 24 50z m-114 -122 l0 -134 -72 -12
|
||||
c-198 -31 -233 -40 -247 -60 -7 -11 -17 -20 -22 -20 -12 0 -11 247 1 270 15
|
||||
29 211 87 303 89 l37 1 0 -134z m53 120 c9 -22 11 -245 3 -253 -17 -17 -26 30
|
||||
-26 145 0 110 8 148 23 108z m955 -35 c3 -10 -3 -11 -29 -6 -42 9 -51 14 -44
|
||||
24 7 13 68 -3 73 -18z m90 -7 c27 -8 29 -24 3 -24 -26 0 -51 10 -51 21 0 10
|
||||
16 11 48 3z m111 -20 c18 -4 31 -13 31 -21 0 -11 -7 -14 -22 -9 -13 3 -31 6
|
||||
-40 6 -10 0 -18 7 -18 15 0 17 4 18 49 9z m-673 -131 c24 -122 65 -224 135
|
||||
-333 55 -86 85 -118 149 -155 l45 -27 -40 7 c-82 14 -139 59 -216 174 -65 95
|
||||
-122 247 -135 356 -8 63 -2 85 24 85 15 0 21 -18 38 -107z m-108 -3 c28 -200
|
||||
77 -314 187 -427 41 -43 72 -79 70 -81 -9 -9 -71 24 -108 57 -76 68 -136 178
|
||||
-172 314 -27 98 -33 205 -13 225 18 18 23 5 36 -88z m572 90 c24 -15 -2 -31
|
||||
-38 -24 -40 8 -43 34 -4 34 15 0 34 -5 42 -10z m117 -25 c8 -22 1 -26 -35 -19
|
||||
-18 4 -32 13 -32 20 0 20 59 18 67 -1z m167 -25 c78 -25 89 -46 19 -35 -100
|
||||
14 -143 27 -143 41 0 20 46 18 124 -6z m881 -120 c72 -36 165 -132 204 -211
|
||||
112 -229 26 -517 -186 -625 -53 -26 -67 -29 -158 -29 -107 0 -144 12 -223 72
|
||||
-47 36 -26 52 23 19 74 -51 184 -69 270 -45 60 17 153 116 189 204 47 113 48
|
||||
317 3 379 -13 17 -19 15 -112 -48 -98 -65 -115 -74 -115 -57 0 9 77 76 152
|
||||
131 26 19 48 40 48 45 0 20 -57 80 -98 103 l-41 23 -16 -38 c-63 -154 -89
|
||||
-202 -101 -190 -8 8 5 59 42 160 25 67 27 79 14 88 -19 13 -151 5 -180 -11
|
||||
-30 -16 -51 3 -28 26 24 25 74 33 173 31 72 -2 100 -8 140 -27z m-845 -19 c0
|
||||
-13 -38 -19 -250 -36 -107 -8 -244 -20 -304 -25 -112 -10 -136 -5 -136 26 0
|
||||
10 14 14 43 15 23 1 146 7 272 14 296 16 375 17 375 6z m35 -100 c-10 -17
|
||||
-103 -30 -375 -56 -247 -23 -266 -23 -278 -8 -6 9 -9 20 -5 24 11 11 426 47
|
||||
556 48 65 1 106 -3 102 -8z m-1600 -16 c241 -29 255 -32 255 -50 0 -20 -39
|
||||
-19 -199 5 -142 21 -151 23 -151 47 0 11 7 14 23 10 12 -3 45 -8 72 -12z m0
|
||||
-100 c58 -7 175 -23 223 -31 34 -5 46 -34 15 -34 -21 0 -277 30 -310 36 -15 3
|
||||
-23 12 -23 25 0 17 5 20 23 16 12 -3 45 -8 72 -12z m1602 1 c-21 -17 -116 -30
|
||||
-357 -51 -96 -9 -182 -18 -191 -21 -16 -4 -49 19 -49 35 0 4 73 14 163 20 89
|
||||
7 203 16 252 21 50 4 115 8 145 8 49 1 53 0 37 -12z m1 -113 c-3 -16 -22 -19
|
||||
-183 -24 -170 -5 -245 1 -185 15 43 11 191 23 283 25 79 1 88 -1 85 -16z
|
||||
m-1538 -19 c165 -21 180 -24 180 -34 0 -24 -316 -2 -332 22 -16 25 -9 41 15
|
||||
33 12 -3 74 -13 137 -21z m2369 -137 c48 -24 65 -47 34 -47 -37 0 -143 42
|
||||
-143 56 0 21 58 17 109 -9z m-70 -153 c33 -28 39 -44 17 -44 -20 0 -66 39 -66
|
||||
56 0 21 15 17 49 -12z m335 -80 c13 -99 0 -290 -17 -244 -8 22 -16 245 -10
|
||||
270 9 33 20 23 27 -26z m-2795 -383 c19 -12 7 -41 -33 -80 -46 -45 -60 -37
|
||||
-33 19 37 76 39 78 66 61z m461 -26 c12 -14 43 -106 37 -111 -1 -2 -108 -6
|
||||
-236 -10 l-234 -7 39 71 38 72 172 0 c138 0 174 -3 184 -15z m93 -47 c22 -69
|
||||
7 -83 -27 -26 -31 53 -33 78 -8 78 13 0 23 -15 35 -52z m912 6 c15 -25 23 -50
|
||||
19 -54 -11 -10 -633 -19 -639 -10 -3 4 2 31 11 59 l15 51 283 0 284 0 27 -46z
|
||||
m205 36 c0 -20 -50 -90 -65 -90 -22 0 -85 60 -85 81 0 17 8 19 75 19 44 0 75
|
||||
-4 75 -10z m839 -32 c17 -23 31 -48 31 -55 0 -10 -59 -13 -295 -13 -215 0
|
||||
-295 3 -295 11 0 7 12 31 28 55 l27 44 237 0 236 0 31 -42z m341 27 c0 -22
|
||||
-12 -24 -143 -28 -99 -3 -119 -1 -132 13 -8 9 -12 20 -8 23 3 4 69 7 145 7
|
||||
117 0 138 -2 138 -15z"/>
|
||||
<path d="M1713 2370 c-76 -11 -103 -19 -103 -30 0 -14 63 -23 144 -18 82 4 96
|
||||
10 80 36 -13 20 -48 23 -121 12z"/>
|
||||
<path d="M1825 2275 c-5 -2 -44 -6 -85 -10 -85 -7 -115 -19 -90 -35 33 -22
|
||||
228 -7 237 17 9 23 -28 40 -62 28z"/>
|
||||
<path d="M1720 2156 c-46 -8 -65 -15 -65 -26 0 -12 23 -15 139 -18 152 -3 181
|
||||
5 150 39 -14 15 -31 19 -88 18 -39 -1 -100 -6 -136 -13z"/>
|
||||
<path d="M2515 4414 c-178 -26 -270 -62 -301 -119 -16 -31 -16 -35 -2 -58 33
|
||||
-50 79 -62 251 -65 182 -4 271 8 342 46 78 43 97 111 39 148 -49 33 -242 60
|
||||
-329 48z m275 -118 c0 -22 -24 -26 -215 -41 -208 -16 -197 -15 -165 -25 14 -4
|
||||
91 -8 173 -9 213 -1 192 -25 -34 -38 -164 -9 -299 25 -299 76 0 17 10 20 68
|
||||
27 147 16 232 21 350 23 98 1 122 -2 122 -13z"/>
|
||||
<path d="M2140 4363 c-19 -9 -87 -41 -150 -72 l-115 -55 120 -8 c66 -4 126 -6
|
||||
133 -3 6 2 12 16 12 30 0 14 11 48 25 75 28 55 26 56 -25 33z"/>
|
||||
<path d="M1810 4137 c-134 -26 -203 -94 -131 -132 34 -17 42 -10 14 11 -91 67
|
||||
339 137 456 74 38 -20 12 -30 -77 -30 -129 0 -282 -12 -282 -22 0 -4 64 -8
|
||||
143 -8 113 -1 138 -3 122 -12 -11 -7 -49 -17 -85 -23 -75 -12 -82 -29 -13 -33
|
||||
102 -7 261 41 277 84 9 25 -20 63 -62 81 -49 21 -273 27 -362 10z"/>
|
||||
<path d="M1250 3929 c-61 -12 -95 -39 -95 -75 0 -23 5 -30 25 -33 24 -3 25 -3
|
||||
7 17 -18 20 -18 21 5 36 30 19 176 31 264 21 l69 -8 -45 -7 c-25 -4 -89 -11
|
||||
-142 -15 -161 -12 -120 -28 104 -41 96 -6 108 -9 93 -21 -11 -7 -27 -13 -37
|
||||
-13 -10 0 -18 -5 -18 -11 0 -19 119 -1 165 24 80 44 33 103 -100 126 -72 13
|
||||
-230 13 -295 0z"/>
|
||||
<path d="M1013 3912 c-39 -19 -42 -32 -9 -32 34 0 56 10 56 25 0 22 -13 24
|
||||
-47 7z"/>
|
||||
<path d="M997 3696 c-46 -14 -132 -64 -123 -73 2 -3 26 7 52 21 27 14 61 26
|
||||
75 26 22 0 28 -7 39 -42 15 -52 54 -127 45 -88 -3 14 -8 51 -12 83 l-6 59 49
|
||||
-7 c27 -4 52 -9 57 -12 4 -2 4 -43 1 -91 -6 -94 4 -96 26 -5 17 75 28 80 85
|
||||
40 75 -51 75 -54 4 -125 -46 -46 -60 -65 -51 -74 8 -8 31 -1 86 25 l76 36 11
|
||||
-22 c7 -12 16 -37 20 -55 6 -29 4 -34 -18 -43 -13 -5 -46 -9 -73 -9 -52 0 -80
|
||||
-7 -80 -21 0 -9 88 -36 135 -41 36 -4 45 -36 20 -74 -18 -28 -20 -28 -123 39
|
||||
-46 31 -61 46 -57 58 7 21 -20 89 -34 89 -6 0 -8 -19 -4 -49 5 -43 3 -50 -18
|
||||
-65 -67 -46 -166 26 -123 91 18 28 12 42 -10 23 -22 -18 -30 -73 -16 -112 11
|
||||
-30 8 -40 -29 -120 -22 -49 -44 -88 -48 -88 -5 0 -19 7 -32 16 -15 11 -26 13
|
||||
-32 7 -14 -14 72 -68 147 -94 177 -62 380 30 444 201 63 170 -32 381 -213 470
|
||||
-78 38 -190 49 -270 26z m224 -478 c9 -7 38 -39 64 -72 l49 -58 -28 -25 c-44
|
||||
-38 -57 -28 -93 72 -18 50 -33 91 -33 93 0 7 28 0 41 -10z m-90 -118 c6 -40 7
|
||||
-76 2 -81 -8 -8 -73 2 -76 12 -5 14 49 157 56 150 5 -5 13 -41 18 -81z"/>
|
||||
<path d="M892 3538 c6 -18 57 -53 65 -45 9 9 -37 57 -55 57 -7 0 -12 -5 -10
|
||||
-12z"/>
|
||||
<path d="M840 3361 c0 -20 34 -31 96 -31 50 0 41 14 -19 33 -68 21 -77 21 -77
|
||||
-2z"/>
|
||||
<path d="M929 3218 c-65 -44 -72 -55 -45 -73 11 -7 20 -2 38 20 12 17 35 43
|
||||
51 59 15 16 26 30 24 33 -2 2 -33 -16 -68 -39z"/>
|
||||
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="462px" height="512px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g><path style="opacity:0.984" fill="#000000" d="M 170.5,-0.5 C 210.5,-0.5 250.5,-0.5 290.5,-0.5C 314.491,5.66058 328.657,20.9939 333,45.5C 333.5,64.1637 333.667,82.8304 333.5,101.5C 368.835,101.333 404.168,101.5 439.5,102C 452.678,105.007 460.012,113.174 461.5,126.5C 461.5,127.5 461.5,128.5 461.5,129.5C 458.719,144.937 449.385,152.937 433.5,153.5C 425.386,253.203 416.886,352.87 408,452.5C 398.365,485.308 376.865,504.974 343.5,511.5C 268.167,511.5 192.833,511.5 117.5,511.5C 84.1349,504.974 62.6349,485.308 53,452.5C 44.1142,352.87 35.6142,253.203 27.5,153.5C 11.6146,152.937 2.28123,144.937 -0.5,129.5C -0.5,128.167 -0.5,126.833 -0.5,125.5C 1.4512,112.713 8.78453,104.88 21.5,102C 56.8318,101.5 92.1651,101.333 127.5,101.5C 127.333,82.8304 127.5,64.1637 128,45.5C 132.343,20.9939 146.509,5.66058 170.5,-0.5 Z M 179.5,51.5 C 213.5,51.5 247.5,51.5 281.5,51.5C 281.5,68.1667 281.5,84.8333 281.5,101.5C 247.5,101.5 213.5,101.5 179.5,101.5C 179.5,84.8333 179.5,68.1667 179.5,51.5 Z M 79.5,153.5 C 180.167,153.5 280.833,153.5 381.5,153.5C 373.502,247.142 365.669,340.808 358,434.5C 357.095,447.076 350.595,455.243 338.5,459C 266.5,459.667 194.5,459.667 122.5,459C 110.405,455.243 103.905,447.076 103,434.5C 95.3313,340.808 87.4979,247.142 79.5,153.5 Z"/></g>
|
||||
<g><path style="opacity:0.981" fill="#000000" d="M 178.5,203.5 C 190.763,204.276 199.263,210.276 204,221.5C 205.146,249.795 205.646,278.128 205.5,306.5C 205.646,334.872 205.146,363.205 204,391.5C 199.733,402.725 191.566,408.725 179.5,409.5C 166.457,408.624 157.957,401.957 154,389.5C 153.333,334.5 153.333,279.5 154,224.5C 157.476,211.846 165.643,204.846 178.5,203.5 Z"/></g>
|
||||
<g><path style="opacity:0.981" fill="#000000" d="M 280.5,203.5 C 292.434,204.048 300.934,209.715 306,220.5C 307.151,249.287 307.651,278.12 307.5,307C 307.333,334.5 307.167,362 307,389.5C 303.043,401.957 294.543,408.624 281.5,409.5C 269.209,409.034 261.042,403.034 257,391.5C 255.854,363.205 255.354,334.872 255.5,306.5C 255.354,278.128 255.854,249.795 257,221.5C 261.488,211.018 269.322,205.018 280.5,203.5 Z"/></g>
|
||||
</svg>
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 122.88 122.88" style="enable-background:new 0 0 122.88 122.88" xml:space="preserve"><g><path d="M61.44,0c8.32,0,16.25,1.66,23.5,4.66l0.11,0.05c7.47,3.11,14.2,7.66,19.83,13.3l0,0c5.66,5.65,10.22,12.42,13.34,19.95 c3.01,7.24,4.66,15.18,4.66,23.49c0,8.32-1.66,16.25-4.66,23.5l-0.05,0.11c-3.12,7.47-7.66,14.2-13.3,19.83l0,0 c-5.65,5.66-12.42,10.22-19.95,13.34c-7.24,3.01-15.18,4.66-23.49,4.66c-8.31,0-16.25-1.66-23.5-4.66l-0.11-0.05 c-7.47-3.11-14.2-7.66-19.83-13.29L18,104.87C12.34,99.21,7.78,92.45,4.66,84.94C1.66,77.69,0,69.76,0,61.44s1.66-16.25,4.66-23.5 l0.05-0.11c3.11-7.47,7.66-14.2,13.29-19.83L18.01,18c5.66-5.66,12.42-10.22,19.94-13.34C45.19,1.66,53.12,0,61.44,0L61.44,0z M16.99,94.47l0.24-0.14c5.9-3.29,21.26-4.38,27.64-8.83c0.47-0.7,0.97-1.72,1.46-2.83c0.73-1.67,1.4-3.5,1.82-4.74 c-1.78-2.1-3.31-4.47-4.77-6.8l-4.83-7.69c-1.76-2.64-2.68-5.04-2.74-7.02c-0.03-0.93,0.13-1.77,0.48-2.52 c0.36-0.78,0.91-1.43,1.66-1.93c0.35-0.24,0.74-0.44,1.17-0.59c-0.32-4.17-0.43-9.42-0.23-13.82c0.1-1.04,0.31-2.09,0.59-3.13 c1.24-4.41,4.33-7.96,8.16-10.4c2.11-1.35,4.43-2.36,6.84-3.04c1.54-0.44-1.31-5.34,0.28-5.51c7.67-0.79,20.08,6.22,25.44,12.01 c2.68,2.9,4.37,6.75,4.73,11.84l-0.3,12.54l0,0c1.34,0.41,2.2,1.26,2.54,2.63c0.39,1.53-0.03,3.67-1.33,6.6l0,0 c-0.02,0.05-0.05,0.11-0.08,0.16l-5.51,9.07c-2.02,3.33-4.08,6.68-6.75,9.31C73.75,80,74,80.35,74.24,80.7 c1.09,1.6,2.19,3.2,3.6,4.63c0.05,0.05,0.09,0.1,0.12,0.15c6.34,4.48,21.77,5.57,27.69,8.87l0.24,0.14 c6.87-9.22,10.93-20.65,10.93-33.03c0-15.29-6.2-29.14-16.22-39.15c-10-10.03-23.85-16.23-39.14-16.23 c-15.29,0-29.14,6.2-39.15,16.22C12.27,32.3,6.07,46.15,6.07,61.44C6.07,73.82,10.13,85.25,16.99,94.47L16.99,94.47L16.99,94.47z"/></g></svg>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="761.000000pt" height="684.000000pt" viewBox="0 0 761.000000 684.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,684.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M765 6608 c-52 -18 -93 -56 -118 -110 -24 -49 -26 -68 -31 -243 -4
|
||||
-104 -9 -245 -12 -312 l-6 -123 221 0 221 0 0 313 0 313 -26 52 c-49 98 -152
|
||||
144 -249 110z"/>
|
||||
<path d="M596 5393 c-8 -271 -21 -809 -41 -1668 -8 -346 -17 -714 -21 -817
|
||||
l-6 -188 301 0 301 0 0 50 0 50 100 0 100 0 0 -50 0 -50 200 0 200 0 0 -1050
|
||||
0 -1050 100 0 100 0 0 2250 0 2250 -300 0 -300 0 0 -100 0 -100 200 0 200 0 0
|
||||
-900 0 -900 -200 0 -200 0 0 -50 0 -50 -104 0 -104 0 -6 188 c-4 103 -13 491
|
||||
-21 862 -9 371 -20 853 -25 1070 -5 217 -10 414 -10 438 l0 42 -229 0 -229 0
|
||||
-6 -227z"/>
|
||||
<path d="M2130 2870 l0 -1250 400 0 400 0 0 -100 0 -100 550 0 550 0 0 100 0
|
||||
100 150 0 150 0 0 -350 0 -350 700 0 700 0 0 350 0 350 100 0 100 0 0 -350 0
|
||||
-350 300 0 300 0 0 1600 0 1600 -2200 0 -2200 0 0 -1250z m1598 990 c166 -164
|
||||
277 -381 329 -638 25 -124 24 -403 -1 -527 -56 -270 -193 -521 -367 -674 l-46
|
||||
-40 -25 27 c-13 15 -43 50 -66 79 l-43 52 52 48 c406 379 408 1148 6 1542
|
||||
l-55 54 61 78 c34 43 65 78 68 78 4 1 43 -35 87 -79z m-307 -258 c20 -24 55
|
||||
-77 79 -118 183 -320 170 -760 -33 -1076 -42 -67 -166 -200 -178 -193 -5 3
|
||||
-35 39 -68 79 l-60 73 52 55 c138 147 215 369 203 588 -7 133 -26 211 -82 328
|
||||
-32 67 -62 111 -110 162 l-66 70 43 52 c23 29 54 65 67 80 l25 28 46 -43 c25
|
||||
-23 62 -61 82 -85z m1709 -32 l0 -50 50 0 50 0 0 50 0 50 100 0 100 0 0 -50 0
|
||||
-50 50 0 50 0 0 50 0 50 100 0 100 0 0 -50 0 -50 50 0 50 0 0 -50 0 -50 50 0
|
||||
50 0 0 -100 0 -100 -50 0 -50 0 0 -50 0 -50 50 0 50 0 0 -100 0 -100 -50 0
|
||||
-50 0 0 -50 0 -50 50 0 50 0 0 -100 0 -100 -50 0 -50 0 0 -50 0 -50 -50 0 -50
|
||||
0 0 -50 0 -50 -100 0 -100 0 0 50 0 50 -50 0 -50 0 0 -50 0 -50 -100 0 -100 0
|
||||
0 50 0 50 -50 0 -50 0 0 -50 0 -50 -100 0 -100 0 0 50 0 50 -50 0 -50 0 0 50
|
||||
0 50 -50 0 -50 0 0 100 0 100 50 0 50 0 0 50 0 50 -50 0 -50 0 0 100 0 100 50
|
||||
0 50 0 0 50 0 50 -50 0 -50 0 0 100 0 100 50 0 50 0 0 50 0 50 50 0 50 0 0 50
|
||||
0 50 100 0 100 0 0 -50z m-2122 -130 c201 -202 228 -609 56 -868 -45 -69 -104
|
||||
-133 -115 -127 -4 3 -36 39 -69 80 l-61 74 30 28 c74 68 131 214 131 335 0
|
||||
117 -48 244 -121 323 l-41 44 64 80 c35 44 66 80 69 80 3 1 29 -22 57 -49z
|
||||
m-369 -216 c63 -71 85 -139 85 -259 0 -80 -5 -111 -23 -157 -20 -52 -103 -160
|
||||
-113 -148 -124 150 -130 159 -110 180 22 24 42 84 42 129 0 36 -23 97 -46 122
|
||||
-15 16 -11 24 48 98 34 44 66 80 70 80 3 1 25 -20 47 -45z m2091 -1904 l0
|
||||
-200 -100 0 -100 0 0 200 0 200 100 0 100 0 0 -200z m400 0 l0 -200 -100 0
|
||||
-100 0 0 200 0 200 100 0 100 0 0 -200z m400 0 l0 -200 -100 0 -100 0 0 200 0
|
||||
200 100 0 100 0 0 -200z m800 0 l0 -200 -100 0 -100 0 0 200 0 200 100 0 100
|
||||
0 0 -200z"/>
|
||||
<path d="M5030 3020 l0 -300 300 0 300 0 0 300 0 300 -300 0 -300 0 0 -300z"/>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,3 @@
|
||||
import noImagePlaceholder from './no-Image-placeholder.svg'
|
||||
|
||||
export { noImagePlaceholder }
|
||||
@@ -0,0 +1,65 @@
|
||||
<?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" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="No-Image-Placeholder.svg" inkscape:version="1.0 (4035a4fb49, 2020-05-01)" version="1.1" id="svg2" viewBox="0 0 329.77792 406.00738" height="406.00739" width="329.77792">
|
||||
<defs id="defs4">
|
||||
<linearGradient id="linearGradient967" inkscape:collect="always">
|
||||
<stop id="stop963" offset="0" style="stop-color:#c2c2c2;stop-opacity:1"/>
|
||||
<stop id="stop965" offset="1" style="stop-color:#9f9f9f;stop-opacity:1"/>
|
||||
</linearGradient>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3414" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3410" is_visible="true"/>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3406" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3402" is_visible="true"/>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3398" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3392" is_visible="true"/>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3388" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3372" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3368" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3364" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3360" is_visible="true"/>
|
||||
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3346" effect="spiro"/>
|
||||
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3392-8" is_visible="true"/>
|
||||
<linearGradient gradientTransform="translate(-45.254833,0.35355338)" gradientUnits="userSpaceOnUse" y2="108.77648" x2="658.45801" y1="6.5995569" x1="660.06653" id="linearGradient969" xlink:href="#linearGradient967" inkscape:collect="always"/>
|
||||
</defs>
|
||||
<sodipodi:namedview inkscape:document-rotation="0" inkscape:window-maximized="1" inkscape:window-y="42" inkscape:window-x="0" inkscape:window-height="1004" inkscape:window-width="1920" units="px" fit-margin-bottom="0" fit-margin-right="0" fit-margin-left="0" fit-margin-top="0" inkscape:guide-bbox="true" inkscape:snap-smooth-nodes="true" showguides="false" inkscape:object-nodes="true" showgrid="false" inkscape:current-layer="layer1" inkscape:document-units="px" inkscape:cy="109.10202" inkscape:cx="148.40044" inkscape:zoom="0.7071068" inkscape:pageshadow="2" inkscape:pageopacity="0.0" borderopacity="1.0" bordercolor="#666666" pagecolor="#ffffff" id="base">
|
||||
<inkscape:grid originy="-510.42818" originx="-399.13435" id="grid3336" type="xygrid"/>
|
||||
<sodipodi:guide id="guide3375" orientation="0,1" position="-117.13437,-25.564321"/>
|
||||
<sodipodi:guide id="guide3377" orientation="0,1" position="-114.13437,-23.564321"/>
|
||||
<sodipodi:guide id="guide3380" orientation="0,1" position="-121.13437,-27.564321"/>
|
||||
<sodipodi:guide id="guide3382" orientation="0,1" position="-114.13437,-22.564321"/>
|
||||
<sodipodi:guide id="guide3384" orientation="0,1" position="-114.13437,-21.564321"/>
|
||||
<sodipodi:guide id="guide3416" orientation="-2,0.5" position="-115.13437,-25.564311"/>
|
||||
<sodipodi:guide id="guide3420" orientation="-2,0.5" position="-115.13437,-25.564311"/>
|
||||
<sodipodi:guide id="guide4180" orientation="0.24382204,-0.96981999" position="206.80442,220.41193"/>
|
||||
<sodipodi:guide id="guide4182" orientation="1,0" position="86.804424,280.52227"/>
|
||||
<sodipodi:guide id="guide4186" orientation="1,0" position="206.80442,250.52231"/>
|
||||
<sodipodi:guide id="guide4188" orientation="-0.24382199,0.96982" position="206.80442,190.30156"/>
|
||||
</sodipodi:namedview>
|
||||
<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/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g transform="translate(-399.13437,-122.79051)" id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
|
||||
<rect ry="7.0136137" y="122.79051" x="399.13437" height="406.00739" width="329.77792" id="rect1017" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.59331;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
|
||||
<g transform="translate(43.778173,191.04163)" id="g1015">
|
||||
<rect style="fill:#9f9f9f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.2995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect1002" width="82.489967" height="90.470001" x="398.75827" y="178.74706" ry="8.3970251" transform="rotate(-16.342822)"/>
|
||||
<g id="g1000" transform="rotate(16.320529,538.13563,-184.89727)">
|
||||
<rect ry="4.5961938" y="1.6498091" x="547.18585" height="115.96551" width="107.83378" id="rect961" style="fill:url(#linearGradient969);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:5.398;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"/>
|
||||
<g style="stroke:#ffffff;stroke-width:13.0708;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(0.17265471,0,0,0.17265471,512.49324,-6.3296456)" id="g875">
|
||||
<rect style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="rect3338" width="491.10556" height="449.99814" x="270" y="107.36227"/>
|
||||
<rect style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="rect3342" width="491.10559" height="209.99976" x="270" y="107.36227"/>
|
||||
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 300,317.36255 38.46147,-53.53818 60.53097,-45.16084 15.88277,18.57394 13.61285,-38.68356 8.20133,-2.98188 13.3106,-28.2093 180,179.99979" id="path3344" inkscape:path-effect="#path-effect3346" inkscape:original-d="m 300,317.36255 38.46147,-53.53818 60.53097,-45.16084 15.88277,18.57394 13.61285,-38.68356 8.20133,-2.98188 13.3106,-28.2093 180,179.99979" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
|
||||
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 180,60 c 4.09311,16.474688 7.71219,33.067277 10.85156,49.75 2.38256,12.66097 4.48857,25.37408 6.31641,38.12695 l -22.06445,-7.16015 -46.11133,-29.41602 5.32422,46.42578 -1.61524,24.78711 10.05274,30.37695 73.18554,-11.75585 L 300,180 252.19922,102.56641 242.5,117.5 215.375,95.375 Z" transform="translate(270,107.36227)" id="path3390-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cscccccccccccc"/>
|
||||
<path inkscape:connector-curvature="0" inkscape:original-d="m 419.99999,347.36252 81.89918,-74.42959 18.50574,-9.68009 23.6512,-44.18894 25.94388,-21.70121 179.99999,179.99979" inkscape:path-effect="#path-effect3360" id="path3358" d="m 419.99999,347.36252 81.89918,-74.42959 18.50574,-9.68009 23.6512,-44.18894 25.94388,-21.70121 179.99999,179.99979" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="cccccc"/>
|
||||
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 569.99999,197.36269 35.9388,80.91289 v 30.11038 30.11038 l 22.45864,19.46652 c 6.52453,-6.45031 14.14893,-11.78526 22.44431,-15.70477 14.8245,-7.00447 31.33823,-9.35959 47.17057,-13.6217 6.42776,-1.73037 12.90672,-3.85419 18.21343,-7.87277 1.35174,-1.02362 2.61592,-2.16281 3.77424,-3.40107 h -30 l -40.52149,-40.55006 -29.85645,-48.91972 -10.25307,8.83886 z" id="path3386" inkscape:path-effect="#path-effect3388" inkscape:original-d="m 569.99999,197.36269 35.9388,80.91289 v 30.11038 30.11038 l 22.45864,19.46652 c 5.77311,-6.36416 13.54339,-11.40815 22.44431,-15.70477 13.00316,-6.27685 32.0432,-8.74899 47.17057,-13.6217 6.8762,-2.21491 12.68001,-4.81998 18.21343,-7.87277 1.55883,-0.86001 1.99765,-2.671 3.77424,-3.40107 h -30 l -40.52149,-40.55006 -29.85645,-48.91972 -10.25307,8.83886 z" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccssscccccc"/>
|
||||
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 419.99999,557.36227 c -0.41699,-9.60089 -8.81759,-17.60878 17.1252,-30.66806 31.8318,-16.02389 125.895,-35.88836 152.1537,-59.98434 19.42709,-17.82687 -70.4154,-37.66945 -55.0191,-59.07323 6.981,-9.70528 59.037,-19.96947 82.1463,-30.27386 21.90569,-9.76799 15.14129,-19.80328 31.4046,-29.97507 15.7092,-9.82558 68.3499,-19.77358 72.18929,-30.02516 -10.41359,10.52188 -68.83379,20.40327 -89.99999,30.00026 -22.3377,10.128 -21.4689,19.93018 -49.4313,29.48367 -30.1245,10.29239 -89.142,20.55268 -102.7077,30.51626 -28.4133,20.86858 46.863,42.59995 16.2024,59.99993 C 452.54309,490.92554 344.7219,510.65712 300,527.3626 c -30.9039,11.54369 -28.4079,17.74799 -30,29.99967" id="path3370" inkscape:connector-curvature="0" sodipodi:nodetypes="cssssscsssssc"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<text id="text1021" y="412.12527" x="562.00677" style="font-style:normal;font-weight:normal;font-size:32px;line-height:1.25;font-family:sans-serif;fill:#767676;fill-opacity:1;stroke:none" xml:space="preserve"><tspan style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle" y="412.12527" x="562.00677" id="tspan1019" sodipodi:role="line">NO IMAGE</tspan><tspan style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle" id="tspan1023" y="452.12527" x="562.00677" sodipodi:role="line">AVAILABLE</tspan></text>
|
||||
</g>
|
||||
</svg>
|
||||
@@ -0,0 +1,9 @@
|
||||
import { registry } from '@generated/registry'
|
||||
import { createTuyau } from '@tuyau/core/client'
|
||||
|
||||
export const client = createTuyau({
|
||||
baseUrl: '/',
|
||||
registry,
|
||||
})
|
||||
|
||||
export const urlFor = client.urlFor
|
||||
@@ -0,0 +1,14 @@
|
||||
import { ref, watch } from 'vue'
|
||||
|
||||
// Cr├®er une r├®f├®rence pour isAdminActive
|
||||
const isAdminActive = ref(JSON.parse(localStorage.getItem('isAdminActive') || 'false'))
|
||||
|
||||
// Surveiller les changements de isAdminActive et mettre à jour localStorage
|
||||
watch(isAdminActive, (newValue) => {
|
||||
localStorage.setItem('isAdminActive', JSON.stringify(newValue))
|
||||
})
|
||||
|
||||
// Exporter une fonction pour utiliser isAdminActive
|
||||
export function useAdminMode() {
|
||||
return { isAdminActive }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { ref } from 'vue'
|
||||
|
||||
const isOpen = ref(false)
|
||||
|
||||
export function useSidebar() {
|
||||
return {
|
||||
isOpen,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
:root {
|
||||
--gray-1: oklch(98.5% 0 0);
|
||||
--gray-2: oklch(97% 0 0);
|
||||
--gray-3: oklch(92.2% 0 0);
|
||||
--gray-4: oklch(87% 0 0);
|
||||
--gray-6: oklch(55.6% 0 0);
|
||||
--gray-7: oklch(43.9% 0 0);
|
||||
--gray-8: oklch(37.1% 0 0);
|
||||
--gray-10: oklch(26.9% 0 0);
|
||||
--gray-12: oklch(14.5% 0 0);
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
font-family: system-ui, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
background: var(--gray-2);
|
||||
color: var(--gray-10);
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
[x-cloak] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
color: var(--gray-12);
|
||||
}
|
||||
|
||||
/* Header */
|
||||
header {
|
||||
max-width: 1440px;
|
||||
margin: auto;
|
||||
padding: 0 30px;
|
||||
}
|
||||
header > div {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
height: 64px;
|
||||
}
|
||||
header nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 26px;
|
||||
}
|
||||
header nav a {
|
||||
font-weight: 500;
|
||||
color: var(--gray-8);
|
||||
}
|
||||
header nav a:hover,
|
||||
header nav a.current {
|
||||
color: var(--gray-12);
|
||||
}
|
||||
|
||||
/* Main */
|
||||
main {
|
||||
max-width: 1440px;
|
||||
margin: 0 30px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: calc(100vh - 65px);
|
||||
background: #fff;
|
||||
border: 1px solid var(--gray-3);
|
||||
}
|
||||
|
||||
.hero {
|
||||
padding: 100px 50px;
|
||||
max-width: 880px;
|
||||
}
|
||||
.hero h1 {
|
||||
margin-bottom: 15px;
|
||||
font-size: 52px;
|
||||
font-weight: 600;
|
||||
letter-spacing: -1px;
|
||||
line-height: 1.05;
|
||||
}
|
||||
.hero p {
|
||||
font-size: 22px;
|
||||
color: var(--gray-7);
|
||||
}
|
||||
.hero .button {
|
||||
margin-top: 30px;
|
||||
display: inline-block;
|
||||
padding: 10px 16px;
|
||||
}
|
||||
|
||||
.cards {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
padding: 0 50px;
|
||||
border-top: 1px solid var(--gray-3);
|
||||
}
|
||||
.cards a {
|
||||
padding: 30px 40px;
|
||||
border-right: 1px solid var(--gray-3);
|
||||
}
|
||||
.cards a:first-child {
|
||||
border-left: 1px solid var(--gray-3);
|
||||
}
|
||||
.cards a:hover {
|
||||
background: var(--gray-1);
|
||||
}
|
||||
.cards h3 {
|
||||
margin-bottom: 10px;
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.4px;
|
||||
}
|
||||
.cards p {
|
||||
color: var(--gray-6);
|
||||
}
|
||||
|
||||
/* Form */
|
||||
.form-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
max-width: 400px;
|
||||
margin: auto;
|
||||
}
|
||||
.form-container h1 {
|
||||
font-size: 32px;
|
||||
letter-spacing: -0.5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.form-container p {
|
||||
font-size: 18px;
|
||||
margin-bottom: 48px;
|
||||
color: var(--gray-6);
|
||||
}
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 24px;
|
||||
}
|
||||
label {
|
||||
margin-bottom: 4px;
|
||||
display: block;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
}
|
||||
input,
|
||||
textarea,
|
||||
button {
|
||||
width: 100%;
|
||||
border-radius: 4px;
|
||||
font: inherit;
|
||||
}
|
||||
input {
|
||||
height: 40px;
|
||||
border: 1px solid var(--gray-4);
|
||||
padding: 0 16px;
|
||||
}
|
||||
input[data-invalid='true'],
|
||||
textarea[data-invalid='true'] {
|
||||
border-color: #fb2c36;
|
||||
}
|
||||
input[data-invalid='true'] + div,
|
||||
textarea[data-invalid='true'] + div {
|
||||
color: #fb2c36;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
button {
|
||||
background: var(--gray-12);
|
||||
color: #fff;
|
||||
border: none;
|
||||
padding: 10px;
|
||||
font-weight: 500;
|
||||
}
|
||||
button:hover {
|
||||
background: var(--gray-10);
|
||||
}
|
||||
|
||||
/* Alerts */
|
||||
.alert {
|
||||
background: #fff;
|
||||
position: relative;
|
||||
padding: 12px 16px;
|
||||
font-size: 14px;
|
||||
min-width: 380px;
|
||||
font-weight: 500;
|
||||
border: 1px solid var(--gray-3);
|
||||
border-radius: 10px;
|
||||
animation: scale-up 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) both;
|
||||
}
|
||||
.alert-destructive {
|
||||
color: #fb2c36;
|
||||
background: #fb2c361a;
|
||||
border-color: #fb2c36;
|
||||
}
|
||||
.alert-success {
|
||||
color: #00a63e;
|
||||
background: #00a63e1a;
|
||||
border-color: #00a63e;
|
||||
}
|
||||
.flash-container {
|
||||
position: fixed;
|
||||
top: 80px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
@keyframes scale-up {
|
||||
from {
|
||||
transform: scale(0.7);
|
||||
}
|
||||
to {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import { createApp, DirectiveBinding, h, ObjectDirective } from 'vue'
|
||||
import DeleteConfirmationModal from '~/pages/widgets/DeleteConfirmationModal.vue'
|
||||
|
||||
// Interface pour ├®tendre HTMLElement avec _handleClick
|
||||
interface HTMLElementWithHandleClick extends HTMLElement {
|
||||
_handleClick?: (event: Event) => void
|
||||
}
|
||||
|
||||
const deleteConfirmDirective: ObjectDirective<HTMLElementWithHandleClick> = {
|
||||
mounted(el: HTMLElementWithHandleClick, binding: DirectiveBinding) {
|
||||
const handleClick = (event: Event) => {
|
||||
event.stopPropagation() // Emp├¬cher la propagation de l'├®v├®nement
|
||||
event.preventDefault() // Emp├¬cher l'action par d├®faut
|
||||
|
||||
const modalApp = createApp({
|
||||
data() {
|
||||
return { show: true }
|
||||
},
|
||||
methods: {
|
||||
confirm() {
|
||||
this.show = false
|
||||
document.body.removeChild(modalContainer)
|
||||
binding.value() // Ex├®cuter la fonction de suppression
|
||||
},
|
||||
cancel() {
|
||||
this.show = false
|
||||
document.body.removeChild(modalContainer)
|
||||
},
|
||||
},
|
||||
render() {
|
||||
return h(DeleteConfirmationModal, {
|
||||
show: this.show,
|
||||
onConfirm: this.confirm,
|
||||
onCancel: this.cancel,
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
const modalContainer = document.createElement('div')
|
||||
document.body.appendChild(modalContainer)
|
||||
modalApp.mount(modalContainer)
|
||||
}
|
||||
|
||||
el.addEventListener('click', handleClick)
|
||||
el._handleClick = handleClick // Stocker la r├®f├®rence pour la suppression ult├®rieure
|
||||
},
|
||||
unmounted(el: HTMLElementWithHandleClick) {
|
||||
if (el._handleClick) {
|
||||
el.removeEventListener('click', el._handleClick)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
export default deleteConfirmDirective
|
||||
@@ -0,0 +1,30 @@
|
||||
import { ObjectDirective } from 'vue'
|
||||
|
||||
// Fonction pour formater le prix
|
||||
const formatPrice = (value: string): string => {
|
||||
const numberValue = Number.parseFloat(value)
|
||||
return Number.isNaN(numberValue) ? '' : numberValue.toFixed(2).replace('.', ',')
|
||||
}
|
||||
|
||||
// Interface pour ├®tendre HTMLInputElement avec _handleBlur
|
||||
interface HTMLInputElementWithHandleBlur extends HTMLInputElement {
|
||||
_handleBlur?: () => void
|
||||
}
|
||||
|
||||
const priceDirective: ObjectDirective<HTMLInputElementWithHandleBlur> = {
|
||||
mounted(el: HTMLInputElementWithHandleBlur) {
|
||||
const handleBlur = () => {
|
||||
el.value = formatPrice(el.value)
|
||||
el.dispatchEvent(new Event('input')) // Pour mettre à jour le v-model
|
||||
}
|
||||
el.addEventListener('blur', handleBlur)
|
||||
el._handleBlur = handleBlur // Stocker la r├®f├®rence pour la suppression ult├®rieure
|
||||
},
|
||||
unmounted(el: HTMLInputElementWithHandleBlur) {
|
||||
if (el._handleBlur) {
|
||||
el.removeEventListener('blur', el._handleBlur)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
export default priceDirective
|
||||
@@ -0,0 +1,111 @@
|
||||
import { createVNode, DirectiveBinding, ObjectDirective, render } from 'vue'
|
||||
import ValidationError from '~/pages/widgets/ValidationError.vue'
|
||||
|
||||
interface ValidationErrorBinding extends DirectiveBinding {
|
||||
value: string | null
|
||||
}
|
||||
|
||||
const validationErrorDirective: ObjectDirective<HTMLElement, string | null> = {
|
||||
mounted(el: HTMLElement, binding: ValidationErrorBinding) {
|
||||
const errorMessage = binding.value
|
||||
const fieldName = el.getAttribute('name')
|
||||
|
||||
if (errorMessage && fieldName) {
|
||||
const container = document.createElement('div')
|
||||
container.classList.add(`validation-error-container-${fieldName}`)
|
||||
container.classList.add(
|
||||
'transition-all',
|
||||
'duration-2500',
|
||||
'ease-in-out',
|
||||
'w-0',
|
||||
'opacity-0'
|
||||
) // Ajout des classes Tailwind pour la transition
|
||||
|
||||
container.style.position = 'absolute'
|
||||
container.style.bottom = '-17px'
|
||||
container.style.right = '0px'
|
||||
container.style.whiteSpace = 'nowrap'
|
||||
container.style.textAlign = 'right'
|
||||
|
||||
if (el.parentNode && el.parentNode instanceof HTMLElement) {
|
||||
el.parentNode.style.position = 'relative'
|
||||
el.parentNode.appendChild(container)
|
||||
const vnode = createVNode(ValidationError, { message: errorMessage })
|
||||
render(vnode, container)
|
||||
|
||||
// Force reflow pour d├®clencher la transition
|
||||
void container.offsetWidth
|
||||
container.classList.remove('w-0', 'opacity-0')
|
||||
container.classList.add('w-full', 'opacity-100')
|
||||
|
||||
// Attach the container to the element for future reference
|
||||
;(el as any)._validationErrorContainer = container
|
||||
} else {
|
||||
console.error('Parent node is null or not an HTMLElement during mounted')
|
||||
}
|
||||
}
|
||||
},
|
||||
updated(el: HTMLElement, binding: ValidationErrorBinding) {
|
||||
const errorMessage = binding.value
|
||||
const fieldName = el.getAttribute('name')
|
||||
let container = (el as any)._validationErrorContainer
|
||||
|
||||
if (errorMessage && fieldName) {
|
||||
if (container) {
|
||||
const vnode = createVNode(ValidationError, { message: errorMessage })
|
||||
render(vnode, container)
|
||||
} else {
|
||||
const newContainer = document.createElement('div')
|
||||
newContainer.classList.add(`validation-error-container-${fieldName}`)
|
||||
newContainer.classList.add(
|
||||
'transition-all',
|
||||
'duration-2500',
|
||||
'ease-in-out',
|
||||
'w-0',
|
||||
'opacity-0'
|
||||
) // Ajout des classes Tailwind pour la transition
|
||||
|
||||
newContainer.style.position = 'absolute'
|
||||
newContainer.style.bottom = '-17px'
|
||||
newContainer.style.right = '0px'
|
||||
newContainer.style.whiteSpace = 'nowrap'
|
||||
newContainer.style.textAlign = 'right'
|
||||
|
||||
if (el.parentNode && el.parentNode instanceof HTMLElement) {
|
||||
el.parentNode.style.position = 'relative'
|
||||
el.parentNode.appendChild(newContainer)
|
||||
const vnode = createVNode(ValidationError, { message: errorMessage })
|
||||
render(vnode, newContainer)
|
||||
|
||||
// Force reflow pour d├®clencher la transition
|
||||
void newContainer.offsetWidth
|
||||
newContainer.classList.remove('w-0', 'opacity-0')
|
||||
newContainer.classList.add('w-100', 'opacity-100')
|
||||
// Attach the container to the element for future reference
|
||||
;(el as any)._validationErrorContainer = newContainer
|
||||
} else {
|
||||
console.error('Parent node is null or not an HTMLElement during updated')
|
||||
}
|
||||
}
|
||||
} else if (container) {
|
||||
container.classList.remove('w-100', 'opacity-100')
|
||||
container.classList.remove('transition-all', 'duration-2500', 'ease-in-out') // Supprimez les classes de transition pour la disparition
|
||||
container.classList.add('w-0', 'opacity-0')
|
||||
|
||||
// Supprimez le conteneur imm├®diatement sans d├®lai
|
||||
render(null, container)
|
||||
container.remove()
|
||||
;(el as any)._validationErrorContainer = null
|
||||
}
|
||||
},
|
||||
unmounted(el: HTMLElement) {
|
||||
// Clean up the error container when the element is unmounted
|
||||
const container = (el as any)._validationErrorContainer
|
||||
if (container) {
|
||||
render(null, container)
|
||||
container.remove()
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
export default validationErrorDirective
|
||||
@@ -0,0 +1,70 @@
|
||||
<script setup lang="ts">
|
||||
import { watch } from 'vue'
|
||||
import { usePage } from '@inertiajs/vue3'
|
||||
import { toast, Toaster } from 'vue-sonner'
|
||||
import type { Data } from '@generated/data'
|
||||
import { Link, Form } from '@adonisjs/inertia/vue'
|
||||
|
||||
const page = usePage<Data.SharedProps>()
|
||||
|
||||
watch(
|
||||
() => page.url,
|
||||
() => toast.dismiss()
|
||||
)
|
||||
|
||||
watch(
|
||||
() => page.props.flash,
|
||||
(flashMessages) => {
|
||||
if (flashMessages.error) {
|
||||
toast.error(flashMessages.error)
|
||||
}
|
||||
if (flashMessages.success) {
|
||||
toast.success(flashMessages.success)
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<header>
|
||||
<div>
|
||||
<div>
|
||||
<Link route="home">
|
||||
<svg
|
||||
width="66"
|
||||
height="24"
|
||||
viewBox="0 0 105 38"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M0 0h7.5v15H0ZM7.5 15h7.5v15H7.5ZM15 30h7.5v7.5H15ZM22.5 15h7.5v15H22.5ZM30 0h7.5v15H30ZM45 0h7.5v30h15v-30h7.5v37.5h-30v-37.5ZM82.5 37.5V0H105v7.5H90V15h15v7.5H90V30h15v7.5H82.5Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
</Link>
|
||||
</div>
|
||||
<div>
|
||||
<nav>
|
||||
<template v-if="page.props.user">
|
||||
<span>{{ page.props.user.initials }}</span>
|
||||
<Form route="session.destroy">
|
||||
<button type="submit">Logout</button>
|
||||
</Form>
|
||||
</template>
|
||||
<template v-else>
|
||||
<Link route="new_account.create">Signup</Link>
|
||||
<Link route="session.create">Login</Link>
|
||||
</template>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<slot />
|
||||
</main>
|
||||
|
||||
<Toaster position="top-center" rich-colors />
|
||||
</template>
|
||||
@@ -0,0 +1,98 @@
|
||||
<script setup lang="ts">
|
||||
import { Form, Link } from '@adonisjs/inertia/vue'
|
||||
import { useForm } from '@inertiajs/vue3'
|
||||
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
|
||||
|
||||
defineOptions({ layout: EmptyLayout })
|
||||
|
||||
const form = useForm({
|
||||
fullName: '',
|
||||
email: '',
|
||||
password: '',
|
||||
passwordConfirmation: '',
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
|
||||
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
|
||||
<div class="flex flex-col items-center justify-center mb-8">
|
||||
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">Create Account</h1>
|
||||
<p class="text-sm text-gray-600 mt-2">Join PC Creator today</p>
|
||||
</div>
|
||||
|
||||
<Form route="account.signup" #default="{ processing, errors }">
|
||||
<div class="space-y-4 sm:space-y-6">
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Full Name</span>
|
||||
<input
|
||||
v-model="form.fullName"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="fullName"
|
||||
type="text"
|
||||
placeholder="Enter your full name"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
|
||||
<input
|
||||
v-model="form.email"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="email"
|
||||
type="email"
|
||||
placeholder="Enter your email"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
|
||||
<input
|
||||
v-model="form.password"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="password"
|
||||
type="password"
|
||||
placeholder="Enter your password"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Confirm Password</span>
|
||||
<input
|
||||
v-model="form.passwordConfirmation"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="passwordConfirmation"
|
||||
type="password"
|
||||
placeholder="Confirm your password"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
:disabled="processing"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{{ processing ? 'Creating account...' : 'Sign Up' }}
|
||||
</button>
|
||||
|
||||
<div class="text-center mt-4">
|
||||
<p class="text-sm text-gray-600">
|
||||
Already have an account?
|
||||
<Link route="auth.show_login" class="text-indigo-600 hover:text-indigo-700 font-semibold">
|
||||
Login
|
||||
</Link>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</Form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -0,0 +1,124 @@
|
||||
<script lang="ts" setup>
|
||||
import { Link, useForm } from '@inertiajs/vue3'
|
||||
import { computed } from 'vue'
|
||||
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
|
||||
|
||||
defineOptions({ layout: EmptyLayout })
|
||||
|
||||
const props = defineProps<{ errors?: any[] | any }>()
|
||||
|
||||
const vineErrors = computed(() => {
|
||||
if (Array.isArray(props.errors)) {
|
||||
return props.errors as any[]
|
||||
}
|
||||
return []
|
||||
})
|
||||
|
||||
const authError = computed(() => {
|
||||
if (!Array.isArray(props.errors) && props.errors) {
|
||||
return props.errors as any
|
||||
}
|
||||
return null
|
||||
})
|
||||
|
||||
const form = useForm({
|
||||
email: '',
|
||||
password: '',
|
||||
})
|
||||
|
||||
function getErrorMessage(field: string): string | null {
|
||||
const error = vineErrors.value.find((error) => error.field === field)
|
||||
return error ? error.message : null
|
||||
}
|
||||
|
||||
console.log(authError)
|
||||
console.log(vineErrors)
|
||||
console.log(props)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
|
||||
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
|
||||
<div class="flex flex-col items-center justify-center mb-8">
|
||||
<div class="mb-4">
|
||||
<svg
|
||||
class="w-12 h-12 sm:w-14 sm:h-14 text-indigo-600"
|
||||
fill="currentColor"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
viewBox="0 0 494.000000 555.000000"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)">
|
||||
<path
|
||||
d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23 19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44 l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8 -335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10 1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748 -30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343 -53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47 4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4 437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151 -80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450 -238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494 243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96 -66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83 -180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95 44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360 -187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0 -95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107 49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64 -42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45 -62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93 198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4 6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177 -121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11 75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353 -84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24 -45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68 523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6 56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7 -302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0 -9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196 -15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219 -9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2 -203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212 1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10 -42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305 -33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0 30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338 63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3 -191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25 -34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81 -54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360 9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0 -16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694 4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3 1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153 79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17 0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44 800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125 -181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93 c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50 8 50 -2z"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">PC Creator</h1>
|
||||
</div>
|
||||
|
||||
<form class="space-y-4 sm:space-y-6">
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
|
||||
<input
|
||||
v-model="form.email"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="email"
|
||||
type="email"
|
||||
placeholder="Enter your email"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
|
||||
<input
|
||||
v-model="form.password"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="password"
|
||||
type="password"
|
||||
placeholder="Enter your password"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-between pt-2">
|
||||
<label class="flex items-center cursor-pointer">
|
||||
<input
|
||||
class="w-4 h-4 text-indigo-600 border-gray-300 rounded focus:ring-2 focus:ring-indigo-500/40"
|
||||
type="checkbox"
|
||||
/>
|
||||
<span class="ml-2 text-sm text-gray-600">Remember me</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<Link
|
||||
:data="form"
|
||||
as="button"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition"
|
||||
href="/auth/login"
|
||||
method="post"
|
||||
type="button"
|
||||
>
|
||||
Login
|
||||
</Link>
|
||||
|
||||
<Link
|
||||
as="button"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-3 sm:mt-4 text-base font-semibold text-indigo-600 bg-gray-100 rounded-lg hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition"
|
||||
href="/account/signup"
|
||||
type="button"
|
||||
>
|
||||
Create an account
|
||||
</Link>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* No inline styles - using Tailwind classes only */
|
||||
</style>
|
||||
@@ -0,0 +1,98 @@
|
||||
<script setup lang="ts">
|
||||
import { Form, Link } from '@adonisjs/inertia/vue'
|
||||
import { useForm } from '@inertiajs/vue3'
|
||||
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
|
||||
|
||||
defineOptions({ layout: EmptyLayout })
|
||||
|
||||
const form = useForm({
|
||||
fullName: '',
|
||||
email: '',
|
||||
password: '',
|
||||
passwordConfirmation: '',
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
|
||||
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
|
||||
<div class="flex flex-col items-center justify-center mb-8">
|
||||
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">Create Account</h1>
|
||||
<p class="text-sm text-gray-600 mt-2">Join PC Creator today</p>
|
||||
</div>
|
||||
|
||||
<Form route="account.signup" #default="{ processing, errors }">
|
||||
<div class="space-y-4 sm:space-y-6">
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Full Name</span>
|
||||
<input
|
||||
v-model="form.fullName"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="fullName"
|
||||
type="text"
|
||||
placeholder="Enter your full name"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
|
||||
<input
|
||||
v-model="form.email"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="email"
|
||||
type="email"
|
||||
placeholder="Enter your email"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
|
||||
<input
|
||||
v-model="form.password"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="password"
|
||||
type="password"
|
||||
placeholder="Enter your password"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block">
|
||||
<span class="text-sm font-medium text-gray-700 mb-2 block">Confirm Password</span>
|
||||
<input
|
||||
v-model="form.passwordConfirmation"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
|
||||
name="passwordConfirmation"
|
||||
type="password"
|
||||
placeholder="Confirm your password"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
:disabled="processing"
|
||||
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{{ processing ? 'Creating account...' : 'Sign Up' }}
|
||||
</button>
|
||||
|
||||
<div class="text-center mt-4">
|
||||
<p class="text-sm text-gray-600">
|
||||
Already have an account?
|
||||
<Link route="auth.show_login" class="text-indigo-600 hover:text-indigo-700 font-semibold">
|
||||
Login
|
||||
</Link>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</Form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user