From 70e55a039de9e50c0d66ff402b8441d4cbd91300 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Sat, 3 Jul 2021 08:25:20 +1000 Subject: [PATCH 1/5] Implement gzip compression for cad artifacts The stls from CadQuery and OpenSCAD are not compressed and so we're throwing away bandwidth and taking a performance hit by not gziping. Gzip for s3 basically needs to be gziped before upload and than have 'content-type' : 'text/stl' 'content-encoding' : 'gzip' set. https://stackoverflow.com/questions/8080824/how-to-serve-gzipped-assets-from-amazon-s3 The obvious part that needs to change is putObject in app/api/src/docker/common/utils.js but there might be a few more nuances. resolves #391 --- app/api/src/docker/cadquery/runCQ.js | 9 ++++++- app/api/src/docker/common/utils.js | 4 ++- app/api/src/docker/openscad/runScad.js | 25 +++++++++++++++---- .../helpers/cadPackages/cadQueryController.js | 2 +- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/app/api/src/docker/cadquery/runCQ.js b/app/api/src/docker/cadquery/runCQ.js index 98b6b1b..8bf1867 100644 --- a/app/api/src/docker/cadquery/runCQ.js +++ b/app/api/src/docker/cadquery/runCQ.js @@ -7,7 +7,14 @@ module.exports.runCQ = async ({ } = {}) => { const tempFile = await makeFile(file, '.py', nanoid) const fullPath = `/tmp/${tempFile}/output.stl` - const command = `cq-cli/cq-cli --codec stl --infile /tmp/${tempFile}/main.py --outfile ${fullPath} --outputopts "deflection:${deflection};angularDeflection:${deflection};"` + const command = [ + `cq-cli/cq-cli`, + `--codec stl`, + `--infile /tmp/${tempFile}/main.py`, + `--outfile ${fullPath}`, + `--outputopts "deflection:${deflection};angularDeflection:${deflection};"`, + `&& gzip ${fullPath}`, + ].join(' ') console.log('command', command) try { diff --git a/app/api/src/docker/common/utils.js b/app/api/src/docker/common/utils.js index d2be437..0fab7ea 100644 --- a/app/api/src/docker/common/utils.js +++ b/app/api/src/docker/common/utils.js @@ -117,7 +117,7 @@ async function storeAssetAndReturnUrl({ let buffer try { - buffer = await readFile(fullPath) + buffer = await readFile(`${fullPath}.gz`) } catch (e) { console.log('read file error', e) const response = { @@ -134,6 +134,8 @@ async function storeAssetAndReturnUrl({ Key: key, Body: buffer, CacheControl: `max-age=${FiveDays}`, // browser caching to stop downloads of the same part + ContentType: 'text/stl', + ContentEncoding: 'gzip', Metadata: putConsoleMessageInMetadata(consoleMessage), }) .promise() diff --git a/app/api/src/docker/openscad/runScad.js b/app/api/src/docker/openscad/runScad.js index 4a4db3c..6e69122 100644 --- a/app/api/src/docker/openscad/runScad.js +++ b/app/api/src/docker/openscad/runScad.js @@ -1,6 +1,8 @@ const { makeFile, runCommand } = require('../common/utils') const { nanoid } = require('nanoid') +const OPENSCAD_COMMON = `xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" openscad` + /** Removes our generated/hash filename with just "main.scad", so that it's a nice message in the IDE */ const cleanOpenScadError = (error) => error.replace(/["|']\/tmp\/.+\/main.scad["|']/g, "'main.scad'") @@ -21,7 +23,15 @@ module.exports.runScad = async ({ const { x: px, y: py, z: pz } = position const cameraArg = `--camera=${px},${py},${pz},${rx},${ry},${rz},${dist}` const fullPath = `/tmp/${tempFile}/output.png` - const command = `xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" openscad -o ${fullPath} ${cameraArg} --imgsize=${x},${y} --colorscheme CadHub /tmp/${tempFile}/main.scad` + const command = [ + OPENSCAD_COMMON, + `-o ${fullPath}`, + cameraArg, + `--imgsize=${x},${y}`, + `--colorscheme CadHub`, + `/tmp/${tempFile}/main.scad`, + `&& gzip ${fullPath}`, + ].join(' ') console.log('command', command) try { @@ -36,12 +46,17 @@ module.exports.runScad = async ({ module.exports.stlExport = async ({ file } = {}) => { const tempFile = await makeFile(file, '.scad', nanoid) const fullPath = `/tmp/${tempFile}/output.stl` + const command = [ + OPENSCAD_COMMON, + `--export-format=binstl`, + `-o ${fullPath}`, + `/tmp/${tempFile}/main.scad`, + `&& gzip ${fullPath}`, + ].join(' ') try { - const consoleMessage = await runCommand( - `xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" openscad -o ${fullPath} /tmp/${tempFile}/main.scad`, - 60000 // lambda will time out before this, we might need to look at background jobs if we do git integration stl generation - ) + // lambda will time out before this, we might need to look at background jobs if we do git integration stl generation + const consoleMessage = await runCommand(command, 60000) return { consoleMessage, fullPath } } catch (error) { return { error, fullPath } diff --git a/app/web/src/helpers/cadPackages/cadQueryController.js b/app/web/src/helpers/cadPackages/cadQueryController.js index 17fd868..0097483 100644 --- a/app/web/src/helpers/cadPackages/cadQueryController.js +++ b/app/web/src/helpers/cadPackages/cadQueryController.js @@ -9,7 +9,7 @@ import { export const render = async ({ code }) => { const body = JSON.stringify({ settings: { - deflection: 0.2, + deflection: 0.15, }, file: code, }) -- 2.39.5 From f176bbe090ac4761cf2b6374c386dfee2536e062 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Sat, 3 Jul 2021 13:07:32 +1000 Subject: [PATCH 2/5] Use high quality render for CadQuery download --- README.md | 2 + app/.env.defaults | 2 +- .../src/components/EditorMenu/EditorMenu.tsx | 2 + app/web/src/components/EditorMenu/helpers.ts | 47 +++++--- app/web/src/components/IdeEditor/IdeEditor.js | 3 +- .../src/components/IdeWrapper/useRender.ts | 3 +- ...eryController.js => cadQueryController.ts} | 8 +- .../cadPackages/{common.js => common.ts} | 14 ++- .../cadPackages/{index.js => index.ts} | 0 ...cadController.js => openScadController.ts} | 5 +- .../hooks/{useIdeState.js => useIdeState.ts} | 102 ++++++++++++------ .../{DevIdePage.js => DevIdePage.tsx} | 14 ++- 12 files changed, 144 insertions(+), 58 deletions(-) rename app/web/src/helpers/cadPackages/{cadQueryController.js => cadQueryController.ts} (88%) rename app/web/src/helpers/cadPackages/{common.js => common.ts} (79%) rename app/web/src/helpers/cadPackages/{index.js => index.ts} (100%) rename app/web/src/helpers/cadPackages/{openScadController.js => openScadController.ts} (95%) rename app/web/src/helpers/hooks/{useIdeState.js => useIdeState.ts} (71%) rename app/web/src/pages/DevIdePage/{DevIdePage.js => DevIdePage.tsx} (63%) diff --git a/README.md b/README.md index 8bc4688..3f712b7 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ yarn rw prisma migrate dev yarn rw prisma db seed ``` +p.s. `yarn rw prisma studio` spins up an app to inspect the db + ### Fire up dev ```terminal yarn rw dev diff --git a/app/.env.defaults b/app/.env.defaults index b8293a4..f698efd 100644 --- a/app/.env.defaults +++ b/app/.env.defaults @@ -22,7 +22,7 @@ CLOUDINARY_API_KEY=476712943135152 # EMAIL_PASSWORD=abc123 -CAD_LAMBDA_BASE_URL="http://localhost:8080" +# CAD_LAMBDA_BASE_URL="http://localhost:8080" # sentry GITHUB_ASSIST_APP_ID=23342 diff --git a/app/web/src/components/EditorMenu/EditorMenu.tsx b/app/web/src/components/EditorMenu/EditorMenu.tsx index 7e090c6..391dbd2 100644 --- a/app/web/src/components/EditorMenu/EditorMenu.tsx +++ b/app/web/src/components/EditorMenu/EditorMenu.tsx @@ -10,7 +10,9 @@ const EditorMenu = () => { const { state, thunkDispatch } = useIdeContext() const handleStlDownload = makeStlDownloadHandler({ type: state.objectData?.type, + ideType: state.ideType, geometry: state.objectData?.data, + quality: state.objectData?.quality, fileName: PullTitleFromFirstLine(state.code || ''), thunkDispatch, }) diff --git a/app/web/src/components/EditorMenu/helpers.ts b/app/web/src/components/EditorMenu/helpers.ts index e5443aa..7148971 100644 --- a/app/web/src/components/EditorMenu/helpers.ts +++ b/app/web/src/components/EditorMenu/helpers.ts @@ -2,7 +2,7 @@ import { flow, identity } from 'lodash/fp' import { fileSave } from 'browser-fs-access' import { MeshBasicMaterial, Mesh, Scene } from 'three' import { STLExporter } from 'three/examples/jsm/exporters/STLExporter' -import { requestRender } from 'src/helpers/hooks/useIdeState' +import { requestRender, State } from 'src/helpers/hooks/useIdeState' export const PullTitleFromFirstLine = (code = '') => { const firstLine = code.split('\n').filter(identity)[0] || '' @@ -16,8 +16,24 @@ export const PullTitleFromFirstLine = (code = '') => { ) } +interface makeStlDownloadHandlerArgs { + geometry: any + fileName: string + type: State['objectData']['type'] + ideType: State['ideType'] + thunkDispatch: (a: any) => any + quality: State['objectData']['quality'] +} + export const makeStlDownloadHandler = - ({ geometry, fileName, type, thunkDispatch }) => + ({ + geometry, + fileName, + type, + thunkDispatch, + quality, + ideType, + }: makeStlDownloadHandlerArgs) => () => { const makeStlBlobFromGeo = flow( (geo) => new Mesh(geo, new MeshBasicMaterial()), @@ -36,22 +52,25 @@ export const makeStlDownloadHandler = }) } if (geometry) { - if (type === 'geometry') { + if ( + type === 'geometry' && + (quality === 'high' || ideType === 'openScad') + ) { saveFile(geometry) } else { thunkDispatch((dispatch, getState) => { const state = getState() - if (state.ideType === 'openScad') { - dispatch({ type: 'setLoading' }) - requestRender({ - state, - dispatch, - code: state.code, - viewerSize: state.viewerSize, - camera: state.camera, - specialCadProcess: 'stl', - }).then((result) => result && saveFile(result.data)) - } + const specialCadProcess = ideType === 'openScad' && 'stl' + dispatch({ type: 'setLoading' }) + requestRender({ + state, + dispatch, + code: state.code, + viewerSize: state.viewerSize, + camera: state.camera, + quality: 'high', + specialCadProcess, + }).then((result) => result && saveFile(result.data)) }) } } diff --git a/app/web/src/components/IdeEditor/IdeEditor.js b/app/web/src/components/IdeEditor/IdeEditor.js index 8dc18c6..34e8d04 100644 --- a/app/web/src/components/IdeEditor/IdeEditor.js +++ b/app/web/src/components/IdeEditor/IdeEditor.js @@ -1,7 +1,6 @@ import { useEffect, useState } from 'react' import { useIdeContext } from 'src/helpers/hooks/useIdeContext' -import { makeCodeStoreKey } from 'src/helpers/hooks/useIdeState' -import { requestRender } from 'src/helpers/hooks/useIdeState' +import { makeCodeStoreKey, requestRender } from 'src/helpers/hooks/useIdeState' import Editor, { useMonaco } from '@monaco-editor/react' import { theme } from 'src/../tailwind.config' diff --git a/app/web/src/components/IdeWrapper/useRender.ts b/app/web/src/components/IdeWrapper/useRender.ts index 86ae5a4..bc82f81 100644 --- a/app/web/src/components/IdeWrapper/useRender.ts +++ b/app/web/src/components/IdeWrapper/useRender.ts @@ -1,5 +1,4 @@ -import { makeCodeStoreKey } from 'src/helpers/hooks/useIdeState' -import { requestRender } from 'src/helpers/hooks/useIdeState' +import { makeCodeStoreKey, requestRender } from 'src/helpers/hooks/useIdeState' import { useIdeContext } from 'src/helpers/hooks/useIdeContext' export const useRender = () => { diff --git a/app/web/src/helpers/cadPackages/cadQueryController.js b/app/web/src/helpers/cadPackages/cadQueryController.ts similarity index 88% rename from app/web/src/helpers/cadPackages/cadQueryController.js rename to app/web/src/helpers/cadPackages/cadQueryController.ts index 0097483..943bddc 100644 --- a/app/web/src/helpers/cadPackages/cadQueryController.js +++ b/app/web/src/helpers/cadPackages/cadQueryController.ts @@ -4,12 +4,16 @@ import { createHealthyResponse, createUnhealthyResponse, timeoutErrorMessage, + RenderArgs, } from './common' -export const render = async ({ code }) => { +export const render = async ({ + code, + settings: { quality = 'low' }, +}: RenderArgs) => { const body = JSON.stringify({ settings: { - deflection: 0.15, + deflection: quality === 'low' ? 0.35 : 0.11, }, file: code, }) diff --git a/app/web/src/helpers/cadPackages/common.js b/app/web/src/helpers/cadPackages/common.ts similarity index 79% rename from app/web/src/helpers/cadPackages/common.js rename to app/web/src/helpers/cadPackages/common.ts index 08e68d5..68ffaee 100644 --- a/app/web/src/helpers/cadPackages/common.js +++ b/app/web/src/helpers/cadPackages/common.ts @@ -1,14 +1,24 @@ import { STLLoader } from 'three/examples/jsm/loaders/STLLoader' +import { State } from 'src/helpers/hooks/useIdeState' export const lambdaBaseURL = - // process.env.CAD_LAMBDA_BASE_URL || - 'https://oxt2p7ddgj.execute-api.us-east-1.amazonaws.com/prod' + process.env.CAD_LAMBDA_BASE_URL || + 'https://2inlbple1b.execute-api.us-east-1.amazonaws.com/prod2' export const stlToGeometry = (url) => new Promise((resolve, reject) => { new STLLoader().load(url, resolve, null, reject) }) +export interface RenderArgs { + code: State['code'] + settings: { + camera: State['camera'] + viewerSize: State['viewerSize'] + quality: State['objectData']['quality'] + } +} + export function createHealthyResponse({ date, data, consoleMessage, type }) { return { status: 'healthy', diff --git a/app/web/src/helpers/cadPackages/index.js b/app/web/src/helpers/cadPackages/index.ts similarity index 100% rename from app/web/src/helpers/cadPackages/index.js rename to app/web/src/helpers/cadPackages/index.ts diff --git a/app/web/src/helpers/cadPackages/openScadController.js b/app/web/src/helpers/cadPackages/openScadController.ts similarity index 95% rename from app/web/src/helpers/cadPackages/openScadController.js rename to app/web/src/helpers/cadPackages/openScadController.ts index 80e1587..32b81a0 100644 --- a/app/web/src/helpers/cadPackages/openScadController.js +++ b/app/web/src/helpers/cadPackages/openScadController.ts @@ -4,9 +4,10 @@ import { createHealthyResponse, createUnhealthyResponse, timeoutErrorMessage, + RenderArgs, } from './common' -export const render = async ({ code, settings }) => { +export const render = async ({ code, settings }: RenderArgs) => { const pixelRatio = window.devicePixelRatio || 1 const size = { x: Math.round(settings.viewerSize?.width * pixelRatio), @@ -67,7 +68,7 @@ export const render = async ({ code, settings }) => { } } -export const stl = async ({ code, settings }) => { +export const stl = async ({ code, settings }: RenderArgs) => { const body = JSON.stringify({ settings: {}, file: code, diff --git a/app/web/src/helpers/hooks/useIdeState.js b/app/web/src/helpers/hooks/useIdeState.ts similarity index 71% rename from app/web/src/helpers/hooks/useIdeState.js rename to app/web/src/helpers/hooks/useIdeState.ts index 55f3055..e0b21be 100644 --- a/app/web/src/helpers/hooks/useIdeState.js +++ b/app/web/src/helpers/hooks/useIdeState.ts @@ -43,36 +43,64 @@ show_object(result) const codeStorageKey = 'Last-editor-code' export const makeCodeStoreKey = (ideType) => `${codeStorageKey}-${ideType}` -let mutableState = null +let mutableState: State = null -export const useIdeState = () => { - const code = '' - const initialLayout = { - direction: 'row', - first: 'Editor', - second: { - direction: 'column', - first: 'Viewer', - second: 'Console', - splitPercentage: 70, - }, +interface XYZ { + x: number + y: number + z: number +} + +export interface State { + ideType: 'INIT' | 'openScad' | 'cadQuery' + consoleMessages: { type: 'message' | 'error'; message: string; time: Date }[] + code: string + objectData: { + type: 'INIT' | 'stl' | 'png' | 'geometry' + data: any + quality: 'low' | 'high' } - const initialState = { - ideType: 'INIT', - consoleMessages: [ - { type: 'message', message: 'Initialising', time: new Date() }, - ], - code, - objectData: { - type: 'INIT', - data: null, - }, - layout: initialLayout, - camera: {}, - viewerSize: { width: 0, height: 0 }, - isLoading: false, + layout: any + camera: { + dist?: number + position?: XYZ + rotation?: XYZ } - const reducer = (state, { type, payload }) => { + viewerSize: { width: number; height: number } + isLoading: boolean +} + +const code = '' +const initialLayout = { + direction: 'row', + first: 'Editor', + second: { + direction: 'column', + first: 'Viewer', + second: 'Console', + splitPercentage: 70, + }, +} + +export const initialState: State = { + ideType: 'INIT', + consoleMessages: [ + { type: 'message', message: 'Initialising', time: new Date() }, + ], + code, + objectData: { + type: 'INIT', + data: null, + quality: 'low', + }, + layout: initialLayout, + camera: {}, + viewerSize: { width: 0, height: 0 }, + isLoading: false, +} + +export const useIdeState = (): [State, (actionOrThunk: any) => any] => { + const reducer = (state: State, { type, payload }): State => { switch (type) { case 'initIde': return { @@ -89,6 +117,7 @@ export const useIdeState = () => { return { ...state, objectData: { + ...state.objectData, type: payload.objectData?.type, data: payload.objectData?.data, }, @@ -142,8 +171,19 @@ export const useIdeState = () => { const [state, dispatch] = useReducer(reducer, initialState) mutableState = state - const getState = () => mutableState - return [state, withThunk(dispatch, getState)] + const getState = (): State => mutableState + const thunkDispatch = withThunk(dispatch, getState) + return [state, thunkDispatch] +} + +interface RequestRenderArgs { + state: State + dispatch: any + code: State['code'] + camera: State['camera'] + viewerSize: State['viewerSize'] + quality: State['objectData']['quality'] + specialCadProcess?: string } export const requestRender = ({ @@ -152,8 +192,9 @@ export const requestRender = ({ code, camera, viewerSize, + quality, specialCadProcess = null, -}) => { +}: RequestRenderArgs) => { if ( state.ideType !== 'INIT' && (!state.isLoading || state.objectData?.type === 'INIT') @@ -166,6 +207,7 @@ export const requestRender = ({ settings: { camera, viewerSize, + quality, }, }) .then(({ objectData, message, status }) => { diff --git a/app/web/src/pages/DevIdePage/DevIdePage.js b/app/web/src/pages/DevIdePage/DevIdePage.tsx similarity index 63% rename from app/web/src/pages/DevIdePage/DevIdePage.js rename to app/web/src/pages/DevIdePage/DevIdePage.tsx index 027a7d5..9763303 100644 --- a/app/web/src/pages/DevIdePage/DevIdePage.js +++ b/app/web/src/pages/DevIdePage/DevIdePage.tsx @@ -1,10 +1,18 @@ import { createContext } from 'react' import Seo from 'src/components/Seo/Seo' -import IdeWrapper from 'src/components/IdeWrapper' +import IdeWrapper from 'src/components/IdeWrapper/IdeWrapper' import { Toaster } from '@redwoodjs/web/toast' -import { useIdeState } from 'src/helpers/hooks/useIdeState' +import { useIdeState, State, initialState } from 'src/helpers/hooks/useIdeState' -export const IdeContext = createContext() +interface IdeContextType { + state: State + thunkDispatch: (actionOrThunk: any) => any +} + +export const IdeContext = createContext({ + state: initialState, + thunkDispatch: () => {}, +}) const DevIdePage = ({ cadPackage }) => { const [state, thunkDispatch] = useIdeState() return ( -- 2.39.5 From 50a00e10282cbd47edc1982b5a27c5f4822b8acf Mon Sep 17 00:00:00 2001 From: Frank Noirot Date: Tue, 6 Jul 2021 02:14:58 -0400 Subject: [PATCH 3/5] rough draft of UX case studies intro post. --- .../blog/2021-07-04-ux-case-studies-intro.mdx | 43 ++++++++++++++++++ .../ivan-sutherland-sketchpad.jpg | Bin 0 -> 88983 bytes 2 files changed, 43 insertions(+) create mode 100644 docs/blog/2021-07-04-ux-case-studies-intro.mdx create mode 100644 docs/static/img/blog/ux-case-studies-intro/ivan-sutherland-sketchpad.jpg diff --git a/docs/blog/2021-07-04-ux-case-studies-intro.mdx b/docs/blog/2021-07-04-ux-case-studies-intro.mdx new file mode 100644 index 0000000..3176b78 --- /dev/null +++ b/docs/blog/2021-07-04-ux-case-studies-intro.mdx @@ -0,0 +1,43 @@ +--- +slug: ux-study-timeline +title: "GUI-CAD UX studies: introduction" +author: Frank Noirot +author_title: CadHub Core Team +author_url: https://github.com/franknoirot +author_image_url: https://avatars.githubusercontent.com/u/23481541?v=4 +tags: [] +--- + +import Image from '@theme/IdealImage'; + +import ivanSutherland from '../static/img/blog/ux-case-studies-intro/ivan-sutherland-sketchpad.jpg'; + +I'm helping CadHub out by designing the interfaces for the [new editor](https://www.figma.com/file/VUh53RdncjZ7NuFYj0RGB9/CadHub?node-id=1114%3A1608), [project viewer](https://www.figma.com/file/VUh53RdncjZ7NuFYj0RGB9/?node-id=1046%3A0), and [more](https://www.figma.com/file/VUh53RdncjZ7NuFYj0RGB9/?node-id=1150%3A1618). Right now we're focused on getting the Code-CAD user experience perfected so that users can try out all the great Code-CAD packages out there in a simple and sharable way. But we think that the future of Code-CAD will pull UX lessons from traditional, GUI-based CAD systems. So I'll be taking a look at the history and UX of some of today's CAD tools to see how we might bring them along with the Code-CAD evolution. + + + +## Why GUIs aren't enough anymore + +As others like [Jessie Frazelle](https://medium.com/embedded-ventures/mechanical-cad-yesterday-today-and-tomorrow-981cef7e06b1) have pointed out, the history of CAD software has been focused primarily on using software to emulate the frictionless user experiences of sketching and modelling by hand. That paradigm lead most of the major tools to build GUI-based systems, because the GUI offered a interface that could be understood by most people. We believe that this assumption about users has fundamentally changed. + +Ivan Sutherland's Sketchpad program from the 1960's, a man using a pen-like tool on a screen to manipulate a 2D model, considered the first CAD program. + +It's hard to understate how much of a change that web development has brought to technical culture. In the past decade the web technologies of HTML, CSS, and especially JavaScript have trained a large part of technical workers to think not in terms of software packages, but in terms of the technologies and languages that are used to construct them, because as a culture we have become accustomed to the idea that there is always an API powering whatever tool we're using. Technical users of course still want seamless GUI user experiences on platforms, but increasingly they also want the ability to get under the hood and use the APIs that power whatever tool or platform they're on. This trend is evident in the rise of API-first services like [Stripe](https://stripe.com) and monolith-fracturing trends like [JAMstack web development](https://jamstack.org). + +With Code-CAD, we are putting a spotlight on this sea change in user expectations, and putting out a call to action for people to start creating experiences for this web-native, language-comfortable audience of CAD users. With CadHub, we're building a showcase for the great Code-CAD packages like [CadQuery](https://cadquery.readthedocs.io/en/latest/) and [OpenSCAD](https://openscad.org/) that have been under development by early adopters for years. + +## A Gooey Hegelian Dialectic + +Okay, so we in the Code-CAD community are a bunch of developers who want more interfaces from our CAD programs. We're comfortable with programming languages and APIs and we want access to them in addition to the GUIs that CAD has traditionally provided. That's all great, but then why isn't Code-CAD mainstream right now? + +For one, the process of building a robust, text-first approach to so visual an activity is, as [Kurt has written about](/blog/right-level-of-abstraction) on this blog, incredibly difficult. But the Code-CAD community has been doing the monumental work of developing clean, expressive APIs for modelling. That important work is what we want to showcase and make more accessible with CadHub. But we think it's only half of the equation for creating the next step in CAD. + +There are myriads of thorny user experience problems that have been solved by the dominant CAD packages of today. They are amazing pieces of software that users know and love. And all those clever UX solutions were created in the design space of GUIs. If Code-CAD as a paradigm is going to become the new normal for computer-aided design, we need to understand and address all the innovation that GUI-CAD has brought to design, and translate them into Code-CAD. We need to find a gooey-code synthesis. As previously stated, this new generation of users *still want seamless GUI experiences*. Code-CAD needs to provide a way of switching seamlessly between "Application Programming" and "Graphical User" interfaces. + +## Already under construction + +I'll try to explore that design space with a few brief case studies on UX that I love from existing CAD and 3D modelling software. I'm looking for key experiences that help empower designers, how they operate in the GUI-CAD paradigm, and how Code-CAD might provide code-based synonyms of these GUI experiences. + +But I want to mention that work is already being done on this front. Jeremy Wright of the CadQuery team is building [Semblage](https://semblage.7bindustries.com/en/latest/), a GUI-code hybrid built with CadQuery and the Godot gaming engine. [BuildBee](https://makecode.buildbee.com/) lets users switch between Scratch-like block interface and JavaScript code for making models. Blender provides an [excellent Python API](https://docs.blender.org/api/current/index.html) for almost all of its incredible functionality, and there a dozen other projects pushing things forward while we look to the present and the past for more inspiration. + +Our first stop will be the timeline feature of AutoDesk Fusion360, which is a clever way to make the order of operations in modelling intuitive. \ No newline at end of file diff --git a/docs/static/img/blog/ux-case-studies-intro/ivan-sutherland-sketchpad.jpg b/docs/static/img/blog/ux-case-studies-intro/ivan-sutherland-sketchpad.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ddf88d0b6224a68433a93ff83abb8e797ec74a8b GIT binary patch literal 88983 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�YG|Rc@n*fwZi+8PZJq4Om7?dDVnCTkiO|x|eCR(f*1!BsSZ_{Nfyr`X}Ut-^!%J`HOTxilW+kvBmy zOteW`?2&I+0iOQ)9DJhYWA3B-Pe_Cc%7)z4L92`&7r{cs1((*~{di>=H=mdDg3qu8 z2}kU0N^`2g-K*@R6AI;@DGq$^soh(rSI`4?eXT*x>6g!E;(9l+C1=}UfHPJ1AW>z> z>W>^^i|ll^MfEPO=!;17V&{2NK3ERf_(m0aM{f7o zJAsdPG%qlS{z08T3`(teQ;(5lf{-9pE2|#z zcjk@?v-bmKOW$E1teGDAHe<++|8*ZaCMy#xF%$?6j6B@t<Om!IA1R3~S~&oiFPbh}%6Ng~Iq*bnDC?hZNEbCBjnSeo z{y(-$w55kq z)!GE&L~GeY_5_-2Yx2JOf!4!Cnyg3P3wvnxZee3B;zmQPB?F&;a(sl`MnM&Y$dS5^ zrCX^&uPPnp{ghEMl39jPujc16zVL>;4)Ok=zlUiy`4qPudyq=58jv(^lt|8;+}Kzq zKJRIoh6ZU<`jxYf1mP8jm31yS2rpKXvo4IgZ?3mp;vH?AzY|@eZEq8Os(CyBb&&zD z@ZzJ{uO^A69fi{chkFa}#-S5mliBplP2tUUP${Z^?mNz<4A<8L;lGUUvl|{)jQur@ zeDwbXlu5?XtBPAf6y1vTqBRF2nOU`bX;T+wtaNV~LgXUn9NG>UX`Ps8XMrGW{>`dhcWPqQ_4%57hE_i8Z#De~hbxyheD^5PnB$cKMj>!IPktP%q~7pH1k6I_f^Lnwo)O zr|q2wXuDlYbmk@7Cs9s=da38Y$k1NdiBRqG%?aS$vWBs1W-FtP0bxihe;~{Uc0Sk* z%%)tLLT|3aC}NsfOyC*h zOwtC8$I(N=ahrZYu`AZ#oYSB&Q<{%eJ1A6XXtR+B03K@*S>CND-&e%xANqr)#?WFXB}sh zAnXH-tX9ryO1(&%pYpp&fP)IXcZ=(*SmrOUgeoeB!biI1S}eQG7;ctUGKQRb>hTNE zu;6m#li^-;{`ohzyGT#6v?s~Ue$l?W1k^aor?FFY&7IZ5k%$Q!h<6n-)!b*j71Y8j?%|Hjl2b2gE+q6|{)8zlgiLTR}l_jK08Mz*~miM{G^4TmB zoU*7cUpCJ4Zj8pO{Wb{rcxA!?4KXZ&_z;qmcQ{^6I!DNJJlJ?sW{PKR$iJCl%i=Ee zc0v}s1TxZnyQfzJz{a2wyJacn;r=$B&mWK^RXB!A_4)+=U#HFxEc%EJ4cx)xuW|Nv z`&F_LSJ+7zrQQV2@9V8y>=d?wz-akdn4fAM48aRdWn{1U5IB~BiEkXNr;A;Pa##Om z(2u+0FTjc>1E^nbW?#V0KWY=c{{C?d2=E&xa^s4p=F>06q-VwaX6qTRh;%CS~qpSkiL2^oT|x+zX2wP8(cwBJvw zB2u+p@IT&Gx#279kx-!D@F@X)8mT12^p+`>rPi_gF(O={u+I=8n-xt7BipWAS2Ufv z&5ar`w+Wpdo3rvV947O8-UsqY`AZZP;Y{+c5PjlxOtxuSp~+T3^^4nGHlJ3)#91Y{ zLMp{w*2oyI;p{P%;1RHzfD$^X;0SBXRFO2I%6U5Un4NjoS3gC;)Z1I@pNHSygvY&& zyu8qHbMt;F<$X9==q14X(RTSly=fz;_}ui8y!irah}Z6+^Ys;CSjMz`R%pd4paGYj z|G{W{LV4&iJj5#o$A8Z@`vjSzs1UBUfC75i{$jg>1~jd19Mw+jV7MRCHXlgd{fJxc z6;pTN<4q$QLc0AYjz|S=X!kGU$OWt%PvKcQK-k!2N8O0ztN^y!82+YON`S!ptY8x^ z{3>C$?o#3rX!u3J%ykDVe(Tv}*Ph~mT8Uav^43j zM;t3NFfEJ6L`s$Lv3+Z;7;3Rwb(1;&_TmriiFRT{o!al4PmquB=%}Sbb-U3O6()jN zU+p_D^4^d z!~~c0U-Ghnmyl&Gs`glehB@8PK>VooJInZ*7ND<{E7zy1#;#S_vT=Fh#hVK0T?p=G zJR1&LDja0qc|$&IJ@I}-9%Qeiw!JD?5>%)-{NLi}%)*HuX_)r|QEZj2ySP2mO7)Uo z66}U5ob~@BV*=f^UHm-@?Ee!3tK9Zpi0+6scWauiF-^YrThMXOP)>KxU!7ypzq8Go zzt!@~Ml8u3V+2!kb^z{EJ<+1Lt2k>u>KG~ChRI+n1q{bCCGig(QbDQ2>p<7pD>y65 zAur_U14i$_H?D>=hpuk8rK5y|+RUJ~j^0EI`~WrQp=#F)lOmfc8zPFlc)V zI~w%MCZcaB58}$0qxj&*s81Ek@H^WNq1Ocu=QOrU4--%#@4JYW%%L%m3c%y(p zg{~m<$Hb~gXTijA%?z$dK}l?n4f5J;vwmHbn*f(~`TGZl_;=xU{Yk}H=1YsYCr{tEeER1L7^tROn8{LMOv{ zy4I~#PmmJPSFe$#1mEGI2*`8gI)cB)U5v=F{0|<33p2`tQyoh+1^edhG9R|SB88-( z&yof$_JyC_-)oAP$Fi~1>OhT4f~R7=-G>*h&n+4od-8}l2!>2~gt?ht$E#RPRtc5Z znd{c&+b5V5O8$!Aki9g5KaEP;EwC%oN*fkgorIBly{Nh{teQ^#nO0`?^FeBYV_M3) z=}NLz5#h(KcOHYThkQ2`@3zZ`@e4_aEUqdvY{0x%MB?sdufGuPgNGtl6Kw@I3473; zc20|Uaa+n<=wFF=h}U5JO$FHN;4chE{&2Rn-x$cc{8y71^W7dD7T%@P7}hmQ~J$z6exMrBrg?B)7u6?3Q4uy}x+9 zQXAQ-lHiSL)aNh{EAAl-`-{n!Ls}@Hf>zE^((4tQH@_iXK4myLW_|CiJX_GM4q5@< z@_=DY;yZdd!6U5>D}wotWM)3)`dkT9rTmRwaA&=ob~Zn)cfSjyHSkePQ46M(LTGP0 zEwWR$WZ{%y7V(s*ch?NhXIZ)lm)eUrp6sgdnEc$d*DzgCGfxh~3A=C__yF$zM`hsH@+h>NpyK=+3A3L21uJ*`! z%j#SO*b z)TDWM|5Lx0UIr0=WUdqEtREVXuFnH3b9-)Hlec8a?fdDr#RsH;3$0b5yt84qx$wcK zVvb&bTWCKaA1s-F&|CeGSmOY6;z4eqj0nw%yZ;T#!VBj}!x!{y3xLRv1?he8u*-CH z-5fB2lM&0JS4!esz+yDO-}vEu5Yb&5F$i?oLt$5DD1zCFwoQdM@RR9>aJqwxhRgb8 zzzQDzO7%dr`zT_Nk?1%5r4&rgrPj;4AGX>Ff1TnXkXGS)`M6&^j)-{37|EsUk*fuI6|#fo$>8 zMATiVbvrBD{Km*Wrh30cgMWl4iaX}CGNEK0@%E_OH92w_?$eZ&*k*d(4*82veDJlK<{;e+E*mj|SWw3(}rjZlnI^CQPzQ?(#0cQATS2D_moOe6HGYDztw4 zVnQ|4%bAve5@gC)r$NRt{_jG8CtxyEq3~NmEj{*ay`jb2-V-hZ{xqxv^*7hqCmnz# zN+M`MWay_prZo?TjsH9{_ZmShy3(Ey{urA0?Tc(MKU|wK79SDMFg#D3U9a|#;Ls$e zuJ%IkY`q0qW9Xl=JU0rZYsdDoMMTF#S&p~;5(jip1>24NmS@v7KJxwp(l4p} z0+wr+Qg26{0wIS9)ZwQ8+Nkj+EeWBO5gocAf>|r=%q`EfB36srHQ;Sj|9n>cTYymp zS;gjoZ&!81DAO_ITKMa&Wg4O?JiSRAsJa|6o+UeZaND+x`t2R)iMvE>E-$L@Rvv-D zCbcV<2gNo|)^{mGes1RtD1UX6G0Q*TyK<*eQ*!k4;Tadsm=OA~Yy2e2mw_A%&Hf(& zkk}|)#7xcklr#1iuE0B!x$@l$wZCbbe>*7aS(Hx`@9*;VR3aEULU;x^i+WDM)uIUS zIJ9sw!hZL|9gio-G66#4j~5+5Zg~eSGD6IxQ~EKQlpxzvsQ%6VB4rsGt#)7k{Id5PP~G<7_HR$5KS!R37A*6G=D$ZD8~8 zClVMK(=kn~2hLMm!*+!w2A3F?T_sv^U{al>Wdr_T0%mdh2=%c@-U~LJ5CB7}CRkoY zn>kNv^#|?iKxJ*FxnKH*bWa3(rrVg{#Pu}19&2vf3|3g|B{v}1@I~>Kxk|2-4xRLK zu}eg=pR)wdoM!;2iT@x^8ye5g*54CG?(lOLZJUlRBJ;Tjh^plk_sa}nd{N&-C;mVo z$+Rv&B)V9LA~vr$&S7(|hWH}xSs&d0=i}-F(Jy!z$7moNv1sKoe=-#wXqYpWs&y2` z@Y|Yv-zM309zHg9O}ERw@MA0sS9^FKuSvOzcJPs9)hRN&O?GyjT~C4ILeFUt$SL>` z>QpBM8H}1MqbEG#RbLWz*tK0}gf1 z16Qh+QQDc%((3+QNo2}H+gCG6(VuV1XDU&{F)a*l1BgcV2Y?_u)cSbXigoITy(F_6 zCxsoCoGVME97~e9)0>wqgKxqrI!J6=&oK8Otr(2A)VR;45tSyvJqlLbbUAJD)mP>E zutv_<|A$>9(c`#nBGMd48LX^?8v9DObDr>sO2;`ocV|= ziN!npbESNdU?YP5mhz>|2bcl%+rhq>`h`&*>^i2v+gyy~s>jZez2!eFylC$Pxb zP&M2=A`@!j_qpZIgr@!ATq4y_=5sYFRWt^vO>PjhUJ)z-oT;OHMGaG<6FNRiuXAjk zT({*GrPkmLK6i^-4}IpcZrP^p03^+tOuY023bQb~Qn%06&pRZZAn6F{e=4#^r9B)c zRYH^fFDpubDHL;5lbIckF*Xpdvsd+<1VH?P-kDCWox=}AK3Jf)AptuL+r#z}b1Rg7 zuQ?i_8ye(x!}p#FnZNc0BpN@w?;8$7E}xIlsIOqU2Q6W}5T=B68HHb5gTsF46v0TQ zQRa^Rar5HR@3^);!o#5O(OaW-wrq1l_ota7a#1HAe<>O2NYVofb;_`fK;>xj_}Z2G zUY^`H=i=IZPJuBh-Pz&+wlocye8XlSPmLe%pwCnl8UoAub6U1`?rMqhBpOv;sur{X z&2?!)L^&t7p}}`Q=Ia-JRhb}f_xL^*>NKCz3YpiwhY2v}c^I`(dMt>oOkm5M+P+bS z++LX8^AnV{$K4s_i%l3$v1^7ut5n~xXam{|8y5_77Va;Uf3`Mj;St#-o6YN70HO5! zaCbPju=~5OdLqcpajb|*W46y>S7kJ?;p(R!w^)rg8S>J;*7>TUj>YPRJP>iyF5AWz zlx|ep_El^mY=0ki)PoN%H(w8y{2!S$0|nUR5f~~iY`K>8A0D9L3L$3FW-)qoV*4$C zbiX~DJy$Pc9#p`vJO9=t9q1F0Uq~&Zx;fh{WBV{bJPB4LF-?Kwe|~kd=q-GxhL^xp zk>>$3SvLdr`(y)Nuf^~g^&B)~URkB~^4u0q#pf;Heh&4y9A4hGC0!JGUM;2qIj^sl z!lwg~IcSLsjQH~Ii}HaSv=QS-+nbHczN4}NqeXxLnbEiVuu{Kou8^4QxJV4ZcmbMY z&4_+%R*%<{_2Rj^fEQI+!o4NLxdnJ@HGS}OCToeYS5Urf zTtF4PPH*D?q@m{cq}SK-g7?E6!`BwR1mmQ^dOWE@Cb9*Y`UZ*#=OD}lG#H9Cu9{R`U z0LlNIZY?XDV5I26R=Q?d`nf4OcIUy=LmT3xx6I56JGYPZXjhohgC?D%Lj?nxp9GrD zn~L?0SEBQEN-TCUZyRtGL12vp1sMhPXLC(Pojhc?NdC+Pkpq#o-zb4!Su9p41$wXF zYDs~cMy~|CBsHV1CD3SCT*pvCmKhfXeg6{1AiNtHimGT!!I;gSG zA}azO8jsta^zpwhzSNqCYmW=ml(odP1!GVz9(4KUx{=KXbt(Bj)&G6BF-$zElEEJq z>J%_R89p7^<2NV%Cpoh*(dh|XTb|bb6A$`FP?Wf#o{u#zQOvnsN1%`q9`ti-^mY{N zeVE%wxPuB$ZDpu_uIfEK=*KCdx3Ayu9d5{)fu=<5TU>f$9mPvWu= z&&?xS<*m71bkWeSwNGRbZLUlg$v&45OR4YH5vu@`nHN+LD=#FvJXGI*3 z1C)r1ae#Q1-3LS;eFH;A0pK3!##5{IZCgoopS)G?kxF>~Kl3q~_5}cmWyFM*4CT`^GO4aZ{=A+$kTwFKJIw!xYg%gwY0l>>~%)y?0poR(3UNxvk{D#audF!Xo zxDPI{g_~Xe<-G2P+rpBiWFhOV>e}a(lROzO*nQ4QQ&FtEA#pJ>RR6Gk;Fw^!9$kfz z+H8QS&Qx`Xw=zrJX_;pa+BJ?14-U1O9FlvBPldIl?^W{v?Tp@G@Lv~)cr*cns@UsswA=udxvH<~s7-+bDqozHSAzY*L>82!mmO?;G&{OO3$}ufLSuwAFF--mpL_#Q+Aw-t9a8J@SfR{UH;2 z%uHYH&$Ba4poF?_zu0 z{o0SvsEJZrTZsF)N=3SrL>!7WKJJADhi#ld>>F(#*bNtTM378>&ni1lXQO4Zvb9px zGh)S*40p)Vxyb|N=|`xQ=6C}%{>iB*}(ai9$_tw%7S!gOeggU$QWq--N zY4XEZ^rd8m(ZH>~Dx@^t>{oU&gH>D{F7*ME2c} zm6Q)`fM8qNBXQ{SrU}9OpOVbX{)D|?su|c+xozVeZ8&<*xhCaco4j2DStTSJrl%_ReT+W~ zkNVU&`F9m89!i+6YkhNIb}i!RMW88)^==Kl3tw9R;bTb-*f_1DZy1nl%`4JW(p4~D zTl-^X_HaZK$wn|k1jq1;FSG0_1U|1+7^8Yvei$}s`rQF!(L6?_$TbBNM>UW469TgU zOO}bOWq@lxr40F+jmRSRDpMaQ&xaljgC6==gA?l}H;(u9#{FLT*#Bl#9FxYiCuVwj zmugsEPX7(&X+V~RKMs|g@)w;|EWN?m@CTbdPb9}8Zko=l{&Qv8Fx~xIrO+$tzI5Qp z`vfsW8V$c^3YfS60{D3K)%TP0_P;YEwa6zgn_m&1Bf9(&r~5W+(%mj4p+~nEs)@-S z^Q7M)+YVQ3B$OFt|I&%p`b@M;{7fO;G-k#%U8d2?4q)cZS@$`}O-*^N+=n;s256f{d<`6e+43@o@I#;6TZZDYMUAkDZWegowwN#^xu? z*DvLM1@b|!vD5~Y1VG~sY)Uihh0Ir@me2xt#oOBGfZ%)vm39db-2gfv_qTC#D*yK> zRznsqA##>8qe;GGv~i5q7==vu>yDDSO_F17o%#qFd{=O&enOQJbj(2zWLg%PkP*zQ-*8+Apk4;hK+S|w_)OMR9{uUY?k&OyX#QXLtw2Zf7 zTPYRq;A{|1xrWUr$omZr0^KL;O{r{Ky<3~-hyV<)BJ zj}*-Gp`=RMOsamz`yY#31r~fPG;^i{1kXbzD7rK(ksz)w!bS5uOwPPWhV;EcApZr(4)vlet_dTD5giCdnFXNa2IsgBla|o)GFR+%+e|ri{of zGrEc5hc(aYuf4^6gi`hGQ73r;&D;BFkUfI?kEHu$VVR)`%7 z@!s(*tCxcSMwV^AyqVKerRLqB3yw!LgVhUqi+m0Qlm4Em9KMiCM%}A4C(c02@QkVd zmhw|O;PQ)=dRNu#G8j0##OPmrD{a>(*z&2z#E%YHVwkA?=xO-4-LJ>t@1uBg+HMnkD^NJr z1RY0z$mN|swlQ8Zjrmg4Tq!?Wi%0*AB)c7n-Q&%N4}&{po3x{EJ1}?r^Bju7M z5|acKG10NHs2l7b=hJKN1T*Go9fCPZmrk}IF@3)WVMmOB69q7?Kf*k&ZWE1a0(Q7~ zWz-^6=XpD(p|OBLIxoakJwNpRG(BdVLjT!P>*)v;4677`%p=|26!(TQDZg(80$@Dr z%S9zyM|gWMop&89Ld2p2q^((#9i&8=Hm#KN{KghCMng@d7Sw|ht~o~M0&Od%^NJ9R zgTU*xJLVjRdjhymgUT#f9`BpW1QxF=PjBRMdZyFvo1mX7e<9b?JE6gcgT#iDrqrGb zM?KOto^m+4uV~!nFV-&Od0hMjfILnai6!RBPkg6Wm+(L&Dd(Jw|ZRwdJ&! zI;SiAi20>kdg!Eai%7yX{X3x@F0cW7OzxHJ3(~N=WyT{VH-AFtuI#fUA_{7kM-%#{ zTG?-dd;9Ozvw+3NXP{HLKF=o=Kq}>2n-Z3FaEdntz=nJ1##96x-s&uSaU^aT9m`(K zpO5nFm&PD^uyeH@%THJ;7)6B1r4n*P1j@b`IXs|!0&*X&?^i|{DW8bB&>4Tryap5cVAy#X@ol}m(S4tbE`dg6ugr0iyjlDpx= zdz;lAL{aT)lT?=J&G1J~2FOuN1L|^N`s)F;I)v=l`zeE=JYBjK3AGaT8zOmbs+L!w z?Yz3tiM1;x#Bw&A$^+ll!+VvEwf1aWX1uG~axJJgk?9F%*7~Z^2G0%Xub?SYicZ?lP-JyU)2qR^z75?-xa0OntE1!)LDL&SKKEpy=Q_`K1Df|;fGBy=;e49luXfM= zEtn%5plO)bH+aU)zxDY5GHjuQt0=EVEK^55QtGa`nvW$iFkO|IKhBuPSAO$Tvgvz} zK>#A$Cg$9;0uHZzm3_)pmVdKt5Ymb=d{2Bgy@vn0*i04R5$0Z;T?QGve*31+wh4+3 zY8m}yKCiUgl6;ZijkA02BrXW%I7y~kWq!w^6PX7Ot*_^kePE%E6PboDjA_WWO7i*z zY2#$fMjHHy+nD1p8-;$X*iGo4R0=|krTnDSY98dmr6c@lg2w7?ts6jHinehJ$Qr*j z{-Ym|Ip8C@6qMBDWxGFodS_VXiYw(2*3tq#vwzLLSwDtjG^14Q zM&B@y(a{6`AZ2lmNb@-c_V>L!<@gFACw|6F72b$Y>8Y5WBy)LO^I-jX)G3mdAdO%b zw=)XvdFQL~AXy(p$-mezwk!d0EgqRkmAP&q$(MoTCRG3QzOBKkc#5<^pMT}pAo>@= z7o&3;6~|~kgepxjq?DHGCQg>0H2_=g1^)`^$0=MH^bjmg zDd%|ETM-E7EDdnP1Yb^(HB;#{ht^0An+1qSiAdD(9A94#HS=mlzr!qdnS1UPnitLw z239h%=!DjTq5%devvOY9Jw|liw#sN>Ap!bhp|{pbj9-!1naN8-P#y@D1xO`9?I|Ql zE4R5PvyyBtCP9G2Hoo0$S8ZZ*a#sR71_U6#a8+jfA6dyOV8mLKg6+H;1_w|l#995h zYy-ehn3@HSDg&<+fV4-O74y>a)i*_Kb9>w~LWDT)oeb&zeh#E7 z3l?}M&6S_ze4OH-4*#r)r|Sxc{(JXC3wV^feev$ed6!(TxSGyhgGV^XNI&6BA7ige z7M`Mc`E2tpJZ&wZ!2i<7?bFR`5Anzm3lg8z0_Ej|dvs9o-rwr=JFsivan|9OQ_1u? z)${+6oow@*owh|%);-(+Lb{RB`JeZ;bC!!(4Ho!rTOQ}T%$en(4(tPVc~k$3twn&L zZk7s`0N>z$WZT%DJJwn$&t%e;<^RC0g+&Knnp;&p0p`qMX5wYxQ*+VsbGrmkCf zIIK3C4p6C2Mt9}Q!Nj_BfOP<{D_!A6IJ<9-YyXko<$oxJOx}{xD7gki{aF!sal<2J z0^!hVnkj4}WI?skO-%Dz1~OKW5y@#$pfV%Ra+1}RV}YzYp{kKo8NE%|%~z|{>$usL zaR`oQvTt~!q#HJfU)5do78TkMY!k$*eg7YsNBX_1RTZx3?@`Vy3;(h-tD&DzlMz9p z$nm<>KEBAOlzaoc6g7{S;~9%Q#lNK}?s1C>o;oFuXb}J1nwcrb+Wu)Zw_NN?Uog9c z)>v>fjZOEd*}QHyWgxwk1MUeog~_(NcSP_Gu?=*2S#$4zSLwV zfRFBH3n!jI@TKXeaQ}a@A!}w|6+VLS-XDo3N=fBXT|CoUZLEZN!L^&iz)GJu{o!bp z#G$#$-GET&%9Tn9dL{ljY#UJk?tI;Z{B7_ngCG&0K%qpf$ijaY$f#D1ra-qx0 zj|hb<-(L8fAV0S_lyfGQbOq+SNc$;|3qOQ~RVwIfrBI7?DPm%pyzEpsOhuDum(aiA z&gSz64DLTyRJEC&PT}k45GX|vj!%Q^Ag_@-{5OR&5BC0Gdh>2q+!UhpR-b&~`2;bj zk77beF#cAUeiJ?YII+MPsV`S;ZOgP(I86TSR}SRkWh8RWBrjRb)V6Ycd#g~Vh! zUDRdO%kcN5{q=8->r)R)#D>egQ$Hn87fFw) zM6#Ln+uXswOnbq$6heFIO+olN%tswc0)1WDKyDvoCz=YlBph+p$zn^;!!|`+orish zw^VOLt=_aLwO=tn9)hq^8|(GA@O;TjTaBXq=#IJr=cV z9{w@$#Fey zV%hK+j-qPyAs}?-4SvMgxmWq`JfYICTO3w6Pu)AQ~Z_Z zT0PP`xhvs|EO2lQ$YOvI8(6weyyT0i+w$()i@sgR70sEPiMBi)3M!=f*Q0}C4ihoS zr|DbDeF9=(CZ7#b+ji>oT`-%@qunRY;Mk9mpIYQ4vfi{C+UgJ=OiBJ_452JLW|)j9 zU@Wp%=|NOO`j`A+dF}-c-c5K{q3z=;2O#&RahYW?bV%CTsfABL=hBQEH<&c^$AFqc z**q_#w!!53(wE_95^on08}K?uv{N^Py-pr3#y#*43AlO%3##b*4V0o*-i zABpO9F=-!HtzTAnm#N9K^G~#t0dR^Za8Iyx=3PnvD-DHm(De?Dm+>`bf5=_Z|N5GC zUuM@`w1`fS5d&We3STxzs-a>g@7`=WK%ZL)UnJB92fCFyHWf2og4C@Jb}|uK?`f(K zj5gC=G8qm>J}Nv}E-Q;1_>W(!k4PPbQ$(5{n(TAcfbM~!g?bg&I-E5BqM=lPFzvgf zM*K%P?!O!hbDXdL3ETi$R~95l)Bk|6o$p4ydV!B$|3v*(xwt9$VV}Wr>C&GoU9uqR z<^#0BRkowH-FP{KW7xa6>*ol&?jz@Z`JK3e^uLyPy&xDE8k=DUZlAI-B z>^vHDz6_xKwAeqfq$7*ML=QF~%_fP#5xtSh&66j#Aa#)V?+2Jb^5|Wg;FaNEn9Oo+ z#`KFyYRXo?&ez@{8`4vlCp2)1%xdvH_~GGC9hA;1383@N{Z)ReO(q;Ivs%9Jvw(4p z(WDclYQtn-nzD5u18N%>D2{Tef<2r1oP08LQM0ZW`57vsD2k^==Ve|6R~QjgOJP+X z+_lcx5f>>uhnUpG>=L&hvW-#~xf9~+|s7ZgIq#Q$1&cFYe}TNHg!TG?`b&l{*5%C#N!%C{?q9EdRdYP9V5#9 znY#V+_w@@*VC>01qXlPWABgS2*Rb4ek>p5M%1H-;uVYgLOtT*tD+DI`9Z#;O8N6Ze z)5Sjx78}w^okRui$DtC3pQ|eye^j2Tq!v4K_zpv$qXXoe%j>hl6nw6IJopJ_*h*Qw zrJZ`_TE#KGz%L;V;RstZta?x$gN{D22)d;W=;$yR?Ols@2QQ^k2@Lmh^l}iEy#->z z{tO|D1yAfOWS4J(3X;@?0H5RZ$^jaZo%+c3ay?SMc^4x1X{C8O=;X-}rdd1U{nOSi z`ksg29SkY^QgO@3K@yFtBVUJxCilx%7+6*Cpmt1`YXkDT_JGeSB(uHNrr`TmKtxzZ z*~^y`a7Mt06~jb;m4c(A;4Qog8@WcLL~w%*x&*NGXk`dr2M8x<;A@{Bq0 zt1D#>k>vnvP>p`+>PYmp3@O<;dQ_G?-WI`e0hxGm-!QHN2Zs-76Pd{m{n0xm55F}J z0#)4DENO6;HkQIL6&@yr-W;PhvW8MT>8D{HOU>I+zB!mb@Y(TRNV@gt$K!N5u`oA9 z&sCP{+*m(3E2b%*+uY^4w~8`uGd1l%WDbX3`lOub?RA|MN6N#K z3#8+Z>o_rgs#$HSzj_AfN=3STr4Q=e3D_Qb$g@L;nfi$`=KJX zAoSHVowe?$uMJ2MF8)jTnEs#4>GFGM2u3+$)J-y%!C%%rC||9$FhbnggsnXDe`J0p zg=MdwmY^g zWfQl}NK^N18Y+dn-%r2WRd@f)5h=Geonf|5`@0SM{@81}e>o_!SPe>X)=kwsMq?I+ zi#5Fm-nMv4sL{&?A`w>+C{z33%1z`q;MvezDSvRp37pfGQ)*S>0-FvxD%*bbqO83v zpV6}pKhBkP1&z?hV^jvQqX*kJOW*+TA__~0%V#X8Z1ISRbsYAbBa{j9Z&0^EYw_9@ z^o@vwzFr0%ryy7LHv)h=<2Zuds~6HN4(<{86&^~GAzwQGf;SI%+U z@gb7;%N?6E7eBONvvV82x=utFSCRBuDVOIayFD4s(2FB$T5I7FmO zX?vtapY@x^>b6ZXj;=_OwUC1m*0aRne;o@EcVQ7+~5hP-1KbD1k^aq+i| z8JvyYHINg`>F{%yL#Uoz?=eeOfizxI%`E>vs@^-C%|8754~mweT6-6@M~zUe)%HeF zd&jO(5~E7&*+CntD6Lqjy&^SYkJ?nJmBikoXb^kf&vk#F=Q)1Q?~hB49LJUXlgsCG ze$Mm#e!muia=NDB3a@1jgj&HTQA>=4bI-_ng<6MBisKqX>kq)YYCV)mUcxV)t>EGo zLp7GBf zHm@Uq2)W}~3dDM-%xl4Fg97-Js`8;c{rXe*c`OTY4^aIk?}Dd&?XoK7JgXekn(Q8x z|Fqj^Ksi)}HZWzxMjVzt&|mG==Jb6#`YB!cDXL6nIS%Ix{iOX|V@O6XC930hvWRb(`rC}2XQ@`giUlix z+MJ(K*fv&PmmlDECvx2mtmxDx{ln@e@JU*pY%eD+oNd5e{JSPbVO&{JLW4k!IPbOH zO|8JPJDVx-q^`CKo_Nz#i+m70>;{F}mfh>gxhwFByy8!|NMoJLwNK)I^mG@QSa09{ znID2cwNZMG%aP~pq8OCxNX}K7OqGMsjoS)&_jgjv59dL>`PDC;FHbd0b6fevqG>y@eu-=^U4_@0XdsIhEG#-Y6D|lU*z8XcA)eVx1}+ap1%2(Xi-~vWo=^_JQCd(JgeKrW zz0O2jOQ$E;yiG9<0y1EGf&#kAz{x{ey^rmbP_wkQj_MCi--jG`NlLDax%?p7D`|61 zz^ptHfj;Q?9AoCJRgac3%~XSW5&E?~?M~XVLEKBBCfcq?)#~ik3|~oRlNvTIv&bUh zpKgqlGmp_TApnOR*~^jU(;fU50Ra+nGEb`R(pDn_$S)IPrY%O_=`{R&(OlM(Q*GOW zeZ3d^dJ+?K@-m3&XK@!#DzVWu>*cFFKau(OtlWveVQQ0Jd+Z<)Wcrn&5SVVQxr|rzd7mZy~l` zGx;B78Rz)X6EKi<-_XS8`4cLnEr%G++sp<2n%XI9*L$IXZL@G0O<-XVsh z$ILluA2lVO{uw9pXNYbTbMpAFPD6YTy5y%HNU|+&7=4QXv!`fCahr=5CPg zcSr+luLFO7n)>Svz*cG@@9Ybte_k(fnrlAoLAm}-f?#GfexK)-49e5cGe?N!5*|k+ zg7ue9Im@EdS%lIVW{pmbHT(vKY4Yog0(^{Sps#>F+kgg&K1y0}N@-BQP8a{(6aGhS zJs0-{Pdxe;RBk^6^sX=7wnzkQ&l+smtP(y*b~^onz+16QZ|}CF=rir=oD5(+jtSx) z#+$8}5t;QDTkNg;os;;;M`h=16`Ybrkm*k7BxJ!$RY2qIenmJ|>xzY6=6o4|&OjbU z2mWS?a1-G|?)53Zu8v^c(yu4^5`QK~aDWb($G@D{)}nMbVES=k01H}1f-b03}r_3H|-l6qf)skQ+8~ zsC2NCe_2xY3R>W^Z?1cLX0)dW%|grVm9r!i!wdFnjEKv+eoC@)X^44h&Q}lb{RQMW zXR-GD3lh0p-?G)i#4~?a+_!%;u|;=-SEeG?fJDK<3+7XetS0egoRpqH$)C`}`uuWk zMb$~#`sY-Li=0-g^I%Y0Ji5|@cId@0x1mxw`$z7cg{k@d+VPr1^gpVn{d-AC0as`?jiAG#ZM_bpr2u}<8 zs-M2yu!PjO*v3PK3neCm-dx8{=nVO6L4wInDa{F$O{5Zeb|s3rsEpU4UE_R?Z5-A7 zOJ&=XCx@tiK3CSsf5zn-i=0F~wQd`&ACz7luN-!5QgO=gXYNv;v&;K^T=F>>o8eV; zK`FohjnPU8`%rSsJq{`pl7X1Nj&s1f+oT|{UenMnpPV}mw>S1k6NGkNPRXMIH6HBQ zjpe>(qRLftE8EFx;U@w$57tTb<%@sNhh;~5o&rLpHd?DQ4~|O~nV-`QxIZ*+Dcgp0 z)m?FnV|_D?DPFLg29KYYX409vk^4bYojY(YB`lHBkp6v|gPoXwds2DpT!ha*CO!cv zPaOL$;}Hd~wd$d#gZ=g;3JiZ0i-%JtII;ZN}9X$75Fl0<9QizakP?h;|n~(-I zdQPBT_5RuVE=Cua@`1ARMyo57$=n4}2)n4fcASgRvGrcT+;Xk>^u3c1&x!EV^nl%2 z&h5m}tjN8BdY8i@^vD6`X+-p>=;94#-V5=M5%uGi^w(_}C&rfRXYoy)yKA1!Kv?na zTIg=M$agM-%!akB^)@rFdYssa z&@u1k^nN~-Jb`oYA^u>xk6oY6BZtba_&;GI@5S9?*zdG)vNqJozyO(`lLb8Fk93{{ zgK##sPceGug~x{}R0HB{PF6wY$06!EHWpLu#RsGu`z{%L_!l%Ow$+f{Ef|6I5AdC;EnrNGAkIq2wbu$CGwo z`dF9OsT>!j7mRrysuJWwQ+I$-*+q{t{)(FL$9z*}g~PaW_teB3UUNiesKgdSH$r*h zMk}BOOxicAq<-;0BW^qi{Q(^Ig30Sry_9;H4WW0fOG=~^+3u@|bC2u=<_mawD;{6E zzgh4)F7I+>`WN&-+Qe9{psHT*X12JVv$+vs6)nxchJN7H@`rqO_gBRGAYf`%llQ7Z zy@I&DZ(ao!clfC(r_RG!VwC~Q$vDyTQ{^E!j`E=hd<*L3kcgQ+ zA3MZwWD#?JVAU^euTvDgR=X;{p46Wh4~H{Cx%Gu(^_V(?l-h#XzW(>o$r&KNza>7% zAhFq{c#?WzTjmN!nG>c(TGmgJSx-FwYbK6KM21?C`}{XXTm3c9hJEIBGu-cOX4qLB zLl;qhs~lj8ZC+Q?f-_73LJa>IKzkhJbFTBx4RT&AtMdn(XR`<%YX2%=!SRIAZiiy)4+VM$KKn0YGWRXuA<7qk~P!M&?3aPQ7wb z%X(SYeUx7Rnecw=%k6eQ3m;}Djd_`CDeAmW-L90A{{^up7mZ`n*BoOoV#9|Nu!r%u znXqPMx8Bi6`L*#1H1S&0RwAxd*q}(}sVG&Gbn>y@59I~IhYR&lS8MzPgAQmz^6K92 zAjPxMpo*Q&aIv%v3u)x8B!7>aB@0yxZRf*}bxDs=^v7NM1M*gMQ}w@vmfamfEUe&u zbqWotsaeoUd5;@^-6(#8C10$~tvd!+JC*1unip+Nz32}~E!sGOF_@@x;2*yGu)tC= zuk$bHdA#q2UC6o?=Ps;j_>hddHLRE-_*g5p-_^rUW$Q<)@aBkBbCSjoSqpO%-c6e{NiD1?x|W#KYCAQm)7f|9R&Zv7VSUs z2&Ek@88s;rhTB*!92#?f-qxGMe7VqYJ+`0^S{ar@SR&mS!eQP9-_@kFHq1Q^!dl9p zqn!f+h-bJ4&hoyTqA>+57`I@?#FLvTjLZAJwupq*kWvx860NYT^-NlGdTMFQ?vxp`(GEv%LXNEc~1QT&u~6yRf` zXm8x5!c5Jx0Ru-nhZ4p!4t2PH*5kNqAa{r{_Jg7=zJmcZ~gjV1uzIWThzWIc{VK0>kRObc-{7TE(oR8l#O-VCz!P6 z8%qvo9{aJDFzQA7Tlc!IE51aSGr|nV{8yGLSL1qK!K&-yY_xg-rmT4Z8|m3i_YCjg z-;KcyzMp!kUxw>}T<4#e={efk`Vx?n<5Y$Oxu8xCPzF)UJ-@1T`jyfpOjZ|Ns)aSj zHj_IJf`Tb*Z%9mM<5sSe8)Z&`dUCcqoUW3cXlGBNSzk?|ic~h~CY%?9``X+bb=6eb z*|L>JNT~&`oD=B4$2-;&})$FRSrJB0UQrCojawl7yN|I_`Z%yXyLD6O1Kp*p`_qZ?q z+t7+cz64{%fMPi9(S(l`i{en-)2(N3%WfpQ%}N%JOBW-zjC=XEEN%yfE^6bB549jo z{ffxXQfFty#KKiKBbeZ(PW$a*9>N3+FZ%gHpyT1(oT^ut?WB`5`A zs5`j0=cr7Q#9?+NU=w$=;9C5f*HCmK4^ZB{PZd6nR|>zU_S#_CF5oBvEj;D zZV&p~F=~KL2EWRA`EtvWM}qWza5Y2JgS4d)xezWC*f=z!Q=EATTT5gO9N`F<$hXKl znRIPLKA9BQvJ+p5e{kCS_BrKuQrLiwa;*bwy!p;@mbuCs?U{-&@t>j6`KS9L;>e>N zniHip(+(5HKf&}xs+EEvAH86cp~9%tkCq9zt`q8ZS88+TWiau~6A76r1_G#Mm%1bZ z!HM9~Xl3)Y0-riQb8#8}{A;ohq79`fHv!C*|t6PdY@stT=&K5)Ucid^ZWh;hZ?-EhfW= z=vE~lG9fnY(PzL@bP&*qVJuh?QCvrW4)9)w*G6BU$*Z0wnK{499Oln^?u)Nd)?i47 zu3@LB=nOYUwrd>cB2^4sUn}m^U{?QdAsiPvOg0)+X#v6RX z=`1mMHf*)KhI;SaKNWsl0G*g+8|M{GT(tj3?QeGo9G+I|@p7(FPx{C#HT7{F^oFXF zt!*CHllfEw9*lgP48@h%VRz!+PstA0rYo~H_j7@1A+?cdH675Y^grW8+N{U7!_9zZ z0yh+%ecvcXHT4g^t(vYN`$kl>N?FnH)g6eNF?q2C&-nFi`RT+O_aAjWm*SsrW-N zP&`aWuZuiPkB5JFC3^Eo9(n!wd32SB41c7;+AWD7LrU3>l^fAh?TC|E5ZNGX!-trp zjiNsiO0y=n@OcFLhy#}ms`?u>lM(Go76X^+tHmZZtilC%n_2HDnXPZA^JocwEN~|a z!v)WGk^iHTAPQumFFK`}{Si;COp1FSK?B;jJ3a;bF4r9#{^{+xqRLOgS9kwMh30&O ze5+r4V@C(4zyK~BPy%_E=->K8T@b{D{9I>pYb6^t(JIO||I6u(ubucB|4eqs7zIqv zq_H;dM|qZlhJy@5`mTQP7)9C0Vb6CXEXf?s%QYj*Y^C>V&~LVsCG~3x(!q8d8-!uo zc|BSFQPTWrvRJSPIjY+1kC^kjmr=%}#VGYWX8wc1u`dM_TugxdODmnI-2|3+a#&(Y zgdkGCCOvaPI@I)J!2jvVlT^PWhjVWwDj~lPCJlltafZAgPp32n?P znONYcbQ%wbbbOT6@RfTS{ot^`K~6f_lptLa-vGwVRp2&k3TvjFpz6LBUovj6m&(|A ze&SlHJ`9hU=723_PUx zF~P*Qb|FA{&*^FWu$@=W`T4E-&uZ&*xor3E6K`e^!+QocJ_iLxH3#{3Stdj_Y_1x- zGfB30X2`mo=Zilp27h`G#0txnfi(JZ(L==tWQ86ugOOiJN$P_)?oFkGqe?e*zD0t+ z72AaWjSQ+#G?W&cKwbAL*U#@A#w&bVNKH{PjG*~jlVMzXgSkMZJ~bF%`T~!!G9Uh@ z4gh4|*V7+*Cdl`Vs`W?X?g!i*PB|L`L@RyoN=?bF`GZo5wP&{Y$0>;Hr9Z{IDt>eK zc5S9i6W{eP6!@^x3d-JE0Cb<`XEnn%KB3}U*RlN zcJ>eZv3<n#y&? zxk&JK#YohTa@|x}MP`9#A;>rGwFpp2;M<=90Z*nERee{8Q)8P7i*%M9ZQA>HZSAL42Tu-yn zVjiqM3b8Jc>$bw*gkc7(3|JRxX=^6D)!|{{~zBCb&fN5;mj?ut8by6#1H*kCN+U|9pbD# ztoAN-ULl6m$rpNf+Mq~q(Wv5sAhFTFE?reE|zH$VAL3u?0r;N z&Ed7F3H@h6vv^PmiG+NmgTnlZWD3D#j&YqyMqrhC75Ab7itke*xl!>@xIplz;ob3c zrYRBHguZ;CWCZ1_f_wm|`1&BffLnxv1=u5NYHo^Z8EGgYK^dQ zv=NzWjob{Duprj89`Q7f?Paj5=&!Jcz#06>32$#SE|2PYIQW3!?M1j$p1SjIfclu7 zg6_YG@U`n-;AO4qXOm6{b7MR*$&+ z;nis?_Ni*gXsDC#5%cur$lSM#E&{;-YxZAvjCYqPb#QRcVjHnl-pXp-)gA{!4u069 zydpH(TuY&zO9wjAb7;SRL9*I_{)iT~aBgizF~IynkAIXW3ICdL@k}jB>TAiT2N;dv zP?6eFTGvK%grI$@kKySrbo)}ivm(CaCL43S*R(4y1lOALIuox<*BHu^j-p@I>U`3s zQ>jWpGL!ee?4uYhA0*60vTKm1aE+3?*r0vFMc%PnZ`sy_i6@c#teLR)S=$ZvMR>4t zV!Pr)p?9Q&jCSl&cxRbF9X0XBp7QvOXVlU%jDKN0SJKv}Y1Iz?7`OMnK$=kMg)vsr zQ+l-KiJG#isP$=Zc@b}~jRbFSi^bAm!k~^*;u3iEdj;EDh#&a{uLzn`Zr|M5gVMgz zd(Keq^*9N_cu+oVGFp>&UPI;rbve)d21$z7x?AY;*Pe|5t}tj=|$y| z8wQpJ!Bme|$BXkkpI4gTr85fT`RU$#ahNvmF5|)RRYM(&O?QmV3aY){Wa1?eX_Wjw z;NSGOQ{jH2ml~Fd8mi+rf04&yEBszR8oB%exa&-=9~A!ONo_c~_D5$lEc)K&!09lR zP6wM`aS`@Zn;Fgb=Fah#{bJX~TAJ5CfqCmH=8Lx%EUR@89*kbiU0<^ws=qWbt!3{7 zu(MoOCG>|*K$=wlU}`)3L3glzNrg4hu_fZ+o;SC>)+>8=>O{yjSfJL@wc0wGY{#tx z>_JTDJPV!9gHBandj_jHP8h1aaxlc8)1E6V`B_v7F94HlE1W7Ar|G0d#2St@WBZu< zPFQ+ZIP$GmKRjKI^$Z&U0-Fm7AdJh5&R$jZjXuaUIj@HQBC$HFIE zPHuN>CQo|Bq9@Z6PVz{FPyz9B=i3@~B+AUXlJ}CQI0pI!Rk9u1Odo;Lv~Km0m4`*| zq?oPxUWjwx`_UB&b?A`n^0c18n1LL0;8ksh_}cUsoB}LK3@8>5YEq*qF{j$#`>L*%_bdLvtf6lnMQ@s|iZ)h=pXQ5PT&|uAUb7ckj$m;$pvFGSf zyd9b=SuZIY>#MD0N*R?;Rhz_C*QoC^7%U$mCBX#8DAhTwi?(msX1yN>`+SoFg!awP zdwO>Vxri<9E{{n#obP{iZuKhYsKVZAc&+utlkBi!^602ivEH{^HU?dTKISZ){uQNq zLY`8y=}~M)7{-(MQsv}E=iO&0dTQfl#ky-eFz?RB@U?4+qYZ4%YHsY9C%a<|l6oMo zu&-JSI=|}AyZq7p_A=&@9r2TeQOqSAnd3dBY@g3uR3jaAYCf0Yqv!!_{IFq-v9mD; z$aWkL6@53%_rg7+*vUx#-5vGbYR^LX>{L#LWj(LYpe0}J=ebcfVN5@PZPDxVlnBZi zI7jMtemBx!vXo#l(qN&bhd?xniXaj)EZKR&NZZ^@CP@~uX?HZ6^7v;X2ma~A0;VIT z*_s~^kph6w+T`f~E8X4x?kQxS!9@_}G|R9Mmt8n6VLVjqOyo#fEeTh}{@o3%62h|k zjJ7`6)khtj({CQY5}EYqFgJq@wYQK(aeVK!=di0+a-^=?;!%7XcGgS3d1pG%F^+at ze6Cuquw(Pjf3dkXd;}b5iugB4XHOTtb_It9@^*-q1}P*^ z`i9f?9)(71Bj&z5N-R)+pKS0&(A>5w@Y^k!A!t+BvI+Q~e?fuc z{WtT1j`dv1JTt%m8qu{%==>m(=qK067gl;OA6y;!AV8BU#5{hRxtJ_=G%Zix)C3s@`#n`_b2ocMHZkroK{pBFjCm;xg<(E}9K zm^GSCQzB% zDBiz_n8Fpoh#~*%`4utj+z(M`X0+Nm*08DbNJ4<7tG!_Qw_l5kjl}^N2Sdt&5-6jI z*03SP<|Xnq1N1k*1O&!+aQdQvg{B;-Q|fw5S?Kk-u(*i#p-y?59ito8b1n1jYD`XJ zL?f#hp2BkW1IQFeHX>C)S01_tKk4@xI3@rhxF8bpp2>dPr5oc`>vNq~Py;D0-_h2v zrjwC3&m!>EQmP8NZ$B~sU~}y|ZY`DwmhGRax`Y9_ipMZ`Y| z7j%c=9ZwlZnE37HF#q0<8ETOHImKqcG6^{Avp`|#irtd3QlX?%nj*y>&xbrI6%jNi zo8ByT+JLfZs-z!dTWgRx58U|Hhcwh3v0AmhTRwTE0ugzT9-(t8r1xUAZ8a|(P61`5 z13mzWR4uAMIrknCvbkbT3?l9NR+(XtS7S0tQhL%;y!iZ=&9f zXQ2A`ghamSv3PPuU~f#0RM=KFgUbLxWR{K51(Llt zBOvZzrjPY2!<5gf!JckYpVMUTQuD^Y>}6vX0ZdhgyT?m1wQjfq0Gh5FDBW8*_mpj4 zt~)%!y)kd{SH27v0dvB-bZ4ptI?6i~sXBW#tXsTC?`wIM3?d(wu1Do_tH5ev zyYA0vWo<@qe5voN;AF1|u*|@E&)MFMOR@rE>bSjc<|P67rwnHQNgkC40oi6`EIu$rWRW+qtVj zXBNoN$Ggt7FmW*eUwAN0G?G8jw`Rkzo}?`Q8D$rsmy3g=7_vjv=O@m_P^VTAJ&ilG zCkx$`x>wjWyZd;J)s^IRiIBC1LA5T~$FJ`90-FEYi#tnhJM6Nj821q%XX!B)p%W-H zJKF`F8+ax$`JoJ?8$xv&?s8)#C@uG;GM~3L_}E*zKVUFZ{EOzdcVl!`iI}c{Oddc$ z(BK{o8k8)Z zhJ0L$2qTK{wUnb^QQp{`G~}EODSI8oaFc}pb`+mRQKZx@!anxE-;$+ z&L$_o!BSa?d*t(K2*GQ37F@L$gn3rI%bZoxcf;E7#A_I3TV^O9Xf~7+@hacr!5MOO zNBK^WkBk%h){eb?U5w|g1^#iZ&LbEejPf{L*V~0J6;sKI`|9pyjR$}}tH7o>b*p0| zW1m~=`gwf7mw0G*_bxW%zoRQGojFl8Uv>uq-cRpoGMVJ>nO@@Zf9%~m@!!`@i(9Id z4Cjo0dmRujR6l9!5DlOB@PH|DQQ*X@^al|-f!z((U^BjsJ_VBpOKKhUdcBF1%iHy! zBdDcX0karYN@IW00pKgq8KuV-DJP`mA9sTS=eyz+I3HO(NtjC|9e3H5!G%;{o0vF` zJgsZJ0nn4W-m{V9)1HVA!_*Jkwqo#2ZS>E~?~6x{_Sb(6z&sxLwwFg0`A{KcRjK?u zdbvPn^r8q^CcX`Eb9;x>8~4$i`W9=DZ=|dK)ffZOfs?Z!XWhr+A3yhGGJ1UXxuXG? z6HM_Gg7PZNxqGoGgn9uqV!_2^BDn~E<~InD+;)dtglHV_7W98FLmz$f_KoMckrD!4 zL}QU+ryY|rLyFo_lUNfsP$3bhxX3;m7o&#Bdyh+h$zF4SqC8AJWr*tOf9#lXYJnxl zLvc=fBCQ8}sWoEQdrG`uotb!b3;($Tl|5cAkVWc!7x2%#D25xStT56yNzIPQZ#D~J z!cRT`FHap*dU?F~lpw8NxhDuXc-fn=TzCd#(tdWy?kIJv>Tjr)VZaX zw)LtTICOV7FV4RaIa%@3#Zu++HvQxR>xLb6n4u&tGeXcYHa zk1pTVw$rA9W)hL1alVF1ee(DDU5hi2A*Ro}%#F#CHLokJBRZOFtIW3)9+$_iawalG z`(?9vf7wOH;$~*>)X_5u;<=5s9g*U>L?dGpCI>QOWAfRy*>dkYTCEfZ=nvLxr5sB! zk(Z)TJtxj=hm>c)!hLY)G2IhZ_N(UY$|f*>OYxdUr);RxG^n_5J~9z=i338u1hrPX zeeL99!s2pt{)|*w+1-m7`ksuweqym4mbg>M7XaQjI|z|t3n2hrJ1!6ZnqD64UikNH z+hv+zXYpeV`)XqMOUx{@|KKST8P+S{fm8rFa= z+?5}k%nGq5O4=N2@4!lpAU=Ku)QFUQhg*eL%Hi^Bxb^UIV8LfxPBK9KLktmzL!I;l z;6mvLI0gIu*%&U-SAz-v->=3@9X&gwMi9k_m~1{!}okie%y%9SbM2%Y!yu zr1TWw&uBFi$u$1=MPUFL8^dJJM$uWlGwEao(kVwmJtZ@wcdqxg1gphd z33G|ahGX}Cq{lpkumoq0e4o?sMmMY)eeYNxHX)9u(R{+W|P4vx!x=YN4vQfyl9^^7R%CB3 z75;Nn81te=VSTj7jlu_!Zc3Btv@=yKVIDmp{*u|+9G{~1ZnZMX97|hJ`yo4ZrB#)5 zKS2}}3P(veU#OpC)^72a0|^$r%ZVRu+uPLN_Q`>a00xU2Qi7kvQvjjB;j*sJtLcwh z`t43`n^Y%zuc6kq5`EKUQlqSi+%=TqY2w65P zNr8hV2qmYKS5E4@#_kb}l)q?hwzR;!pA#s%em=DrkTch;4^W3KaeITW zcA7N%&zmb&k*s=Zcx3<{=1$gGS2 zv}K;9lO0R0;0q)qDy%OB-zlVps}4K}4? z*BQ;m-W(J#|AV#Hc{%ae>oZ*@>5V4w$y5W;R@_SHp@}i>bzrIWEhi1=jBCO9jbQxw zLyWp;==Vo7&t26fLA)qqmOrP%$ zN|D4F|61>%2W0`rx-Z#XRm6L*?gpMcdaz&Eqk88QXhD+S_HBs zaVa8>3N`vZMF~US=vv?Cx-|&0A9kAN!#o~q!_h4H1^QQITEHBp9hu1dvKhd(Q~7gj z9OZv0viz?y<-j2os*5(>GhA>u3*l}%Cs*k9NsNtouCL8kW#(BMNfGMYg zn#ZGbSR^iRtLIpA`A(Xe77;RP`SQX9N~ujMjUPN#6)%=A0eUEh zns%rFkb?2wO8er^#aiVBPv_tNd9!utSZ;LhhSH!}a(Rn+_~COWF;P}b!E-uU?{t`w z2c;fP^EBWNqH$o*q;cr4X;j|gl^`?DhTJqv{PS?)j{0#$&*Mhkj!2P&n#<-mj81_yw4bn^R!br@(|m^sEF3}Um*#EAc|9K3g z+(l57vznVaB4j`lIT?|xF{}Om-SdC%1zy=u7e{-ykPa09Uo-E zxiYES$VI~4@@4VK%U(TNJ}Do&fkid;&cNb=2GzqoTt=d|JSqz*{OqJ3sCVMtYtH2#Hw&q_~w*?=>BlJM&i)^`|hIQMK` z!5t-sjkkl9WJqS>bVJmX>UazwpR9x8o6t73ap?QJbYE%5z|cpA%}a$bG}wC}{t}|W z-o}N`1{JqrXO%-Q~3%95& zDzwJB>45=*J}=n%{K<%Qx{OA&;!nvqp(O%bk&!{#!5an6^p>-hk+(F%@em-J)u|-zFTu{e9cQVZv5|KPA(t4A~}kw z4E-O#{|V^-y#)LU$1(~OB56DyX8a#{!T*sNh>aS*Rj1WOdI9PY3Lt7w6j)V_DRk8t zVs~7N#CTANEe5QHBDCbabp?;Sp#E{h;-lfmJo7rQ3Z^xusDwln#%f1uBk$JR&vL9* zs1elgjZLYS0~Vq_R}EKK0j&+{ch;9w(#INJ`mcK$cBpE%*c$$d=cNb8bidHf5}pMc z)Z0_33{+Ct0xioA8A()`p8JGX2bF=r3X zEa>tSCVTNseX1cogZJgEV@e(u7cMX`HV2n%XwF5&h8P%iNVsn*69uUN4Tiop8I0I z*k+*RL1nitm!G@FqhVHSRcKWc2)->iQl3~nipJ=ak@a)EKuha@KEat~k>Bj%6j`||iRG{_t$nM~ZxBfoC~Q?LK628m8VQgN2J*U)@R7-aH9`B>eS1Uh`n zG@||^wXyHtvj9ALRE$2Ldpb(b9ks^es3!rcZ{(^bk}AM^?}Hvt}^Tit}O|D+4g)rIqgDzw%m{`yESlYO|* zDmvy}9&m%{@Iao79*t3%8QkY`t!8ocKf@aj2rUDAc@ernd8)xu+#jbEjuPje6KI#7 zk>}TF+&5+PA#f0l*guB8&+Tgd4quxe`s{4tyP;1N$=#Tip#jq4WNzn%RqsZ8EE?N3 zp;xD>fA3+QmUCZ|DpIxU1h!n)lprX}JJb@bl(sZ$ue=NU8^}`hLY9<$P)$?)QCsRm;$8OKtlAO-<~ z^v0t4ZwQS_ws*ppyQ+c=GDGfni^K&qR+ z+*9Uf`ZIsxp8lE&9-H#1V_%D6_7+TP-FGeiYMPm3E+r_L4Q+KJ3;hbD1nI6672JCU z6h*C&Gvjv@1(Hk*#lSYs^xx8?6l^?7|JgOF3nHp$?D{6g*sCzDP|oB#4J2KI>4(?f zF}6E#CdH^Xvib1*qW)v|&;QTH{=W-?_|Xh~pxF%)t=aVa|E+ew*WafR$<2xs4KOw` zrYP~%24vj4!P#71#d%6ZW6T_iwtUjYA6UtXR*OV_LvL`_#$$!%p$g}Q*FxN;jXjU@ zys;oNKr3sC>$i2VQNuUUe*2KYUq799l_ZSMce`ZWg?U!RUXIw>5icwl7PWs`b@^WK zH*N(r|3+2{T7RhDvZ}gy2U4xDTHgN<3wrvPeM?7E#;NLw@ApiiS$n` zXr$;yocRJk7z9ozWD3NOvE+ zD!+7R$@&*0F=)ucNlKfC=QsO3QJ13@BArOr}DM<izyXI<_b{&{fxJZd~O16!C)&I(?yr^JemlZvX-q$8Y=6iD69i&P|<8wi>Y~_bTR` zuKQdqmX)0=Z|UJBfLt9q3TvKM()`;?Ux=R)Pu;}vHGqk#$TWvCm-o2aV>r%mEBP5KLf<$K36c65paK(XWx>v&yWb@&_8pUg0$~y=}G|lN)A~AMJ1%-%gGQCh@*}f@j$O z#oSwmHU0m6-=mcfQBcXLG$Vz9(u%Z%G$W;9bO?+#5GNrmLqh2o1L^MW+N33wX5`54 z{rUdlJb(9foyT$Ce_hA*$9QjSpX~q+-tl@ppO2@HL3yWlX1FP!Hc6vNR}#NU93-^$ z--!#X-86sC^78lFGn~{?k2Ty73d97IfeSZG~XjgAIR-4Gc@ zoMLq9-Z1BB=OM`>43uBZ7n|&Ga}^2v3TDt+HDEuu7fF7R&olmxn);{+`zQAY`>nq~ z9?g99u45~~>p%!#ygbvg6-JEe%Xm$p9d<3GmL8Cecu&Oox#@ht(`THtX2#*Zlw@Ny zGh5XyaSCp~<}?zn*6~-1#oLDM5>*?%S+s=fnabkhwlQL2wYx88pB)$bQZwa2moV-; z3eR^R%wZF4C>rgVOZ^5PYwha4nqqp;WXWf{u7^(bBGxc7Pkdkl%;qG(Y##cr8;XgN zCrhl4E=tL9dp<>;jCASqS6$JhL688wu36br(DpR2e*DK;@gS4zdumieH$|&mwimmm}Yfj&s8@y23#PsWNwphb%cvhyl=Xqq43TR%@y?m>~hu3N0 zqsln4LzCsZW}VV#bXm{*1?nC-!vz3NlJ3kBqF|HQqmmOv7p&E1ni`9FCZ`D;)qx)5 z1r^naqDi$?Z6Pod8@+FI4C^CI3-onQ7ZAkF%IS7tO^s~C4xXfSBw=wpqL(JuYJXnbI^|n?tqpzhvP>9<(??9mh zaA`DlKKY!tnLroAz2YZOnUS&nymba6t}K>AvOA7-Hkyhoo4iv^JTgu=whw;Zir3?qtc~wz z_S^4X?(q$$ysEy`v%UgB5=_=!^#@ln&&m3U5n*#Wzq;&qy}csl8$Mpq4y(Kw%+RUm zxmxR#F~nUk2zt%l;cpsAIaH4)jbnk>VIijBOgf8nh#XEQ;r` zY^-vS$jxQa!U?`;`+ljS>4!Dv`uVNBEts2onD;w}H6x|3Vw?_XL}73PquCJ(eTMR# zUKWG*jkUI2BF4vc*`D{G6pe0>uxOL}MsUGRp2&z;a9!Bo??rDcN+58f^Rjs2nV)?U zmfM&QvZ8)50~6d*XBjX`>G&?DnCTsk)*X2IkMoJ`XDga*bmc>I64r+c*7!=(r+NNiPRc_3L9yx zruNk)?Rq@NQlzT2Mx2!k`6xF?8XH_X41=I1jlDL`_2)_82-_ki_ zdl`=~=quKXXQfT$F@rWwSO*_!T_?ovmFr_kBT8#2Mo{~ZkSSl?x;jDZKFc}klDrOE z!5cdJkRxXIrM*v<%ECjX5GK+<8TdKx+4ZNB2&+a_@>SbM{b2=MU&ajI(hPTi(SKShJ?Pp6S6-n zr;q+5_g?(YmMAfhnF-)Wrm26gt?1{M+@DFdz0d%8+$P+8QCL!Lx-5X0$6_^pR#BNh+Y=83X7x@?aU0lHH}K zxHR}`R|p*EUkr!xPi5Mhxp~{P4m!4V7Twl*9}Wq|$|mfHKAQ@D1*7yUbT7dI*4I#= zI`FSmF>{3IZxadVk;C`TBg9OOVin`^WSr111$n$ZgCP1TDcw3<#;`6PqKf}43`PB; z^bWiU`MO4q)Bm<8{?{U@pOX!P{o|4TuBQHzY*=6jB9tp~qHmITq86|fG{4g2T`CgL zV73e87m&;X%2SX9%nnn{r<}h)D)F0Uoq#r5*=fl&?ELvx-vW|d4f2K8=^rj*VTiyc z#cpXGKUZK+A-9E8{gCXlK4^2ovGMD(O6Jkhx0;yOntU>X8hvD@u?W11lHUi`g4Wj) zTb0a0&{QJg316x@QQgC(RE`iqN9wg~GFPB897Jw$XbFjIFslYf0m`w@r)s=mXt{xj zPTh1xl|Ioy0b%L@JtRWsr3$s%J?fv$W3^x^5i|Li$mwyAIUPp-_6`Ak}) z>NOD^vF{AMODR^;JxY8s&%{Nlow6SmUvY=eA(PgUa2?vFed5*7-|0N621?T%EI7HG z4KLU{uOoBxq=pGw85?Gi_ht>pA7ro?Qj*4)O_$p#oR_UNyCs zJR_4uiwor(`71{77V>AzqF|JrFF)1a)%Z zi7_jmDEd{E;qAIr>ujFhYwez6__J`kgiS-%w3gfL5ECWs2&b#;npsNxb9T}^5i!U6QT4B)nB}Xc%9J-Fl20JntM{)T$=9S$=tS?;_vrX0bDZ38{4l zy!aU4X#`x+NlA&5-Uq)|6F?_lk8$dZ?-*FdeyJW7p(e^@&;RgroO|s#^VOTA->Tzi zL%Q$3|3H}L*IY&Fig)6)8d0EVxVPovI!AQk*EiwKm{5g0RHBj|>S;tACEbb%Jk0-}?JJ zn2Sf92z{F8pDn2e46qu(Tl2HPd4W=7aqa;$c$&Q~t1`kMlI~SL@oKTXJG%ez8QW2! zQ$5@YSH%~K{jf8>!83zQU>W&Gr&=8a^kNQe#>jIr$!3Eb_0rl=E_|23!l8ras_UE<9V4RCmFjX_UYjE*$IrdHJrfIX7x) zV@aX54Aoj)o{*8s74|(l$<5<|^^k^xk>je72Q2CJgR)py)tURfU)m!4+wPgxsL^nm zM1jVd7u5Q#*8sJkQq#|Zq^K`B#HgQSfE)!ltk8pWpv(n4pzJ~Bg6t9Eoo}cVl#=UO zD7lkc%C?5xoT~f{f%FL=CU0&cHJ|8IwjyB`#X~d&9G-ZHPJyp{iXMLtJXA4*?79w_ zg7kLb>l&HQDmnjKe*pY-_5V?=1I|bPD6#R4jR^?+^WJzt#Re$FN#2RxT89#pqM^ZT zRa8*GkWbuKslrrL6jjON1md=M^azq#Q||WUs&Xu;xcBZOkxmHFiG8@WKyDYsiK23T zhkEjf~CML7l&LVPjqe1W=UU1DW%}Ph+p2 zywnq2cB8(Km=JKKn|>tsi>oP_;FhOlPwljPk6}*X*E!vrG5{$QI!W+$aK73F;JPLT z%>IQZj|&1_PF(r8;eKbOnb)Mdj&kPbD|(^VZWG?? z)?mL|EYTDB^=Ki&l?046mPmCcbmbNwR__3M9H-|3`mnijZ0cn#bsDo6Vb?&nTMRT@ z4i%a*uMn7cJj6Gmos|Q!;mi)tjh;NA#(wF}Q7OCghlhk~e=g}Zav92%#wF!to(N4< zsp-@Xxxqgi2N*~s)E(2pw{ZH7u0vT+wBuqz%;)AD2d(5|eptT?L%gZ1%X zQ~f6up0kl7#6U5-Sb?pVnm$z&#U^%F$vUe-iQAWV|xdK(C_rZJ%Yl zpaiWN3uen9^1{0ooA66@A!S(-AnSEqnY#A7YM@nSWsU&x8l`EMXdag zA{qNZ{nF&&rvOR&&EeCV8O5^2+g$-4NRo)KS;t#*3eMW#Th< zSj#|xg6L;a?qVR_q*S#E(1!kbTU>NPOH!g^;Y>ll3dI;ON$?%z=^COXLn(9t8F zhtVqKY)52_VnznsjuN`p=EkyeZWw$bdpndgyLyA~Dq|TkDAP4{ts7g8GMg)8d_X&_ z#(zhK9Je&M8(TUM1o?_kKAa` zlhkM$32toMXA}sgF_G}UHW?T={_V#m`F98PzxLe!*n8(^en;{EAM*E21O)?8vTJ~7%Z(Wl*{)N@oQ52yen_W ziToU(weRnxlH@60{V77c3rJWoFnnhNOpOSy3-(6%9BW?y_W9R|F@H}m+S$?YedyYc z%4^6fCznSW#bol))w=?EAq`GO7T#9h<9C_DiKb)yHq})Iw^i)eisk%Kqk97xjj*A~ zC)P(rY%Fen2VXqyL&60l!6_6719~F5d{o}d_KWVy$6;xOigi=v<~~6Ym81Z?q)}O0 z9-GYu>A83++Me$*?xP)}xktEVTtMob*H~~+O$%GQ;4bQ^+MvyGgPxc5bP`K8vf(rJ znM)y#B@dFxYN2h@a|3gH)261cb4AMz9_l~7ug|-)OcT{sT0Q$Cov+?xRs|6ZBvpuK zu~_FrpPBhHG#%OZ=gjtGtwPnW=;}Xy-E+*8$il;vL~4S)RhRx~J?=fjJ|xK6Z7?4d z(fK{pm<2+q!yQ7}EQ>~#iiVdJ#>GO~?v6_}OIrIqFs>8lA#O+)^I5OUH}&g#ts6So z2!6BO^7~01fZ_qWTup*JX_ivEdziZy_3S1qdA%xnD8?Fzq(xl7Ze!@~%xUYLs|2Fe z45x|g4V#NXBXs5UvvS(DM)mVMlL(%R{Hx(`L8Kgj4|Oj}3A!y1M z4{KwPYcTx_)Mz9T!o;7&eTx=&^@CbMV&HO$rfg-b$MRs<8jL}2)-gjP|u4mj>;&=&z^J>Y^5CV+Hq<*gXe|=csCid@>+iUR-rx1V!)LWSZoJ$RKN0G6v+k{Q|zG*{~VgA;P{;qSHr)e`?W;}-#rQes_J9q zQEmG)KDQNem1^gVC75zkoqq};NnfUAn}=TM%>-~aNExdRYF=@S5v^IQYQ=O(YUIyy zvIOyv^aS$<-VQ>{%{}a8mw~Lvv0M!&qnyWTB1+_@Fr!C=wCoqT60x+d@+HjOQ8{qz zzCT~2i3}){wm-_N?L<<#(@c}1(yFrc-LFVP9Qc;(oy$5$Hl80({y>1_rn`X>HDmqN z2@X8V=$(^NG~C~h1t&bSW%uC9l&R6J5MpVUe@s1o)B~FAMr;H zB=$&HZoJJ=LEJM3;!Xh(Scd!!^Mr~%V2SwU=vbtg8|pc>mZDimv=}Amn21&#?9 zBP0c<^aGrorEdd~uI>s5x#(*5&G1pD`8+OAmS4B=v z5U*H5YJsTy4dB)PmW=_fDp$ZdeAfrqL;q7x#;5up4|qUxivO>T@ZX}`|JV#~xB!dX ze=P=FsVI=oW2iF9Y=Y=fm2BdDCk)EZ`fmul?pr;gnoVTz1}ND__(&`@bi?UR4Wk&* ziQ&7yKr3t+JIER9x*yVf&3M5VA>Ibnfd8wV>_{G?Km9oouyPR@Buo%t zr+UA1Lm|rPigu3Uw=xYToESqW!ygtAOO6|P==OY_aK0g_!#KQ=;WvIEdu~U+ts`9q zWkbH6r3CG6n}|>*Oa_P#SmnhxvVvS4rfFfXoEVy1D@MZ2m78vfA`i?0v<`$MeK8s} zr{7Ds4I+cG?XmePlY22AI!3r8an`gStW8~C60r7fN^U(K2{3f%E6#lT!q&u$jqK@u zK@lWZo^}?d0>rFq-6C@}IVvnAO%mZ*R5aMPW^rclRF7!;8hbkFCdrmPYROWTNy5ix z>%b7au~yjYbN!D~03z3RjnyZTZi!%c4LS?P+J8z2?7^N|fFCp!f zyCm>UQE|a*! zT|qNIkg}w2($;68b#t2K;SYNb&a2kbWFUW+sB)Dok4}rLLAJ^ipCZo4PSHpfy;1`5 z2?&7cGQC_UYDS`!zeU#<3HS`}R2pdnH8;vL#r~n|k>@bfSo{kV{&FLZXZA^n?1HJR zRodjn0)V(s?68o?0r|{>FHy^l`c~}}ml;<8{8noVXYX1Y^kGBpZ1T_iH7se8$JYb1 z=VxWp@=z=319bv8XDYEzvAgp19XT5BRDFxNwh&6^>4cddOc|F2Tnj1r#4~=%%5Sr^ z*D_es(!O-O%sexYu8v~&$?NnO7Z?VDxL4go!^R3`VI{MPgId&YUU?uw=9?o)Ldh*`;QrY0kwO%0gaX9rjvA&Mu`B0GXB*lfG zfYr&GK`I!wkGW1DUwf>hiaWq4j&FNk$_oET1hR{$Cz=E|jyF0{ZUct53oo1|n4abO z(_g~vy9{9=Qw#m<(kBdysGMRPZbc#PQGhl()*Ap%Fr|O@On#K{t%xZZ2`%!Y@;{KM zf`eOR?=+oK@wOgg)Ef4JIuW{^CZ}{Hd0%VO9;PJ3Kmk{R3j8y2%+}fE2y2_8ojtnP}~Ij~X=^ ztsk5~1f{~Jpb$ry6lh6Q#fBw)k*cCL?e`Rv=?DonJzLK>Pk@UwLDx&kN#2Kkc5DY| z*v9)X=Myp@pbgmH1t(p-@p3@TXcsv`q#=gZ z=sC&+m9jdqPmE`vMe;#hsj-UUp{yzzod4Ml{?GgWy}SRX#_nH|$bS-;^tAsaItJ+$ z083E*zuZ5L|Jv^pd1>apM1el*o`7KyOu($q5h=ds^tR8JDcw=L0GiC%J>Z{7JF-Ag zvJD05tpyLa5yN}-lAeI-TW#y++7Awl+`u~njSg$HW7430&5O0H{I?qMC!w!PP;7vp zJGRhC4?j3F1sNYNRw%yC} ztXHXAf4av?ROidR?H4F7A!?e3-o$q{U*w6L7E~;euF2pHA1qOYa8~>5nq`9@8Hz0Z zRBIdD)>AcUN8}|}Q!xBgD3T8KGN-@dGh_2)ETw34Fu5?Vh;p|8*to-PW@-xKD71%< zr#~fp*c*&A@Qve3x`dBc$f)7;75OM+j}#uE0;;a=T>N=ACu$iEj`CH_g%t-Nkp&*& z8St+Oz<(D@LHM#<=jmj`VL?eUp-9urS3|eI3jo~S#OEg419CJV0>Q0_SXVAliVn7SCU{%nMFH(ujnE&<{2-q!G0|<-A9e4dQO~6;i@Y9p2Y>lv; zqx@B+`DD_{30$Fwv|(SqB9muD`Oz?ht9Ck?5X7hMuDOjhXr3R(RV#FK17VUTyVI6r zR`C*mS5=|+`;^I7SH^s&i1t!r9F#|;cawEGNvGxB4^e} z87!?YjuiA`aDCD=Nm=#FQ^x7*URqbEC?@NZ<1ePJIL^5iw8@&HZV$z#(YWUIWt6oABii?dZ%ow_p$@KX}!o8z$Qc8$7* z{*FI)M8&11fi+W;OqBmH(%VH5Z850aMXPH8D~Y%2dyy)43-XTeKF_hpnkSOW9k8&h zophk@cL%OLjc$bJ5#*~x21vHKqrams+(+!<*6gaEA(ly?tHF27yfo{j9;PyGg@?+v zP6}>69Mg)^V|mSR@HwN2`3F9#i_TpGiwWQ21u{sYfdg zftv@@Y_WRxkdz2RKJDS!0_1K;mc3V+-rAM6wq8uVMNVG`goXxr1UOpX;Iv(zH6&Zo zqH~a7UQRL!llI1>2lEDxKAX%@DG^^D!3{RuC!B=%`wdhJM2=8QfNx8Ses}uZ=Q1xb zgrFqsE-Amg)3u@W(XV&g%-{n)dgJt+&Wo-}D5uuV7UKvjWrPFm*X*coR@XYgPOn-p z@_6ny#vE3k&J1t+WU0G7Ak$iXK_xDsj9jSvl2`&;@a6`-V`5;)9I;GKG@{H+g8G3r zeyQ40RMv|ERo10x7kOx9Qml;DrPd{AlT-r&c7uEhoj1yAYP`ZM#p=2n!XAS{UmQVa zyd*a+9iI;WcbC&91Cgp3zY7>PfhnEHmrnD5>=6wvxx+4 zQeT00(2wlFd)PtTS-DZ1@Bt7=_SsK3q@zmi1PYjVh;N<^qxRg%oC>q{uUJx(#m=%`34QsF z+0GV)=z$-U=>J5w48A@o-HEQ*R+AI7at!+k%mE@{+a}wCp6RS^iOOSjou;`C&mgKN z1r_B%8%~p%g0Ra`qbvRxpH%QM+CI2*pl<6b00=6uvHLgYEclrFM6)uKa(=JQ?QtE^XLAOyxfA*;miUu zw!yxyav9KM;Q*%j?nfE{?`QBnymFP<|#ZzoTj}5(%(c+c>c*x zGvLPL&RNL&_Gctaq<$D=<)=^nY9%82-pswOGbibZ+tbPIaCqnZObDH6wmEt=c&3NBN8U(2LGAZ8XC&Px>8Na_d;Cth7kq40K0Fo=4Ub>ZO z6KiT1(L^U(Un6D{j!}p{u&*?UF`_$S%uMpLZQd$(lb*>AYeX1oHQEt7=)6K z8;}819qpT5y8Lfh#zzXANCk>*=+ckI*HymS(Ds#n>n4vofSJiYoB|NO4H8L7?z>)* zv}y-{6E4uEZ12MDhb<{0%v=|Ldztn)r~&!oSJYae>>tvxYg5di1mmrj))RA2 zs{`yBmD@u|y#3$QMBK*hP@YmP?soKwO|erC$e&;eo0u+akgL{8_YYYeNJg^=3fac_ z@JVAs{gXH;NpuO-vpOyQ<08JjlARHzb zOL8mJ9`MZwvF&J*$XIJ-&kc2ySCUXs^#?EpKYvDX{;-}#3NX*K@B&iiP~@VCLY!#7 z{-*#&YiR)8Deq#%TlaAJ4{t~X-P8L*tEOq$o+ad}=zP6Xd)Wk{;}@{bQO ziA{omIw^rG(OTw5+ZhZcFYb75KVAaTM6ybHk9!m1aoA94U>P(QXqXVR5cD6$Gp!XH z4Nytl3a+r|an0s9&`(mJB@UGo5M1Bhx$B70+gq!A)RlRN5!pkhF1%>wg>J#LKBNdJ zxXAF3z#dyq(o>LdWk|FgPTWR(lY6iGBeu9CF=%r}nu2meI}`GCDOA=S7tGM_829kL zAusobmGRl|dzhNQr@!=TD!F@y*%BAcAMdezP629*Bia-Z_OE7iPUp=W7W{(Y{;7QJ zuHsZ@}fu|9c_pzZ~ZOcAEcxjl^gH z@nj#+-(NWY(f|E-NBHm2u&d@Ap*8d$b{1$0LWGEb(C5?L;rl}Pm$9ZEiJ*cu4b0*8galBIhS3T5( z!j@3?-Z;NrIIO%#3D$dh#Y7$$i!TJvYlK}%BSl(KEL%hSHqGR4qciZO#=HatiP9)<8EI&qT?Tt`$`JUXG znH7#aK>fL3Mw@=hzSZ2{=`CSFeq{0~x3l2`SDhKvuN&xx?AL5{U)*R`oaCSGaC_o> z5*k#j*dwyk$3>N=pb43(vdZ-ZTx8Y0Su%P^V*lf4Yx>Kde~ z6?=w)h4s`0_n1r1z{|*xa@g*-br@N#ds)eX)3PwR)A4v?X1_Y4ugbW~e^k|y zz&gLw%s;cFR0PHDO1`i^pImPuCKLp~ANt3YouQIzhDRUboz!bpo)q3?a-IDQ=?o;o zJDc%4?E7>hPH1TLJ{eR~_^s&h6tGC?osCw>`=QnQ<+wSWlChx=4TBG(AVP=);cP1z z9?qTTtUr$mvJ7^dM8)Udgo$KQm6dE%v)wd+sm%Eo1a_Zf(%f-Ev)@KJQ+pjSmG%|$ z5GV4Dr@W5WSSu!D7c0XI@TTM#NY#yyBddOHzQG^oVvolxmyug5pNs8L`#^bVOcd7N zyDlFC%$a_LZj$;7T`HUAB>n}`2W3EFG8%7eG~0g!U4F!SE8T(Q*awY4TCAU{pw{dcq92bjDI?!urSlR(8wM%ljj_Yds1jt zSpO=YvGqb5rC$HUW0+wN*9kXfZ%p`%z%58l)-AO3`S)N@O+tY(62yjjN7C99y)P4H z74*Lx9@WIkvuc>*q@@H?yxU2su`%zru<-YDKSwD1_kOpFV3GzZH$4R!)6#EHFmyP? z<)*q`+t%{|i1PKk`c5D$%5SZiIivydhxToil@=uOz(T;!PPLNesc3v0WJ~C+q>w0edon3yJw9yT(_8OiI8Sn=) zESvM}Q58w-oSzvknBU)vn`389xq$REnCxA8{_Y1Sf&w-22@h3%Rt=Apx>i(`xz$_f z!p*O18#!M>hNLxqNj%~E``GrN`fDx`n#%Fy@mh%!8&llC*8+ym11>Y9y7J!G1Gcr2 z;&z7qnGM;a9I~~=uj3>Z!}QDd*^%E^T4P{eL^7|J@2WK_K9>YaW4CwMD)btB+>*%E_e_avi&HN<&j^ru*S9wh3e>m~{ zPp6>&-`}IeWxOuqIA5#UmEE>dJsA`e3;yWmBWeXSMSfP)2oEE_Eq*D_>k64-km=sp z5#2TV{F<)+_skjI^l1NmO1&3M(xuhU!}u)uY$$DmROeOQHxx^WqG~)^h4Xm!?{YfCoyRtlw;X-I@m?UL$a&?@#X(-vO`i#A1vIixZ2l<0SKU|wjn4VUo*OH3 z=nI6d1S%5$aeaMLJbhB=U6YW;w}DKRcE=L11>X0#{}%IoEWPlqR5jfT`>9}>%dEk! z9@~_N^ zeg%^*uev5W4dOh&q?7ikz6yHmub|hmwj75Gv#5zo&s7vfx5-1Hxf3zg$dc+YQO{We zn`9QR7wVa`2oSEOUZl&Y(x0MJi@7o?yN?542-M@C`r(tMvrA1TgsG+L(kU&njekg5 zW%&s^>ir)RdJw3+`U0Aj&W}UzZ}^8`%Z$C)%#tTHAnUSpJ9NyXboy~YK;-5HD@Og5drB~5LoQradVxj7W;+_bJj2?5-x7jtV%hL)cmMj; z9viDXV<6G4U9BVQJT543&Gk!(#o|@jZeK<-Kc;)$`AwVo`Alx%g(^ojxUFn zlg{$guug2&YC_)NtCCy=Y)-v8ed=TjF2CKA@q$U9?l*--)ecwQWjsB{dnv?nf7z1J za@teRmrf0*7P0uYK;Lw;DvLUXg(L3zy2S&+`65sW_F(6r2Az$%OK(gIx8KJ`f*}Sr z*t;l`oA_n=O&48$5}#c5@8R}6ttIvCW$L0OA&HiLuP234yoTUEr8yV9t-kV|& zr49DroB*J_dZEr4$#Y{TvBOWj&Eq0N0I~Mr*XHX8*I_ksM;KvbsMQ^C7oM3guhLXp z=_k7^!kO);2ih4%rZ$-j;xfg4c9&*S!a5^I+thg1*Uc?TdJDQmN#`lfa~t0*FLAvq z)cB>NoQJdSMK7&5yoO`P)1H-EsLpAuES(Cv7LE!xJlHi!r%{lu#Y{GCl zgUZ>uy7Cj-B;K&SAg4N=i#-x~wy<~-!3GfLk(-TS(d10$qq9k;OHPh~6gH}z@ zMrzoETA7NlhiM4%@TbkkQZfbZkN0fW%6#1D7_;tw9j{>vSrT9pvva0AU`41{+bi^9 zU^vEIfdz-PhGe6?!NJaTDHBG(y(@*k6IZP^W6-c^xL1+-k>n8b&2BH?G_U~rDW9Oc zD#s1DTcpKf_{{)NvzzNEHPa#5x^0_HMQf~KL`70Hh8@tAJue4P}%|ZI$nvFb)k2V8WXPn?&COQ z1F)9=cp}}t5+oU$Kc}Jr0@&dBa~dEhCp(mDBa>B8;_trC#NTZ2_}u_kT%;H^KW zS9Auu2|w1#?l*ro^QJ(WS*$rDyUOZBWJO`+Pf#qsrM1bu#CdzU{0hfibqArg_mA># zR?ih;Ke^vgWIKAcq0v96_{!7ziNY;)D-@JHTbW)Z?UXD!6q!O;$nGB3y z0q5Aw#G$bz>JRR0ALdegxNvei1PpCV1n`pG@q~?3sRYw`|FT|cvE6TM6D1+8`}~<^ zNW>)d^0p0M)>mv!!~4>w#eQBDOcOuY-NcBR9R)|R)nfI@QIlbvUR5EYH~i2Ms*xV@ z;HMW{c<-bGCG>;MO$#dm*!*r?puKdgMF#lB4(GXzpIoPf1K`(<-@5r`t{_v!)lqsV z@uo{wtSZSJdDZRbIY#b^+Ts0NhRF9ufq+}3&@}K2ab;@pe=;+wjUN#z3&D|kn_hV0a-*^JQ9_0nE0 z@rlMRAH<7K>_o^T3)1QB#2Zq$R6n??e~zXUuHNr%+mGJW&lRCZ8RYX+P=$Jib*%XV z)mK#MlWl*3DQo@c3$eurn#t5(dpsnW>AzGuqMg#PImbr5kg*EyB9<=cHc7;IrHmlf zA;J!vrant61=xw1RmHd2QI(4ecmD!8sbs#@oNS=5_3Qj0gBTY}qtzO*p*Erp7^7P- z>EL=NtP3<&9L~$%B8%=udly}6t9X0Bpt-s9`g7*et5YOsEN)(lBb0X4l&hio<$yag zCdZ|+$lB6}&{NEspr@t$4X2?+*1 zxb1sY4IInF#rD;3S@5}@v%*rt*-4uV8TLSk5hGV~naANACJY6%ClwqgPiBO~hz{*P z2;LtbeI75wR{8VkQj{c=C^zQn4D&(o>WM{9w{uP5?Lf;(JAj4TeE_Io-s3)s!Snli z`2}Wn4ZrvuXzX2HJfd3>`P~=@xYMZ=3={Aoav!rp*qm_cA3lE$8U*PRvKCDqh=tGI zXStl->!0I9@2I})g8w{X?vGNCeKiCpUY0jb^)Lq-&;x%E@#{MuD3FI5>`P)v4mCOr9mOi5<^*0)e&+ zSL(+J-J09SN!&X#ESj!LyA?@vN{P}i?_+y>@m`xv5gcCmsn|b?9qeJqPVmhi@Z9=& z_^|OA__k5^`YC0)79)&rPkCLQg*n5Q@e`Au}Z>E3a5L8$FHp}5-3v~60V=swn zORL8)YjF8p?CWHPc>jV{&+HYi7xrQBI_j#`2pvfL7cHvKzJ|>k(>|5Iq$!t<+^)5$ z->leSAKKmlv%f`+M=QPRg(A#IO={c5sARGLewb{cWN+2C=aBilYcx8bgK)>}=m|0F z^%r(C*e|!NqH@0<1pPS(0`Li-WXCMWT>kb8lxGhONN`+fT)hS{S_2%iT*Ol7x7)Gb zfv`!UQ~JxS`R@iKBjfKv{{o%;Ap!%sHI<*PhjVXnhnb{0yi@c;Wb`1Lm$4dy3@W4m z3@DnnqUALpcbf%dZ~q!!Q2gV0#sWY+2Ow^g9R6<|i5u6%v5@KkxH-NQ!Z5QYHZpp~ zyJ+0JWS(;M2VKx2VuKS{RBay7%~)h;=J*T5yH;9DZZjTXbApC5V=?e?YEF*Cx~$mR ztd_|S)jzFU2s4q)mfG&^UN_DAutR5L3(%|oR0>$}I1kyFT4O_>^x*pH!9s{b)*F8W z>XMckoPeUU`0Hw$yNtspMLG*hinW!OvuOZX6)OZSvRO=1G>FlzsyQ!)tZ6X^TB5oP zX4sc!pvr9-EZKE6l>5!gD9~BAw}{|=TV{q)mBW;8iHEs_KmJLE7JnSeQbUm`VbLRR z?omoA<4G<>ZlGm4uK-so#aoN(foi53w{A+IPFw<(`ZqrdKZ?(Q;pG?CbcB8kn;1@eXFMDy!;0~S^@r)gndz#Li<~TX!m3qIW@Dw z_NLa2@M5$Cd3(P0H6hBr$i!0ZQIL^gI^jcSnd1o!UtgnFyFSrjdP;$!*EQ!zzz3tt z3@DaTyxpSJnIjso7n}8Egd&>NS^=S#oARs_5rNOEydEXB3>uC$Jf&G_xyuUgYGMz3 z_R;3GvP=NeinJ776}>~kSekh@@j-X1$k+ud-0?<4--qf_)}c?7Gw@WR`(9RAOTtdK zwYl|@)->e?bNK#BJX^~cZ#sS%L$W?S;rZyDG{SJ8nNF6W(_yS4Bol2SG|jYQ%eT!7 zv?)-1xF$~35(u$HhPDI8-kh#tkmR3ecN&L3b#J=*iWR-<($jsE?7F$9%Uv$+N~tDV zjD^ZDw;~dMs4}`#?l#fj!_(|;dv%Feh^`0UZLZeVjUmu@PrH6BDyJ3!P9lIRIzI2h zbZpzDh32l>T7xRSZcyT0hg}0$Yp)6OD0H~{ys}W1WzMw3W*W$|+rTtCP<)Uzx`=u; zh+jHeFD+b1)3$iG*mQIiIe%R*L6&>5IiK8`WVQs(QE9sU!#q}-B1|B< z(tS!m;$&dLxtUlF;9)% zL=0LOMp>b`GNJ^%kBePyie4sZ&8>W%= z3`Nv9!3I}!BcyGyWi}(n`&jn2VwW{=XIY+|Ecau zgPKaVaM%PH(9sF|rtE_3Fvt$WBy1vt-LT0Jkwrkn2%;>`C^`W|_JG3{wy*?22p|X< zbp&w?7?1>z1ThMP5Fi2u28gennt4^P>iv0tUcL9{R^LwF?&`j`&Pn(A&iARSSRLAI zorQC`!F_9K^^fv3?wae&79m|UPTjjTXRq>oRD~t6H(M?3?Bub}|a9ruQpLTqHQWo;6`of6NC6Xv%wMVVfM z($jS>^RkOs2)et8e%g5|y|qMnpEw^K)rrbWDB5L7tiQ>%bP>~NlyQ!7)-t1mJODdE z#es3euq2_!8fd`W386WC$-i9HC$k`*7nDF5W;_J{zUF8e9l>_aO9hft|>yX-Y>Bb-vKtj6I1aOmpMU)Xu zSrC7*;}B=!<)rBjiMsN7AlAp9*RaAQKs*+_tzYC^9Fii`FLIKf3T9~QbX<~a^wU}~ z3ZB3B)<55H64^kAbZe*{u@i^9e>|iVl_cJrYIx^60sP^Gq!dWk>biVbepQqWtKwY0 zpw3oz$K?T|>mvR!PhZv>^`$H@{w$6M%V8zt~+;3~S zhti)r@au`DDqB1iSM90;jzfF=qUXt>e7hkk=9s{8%xB0E63|!8+Iqvc%>`B0$qu}z z0yGX&rN)<+AwWI%-7G-_YnJfaBXJp)#Lo~HsG!I`kR^CSq*mI-a{ifeDuoVyef| z)^-7G$I8ZTh2~xJ31CCnEoqAcgSVj6y77AFHHgBNRf8MfhA%mBsY`7jAWP9OTEtzK zz*k_j1^4qgD0;fg7)D#DgnE^xmcU!YWvJg;r4mVWD8l|5vw+T>r);oF6RcE`OPBXR z6jy%;h`nF_@@#Ys1qSggSoQHv9fwJ|ov|oS+za$CV*klC3>NTLAfX1vzT?4ykr<#i z$`}jC)^_fYil9F2_x$=rLNFL@$FFjGW6DWOV1X>?j)ZV`9v*l1c2hFA*CQaiahQEU zuI*A#Pq9AH&E}YC%(3bN(Ib!eI@-;S7JH5>Wgm$88;FxmR%l-C7@iD+N)UE^RVgq* z%{vVtVER+mDrtQxl6#vtjBrX?Ie4|7Aw>xc;~fHM`Z33CFQI8|Z%MlfR=-13f_e&# zRl=mc#24!S3PgLI0fA-be}l{YSNc*gyZ@w(lz|o1v@)3jGc`^BJS8?fz(q609NWxB z$js(R)V$wdOgwVjPj)h!R?e0IqIx*&==Wo`N91mw4ytTy?Hcm#An63$x2+#Y&fNUz zy^&OR_`74V3F{R$i$aTao>Oy7pHUdvy zCkw&Na<~-KLbktu?e0m#IY;^V`^UpyU-a2*GTb`*uHXVamvFSAieXzkXYz>ZyO7oJ zepR!LW7_R2R8eF)?e-w4QSQ{vGumO4X!MhwiMaXjb>)~q{vj5s;3m`TvcbUzdmpOc zA}uAxhU#UE2Uq;%%ya{?!p8734D7{yB9QY+F4Zb2_?fM;fInPppiZS4PfXn5Lkv&&SpONWmsm9ViP9)?$-Uv&a1*K(O@0@=Ul~a~rE=*;o>C zu^Sn1+}U-c_|>yt2q~_SF{&9b-+?v!wYe+xH?Fh?mp8HvS9A$IYxgo{HBj{A2rJFmk2_j---<&@$PLGDnMJ>W7l-kpqf9S%2j$sI`Th(= zz4jXZ&?RXaBxHXuVjEC@UH>qTMe*u|ckpzCt~flpN|WwRN5s{jA#S}n6Vl+QPq+{K z1S&NDE;t`vsX@a4dzb)F;`Ir{)9wFfE52rQOWo$If3e1Y@3r>Nofd0%T-HT5XaH+$ zA!^?8@_7IzA`9>O(t!oi=^6KUc|Z&|oNgYnfv}h7KCym8{kG0Le?eRl>M2q#gUmOF zz)9s%F(K*|R+>j;)^V6K$zA=--xuSt;2#>2RJTRtFVQ3t@+N^nx-$ElByz38um^pD z6Eu6{8UpW>EHfG*w*ok6lu25*_23z2` z>v()>N%5$1C&JljKl3w0I%LM=Z2Kr7K|Tp{Uk~-7>r`qat~S+uc;IMse&BXmn2_ww z#1r;3ar6DNoSCc*klF056Tk>{`V27`KeXjnQkiJDy`seLL^!B1+gbrz0ovIvAH6^L10>vy0}Q%@4_-j~~XF z5s&9Pt0`~K$^m0~FjiV3B~8kv;?};oQSgljP@^o>bwuszE>U|=>Sm|wXje&UpGTym z>*Nu<@ULhaI80re;$VMW4FH-M?KTfz zbHHg;484pSC`6o;FsfBQ_p`#shV*lIm1}$-g#G?cp$2#72}m~`!{0J7+VYkJ<&Po8 zQ?2zQTbvI9IG~ykOq#5j5+?s`ehuN=R*0wv&64W3#sulwzCCSL%TaP&cJ z7*FKvEc}K_Ap(Y!BQHs}|58r;J=(9a00#Xnk>SGZCCe1Wxbn6{idtHlh%D+rH`1t z?@D_SFhQ+|6L_Ayc9m$ed>RvYKw+R{fH{_dqJR-0e_pZs+~rIWUIGPhcaV|Y-9A0=f|PXGV_ literal 0 HcmV?d00001 -- 2.39.5 From 005dbdebec65df4111c166e2f9b8ddff7237a6e6 Mon Sep 17 00:00:00 2001 From: Frank Noirot Date: Tue, 6 Jul 2021 10:19:33 -0400 Subject: [PATCH 4/5] Wording tweak from 'we believe' to question --- docs/blog/2021-07-04-ux-case-studies-intro.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/blog/2021-07-04-ux-case-studies-intro.mdx b/docs/blog/2021-07-04-ux-case-studies-intro.mdx index 3176b78..2a56c7c 100644 --- a/docs/blog/2021-07-04-ux-case-studies-intro.mdx +++ b/docs/blog/2021-07-04-ux-case-studies-intro.mdx @@ -18,11 +18,11 @@ I'm helping CadHub out by designing the interfaces for the [new editor](https:// ## Why GUIs aren't enough anymore -As others like [Jessie Frazelle](https://medium.com/embedded-ventures/mechanical-cad-yesterday-today-and-tomorrow-981cef7e06b1) have pointed out, the history of CAD software has been focused primarily on using software to emulate the frictionless user experiences of sketching and modelling by hand. That paradigm lead most of the major tools to build GUI-based systems, because the GUI offered a interface that could be understood by most people. We believe that this assumption about users has fundamentally changed. +As others like [Jessie Frazelle](https://medium.com/embedded-ventures/mechanical-cad-yesterday-today-and-tomorrow-981cef7e06b1) have pointed out, the history of CAD software has been focused primarily on using software to emulate the frictionless user experiences of sketching and modelling by hand. That paradigm lead most of the major tools to build GUI-based systems, as they correctly assumed at the the time that the GUI offered an interface that could be understood by people in the industry. Decades have passed and the same assumption still forms the foundation of the paradigm, but could these assumptions have fundamentally changed? Ivan Sutherland's Sketchpad program from the 1960's, a man using a pen-like tool on a screen to manipulate a 2D model, considered the first CAD program. -It's hard to understate how much of a change that web development has brought to technical culture. In the past decade the web technologies of HTML, CSS, and especially JavaScript have trained a large part of technical workers to think not in terms of software packages, but in terms of the technologies and languages that are used to construct them, because as a culture we have become accustomed to the idea that there is always an API powering whatever tool we're using. Technical users of course still want seamless GUI user experiences on platforms, but increasingly they also want the ability to get under the hood and use the APIs that power whatever tool or platform they're on. This trend is evident in the rise of API-first services like [Stripe](https://stripe.com) and monolith-fracturing trends like [JAMstack web development](https://jamstack.org). +It's hard to understate how much of a sea change web development has brought to technical culture. In the past decade the web technologies of HTML, CSS, and especially JavaScript have trained a large part of technical workers to think not in terms of software packages, but in terms of the technologies and languages that are used to construct them, because as a culture we have become accustomed to the idea that there is always an API powering whatever tool we're using. Technical users of course still want seamless GUI user experiences on platforms, but increasingly they also want the ability to get under the hood and use the APIs that power whatever tool or platform they're on. This trend is evident in the rise of API-first services like [Stripe](https://stripe.com) and monolith-fracturing trends like [JAMstack web development](https://jamstack.org). With Code-CAD, we are putting a spotlight on this sea change in user expectations, and putting out a call to action for people to start creating experiences for this web-native, language-comfortable audience of CAD users. With CadHub, we're building a showcase for the great Code-CAD packages like [CadQuery](https://cadquery.readthedocs.io/en/latest/) and [OpenSCAD](https://openscad.org/) that have been under development by early adopters for years. -- 2.39.5 From 9ab234f6d15cb1a803f5fa46c5939267b9df5d1f Mon Sep 17 00:00:00 2001 From: Frank Noirot Date: Sun, 11 Jul 2021 17:40:23 -0400 Subject: [PATCH 5/5] Lengthened end paragraph with "stay tuned" message. --- docs/blog/2021-07-04-ux-case-studies-intro.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/blog/2021-07-04-ux-case-studies-intro.mdx b/docs/blog/2021-07-04-ux-case-studies-intro.mdx index 2a56c7c..9021d75 100644 --- a/docs/blog/2021-07-04-ux-case-studies-intro.mdx +++ b/docs/blog/2021-07-04-ux-case-studies-intro.mdx @@ -1,5 +1,5 @@ --- -slug: ux-study-timeline +slug: ux-studies-intro title: "GUI-CAD UX studies: introduction" author: Frank Noirot author_title: CadHub Core Team @@ -40,4 +40,4 @@ I'll try to explore that design space with a few brief case studies on UX that I But I want to mention that work is already being done on this front. Jeremy Wright of the CadQuery team is building [Semblage](https://semblage.7bindustries.com/en/latest/), a GUI-code hybrid built with CadQuery and the Godot gaming engine. [BuildBee](https://makecode.buildbee.com/) lets users switch between Scratch-like block interface and JavaScript code for making models. Blender provides an [excellent Python API](https://docs.blender.org/api/current/index.html) for almost all of its incredible functionality, and there a dozen other projects pushing things forward while we look to the present and the past for more inspiration. -Our first stop will be the timeline feature of AutoDesk Fusion360, which is a clever way to make the order of operations in modelling intuitive. \ No newline at end of file +Our first stop will be the timeline feature of AutoDesk Fusion360, which is a clever way to make the order of operations in modelling intuitive. Stay tuned for this post and more in the coming weeks, check out our work on [GitHub](https://github.com/Irev-Dev/cadhub/discussions/404) and [Figma](https://www.figma.com/file/VUh53RdncjZ7NuFYj0RGB9/?node-id=633%3A0), sign up for [Kurt's newsletter](https://kurthutten.com/), and join [our Discord](https://discord.gg/sFYJyEJ6) to get plugged into our ongoing discussions about the future of Code-CAD. \ No newline at end of file -- 2.39.5